gamma-app-controller 1.1.22 → 1.1.24

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.
Files changed (27) hide show
  1. package/esm2020/lib/application-controller/application-content.service.mjs +12 -12
  2. package/esm2020/lib/application-controller/application-controller.module.mjs +6 -6
  3. package/esm2020/lib/gamma-app-controller.module.mjs +4 -128
  4. package/esm2020/lib/template-module/cdrConfigModule/cdr-browser.service.mjs +132 -0
  5. package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +237 -0
  6. package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +144 -0
  7. package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +357 -0
  8. package/esm2020/lib/template-module/exceptionConfigModule/exception-service.mjs +98 -0
  9. package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +146 -0
  10. package/esm2020/public-api.mjs +5 -3
  11. package/fesm2015/gamma-app-controller.mjs +4052 -3680
  12. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  13. package/fesm2020/gamma-app-controller.mjs +3778 -3410
  14. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  15. package/lib/application-controller/application-content.service.d.ts +10 -5
  16. package/lib/application-controller/application-controller.module.d.ts +45 -46
  17. package/lib/gamma-app-controller.module.d.ts +4 -13
  18. package/lib/template-module/cdrConfigModule/cdr-browser.service.d.ts +36 -0
  19. package/lib/{application-controller/page-templates/cdr-config → template-module/cdrConfigModule}/cdr-config.component.d.ts +3 -3
  20. package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +16 -0
  21. package/lib/{application-controller/page-module/exception-operation → template-module/exceptionConfigModule}/exception-operation.component.d.ts +3 -3
  22. package/lib/template-module/exceptionConfigModule/exception-service.d.ts +26 -0
  23. package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +16 -0
  24. package/package.json +1 -1
  25. package/public-api.d.ts +4 -2
  26. package/esm2020/lib/application-controller/page-module/exception-operation/exception-operation.component.mjs +0 -357
  27. package/esm2020/lib/application-controller/page-templates/cdr-config/cdr-config.component.mjs +0 -237
@@ -1,237 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { confirm } from 'devextreme/ui/dialog';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../application-content.service";
5
- import * as i2 from "ngx-toastr";
6
- import * as i3 from "../../common";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "devextreme-angular/core";
9
- import * as i6 from "devextreme-angular/ui/nested";
10
- import * as i7 from "devextreme-angular/ui/check-box";
11
- import * as i8 from "devextreme-angular/ui/data-grid";
12
- import * as i9 from "devextreme-angular/ui/select-box";
13
- import * as i10 from "devextreme-angular/ui/tag-box";
14
- import * as i11 from "devextreme-angular/ui/text-box";
15
- import * as i12 from "@angular/forms";
16
- import * as i13 from "@angular/material/icon";
17
- import * as i14 from "../../shared/loading/loading.component";
18
- export class CdrConfigComponent {
19
- constructor(service, toastr, commonService) {
20
- this.service = service;
21
- this.toastr = toastr;
22
- this.commonService = commonService;
23
- this.availableTableDatasource = [];
24
- this.submitObject = {};
25
- this.selectedColumnDatasource = [];
26
- this.kpi_enrichment_name = [];
27
- this.CdrBrowserAllowedDatasource = [];
28
- this.selectedColumnName = [];
29
- this.isCdrConfigCreate = false;
30
- this.isEditDatasource = false;
31
- this.filter_type = ['date', 'string', 'timestamp', 'int', 'double', 'boolean'];
32
- }
33
- ngOnInit() {
34
- this.getAvailableTabeName();
35
- this.getFilterDataSet();
36
- this.getCdrBrowserAllowedOperation();
37
- this.searchDatasourceDetails();
38
- }
39
- getFilterDataSet() {
40
- this.kpi_enrichment_name = [];
41
- this.service.getKPIReferenceEndPoints().subscribe({
42
- next: (data) => {
43
- data.forEach(element => {
44
- this.kpi_enrichment_name.push(element);
45
- });
46
- }, error: (err) => {
47
- this.toastr.error("Unexpected Server Exception. Please contact System Admin.", "CDR Config");
48
- }
49
- });
50
- }
51
- searchDatasourceDetails() {
52
- this.cdrTableDataSource = {};
53
- this.allTablsDropDownData = [];
54
- this.service.getSearchDatasourceDetails().subscribe({
55
- next: (data) => {
56
- this.cdrTableDataSource = data;
57
- this.allTablsDropDownData = Object.keys(data).map(key => ({
58
- name: key,
59
- ...data[key]
60
- }));
61
- }, error: (err) => {
62
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
63
- }
64
- });
65
- }
66
- getCdrBrowserAllowedOperation() {
67
- this.service.getCdrBrowserOperations().subscribe(data => {
68
- this.CdrBrowserAllowedDatasource = data;
69
- });
70
- }
71
- getAvailableTabeName() {
72
- this.availableTableDatasource = [];
73
- this.service.getAvailableTables().subscribe({
74
- next: (data) => {
75
- this.availableTableDatasource = data;
76
- }, error: (err) => {
77
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
78
- }
79
- });
80
- }
81
- getSelectedTableMetaData(e) {
82
- if (e.value) {
83
- this.isProceed = false;
84
- this.isTableSelected = false;
85
- let tableName = e.value;
86
- this.listOfColumns = [];
87
- this.service.getTableMetadata(tableName).subscribe({
88
- next: (data) => {
89
- this.isTableSelected = true;
90
- this.listOfColumns = data;
91
- }, error: (err) => {
92
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
93
- }
94
- });
95
- }
96
- }
97
- getSelectedColumnSource(e) {
98
- this.selectedColumnDatasource = e.value;
99
- }
100
- getProcessForConfig() {
101
- const filteredColumns = this.listOfColumns.filter(column => this.selectedColumnDatasource.includes(column.fieldName));
102
- const columnDefList = [];
103
- filteredColumns.forEach(element => {
104
- const existingColumn = (this.submitObject['columnDefList']) ? this.submitObject['columnDefList'].find(col => col.columnName === element.fieldName) : false;
105
- if (!existingColumn) {
106
- let obj = {
107
- "columnName": element.fieldName,
108
- "containerType": "",
109
- "datatype": "",
110
- "allowedOperations": [],
111
- "lookupName": ""
112
- };
113
- columnDefList.push(obj);
114
- }
115
- });
116
- if (this.submitObject['columnDefList'] && this.submitObject['columnDefList'].length !== 0) {
117
- this.submitObject['columnDefList'] = [...this.submitObject['columnDefList'], ...columnDefList];
118
- }
119
- else {
120
- this.submitObject['columnDefList'] = columnDefList;
121
- }
122
- this.isProceed = true;
123
- }
124
- submitDatasource() {
125
- this.loadingModal = true;
126
- this.service.saveDatasourceConfig(this.submitObject).subscribe({
127
- next: (data) => {
128
- this.submitObject['columnDefList'] = [];
129
- this.submitObject['active'] = false;
130
- this.submitObject['endDateFunction'] = "";
131
- this.submitObject['startDateFunction'] = "";
132
- this.submitObject['tableName'] = "";
133
- this.isProceed = false;
134
- this.loadingModal = false;
135
- this.isTableSelected = false;
136
- this.isEditDatasource = false;
137
- this.isCdrConfigCreate = false;
138
- this.searchDatasourceDetails();
139
- this.toastr.success('Config Created Successfully');
140
- }, error: (err) => {
141
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
142
- this.loadingModal = false;
143
- }
144
- });
145
- }
146
- editCdrConfigConfig(data) {
147
- this.isEditDatasource = true;
148
- this.loadingModal = true;
149
- this.isCdrConfigCreate = true;
150
- this.submitObject = data;
151
- this.service.getTableMetadata(this.submitObject.tableName).subscribe({
152
- next: (colData) => {
153
- this.isTableSelected = true;
154
- this.listOfColumns = colData;
155
- this.selectedColumnName = this.submitObject.columnDefList.map(item => item.columnName);
156
- this.isProceed = true;
157
- this.loadingModal = false;
158
- }, error: (err) => {
159
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
160
- }
161
- });
162
- }
163
- updateDatasource() {
164
- this.loadingModal = true;
165
- this.service.editDatasourceConfig(this.submitObject).subscribe({
166
- next: (data) => {
167
- this.submitObject['columnDefList'] = [];
168
- this.submitObject['active'] = false;
169
- this.submitObject['endDateFunction'] = "";
170
- this.submitObject['startDateFunction'] = "";
171
- this.submitObject['tableName'] = "";
172
- this.isProceed = false;
173
- this.loadingModal = false;
174
- this.isTableSelected = false;
175
- this.isEditDatasource = false;
176
- this.isCdrConfigCreate = false;
177
- this.searchDatasourceDetails();
178
- this.toastr.success('Config Update Successfully');
179
- }, error: (err) => {
180
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config');
181
- }
182
- });
183
- }
184
- deleteCdrConfig(data) {
185
- let result = confirm("<i>Are You Sure?</i>", "Delete Config");
186
- result.then((dialogResult) => {
187
- if (dialogResult) {
188
- this.loadingModal = true;
189
- this.service.deleteDatasourceConfig(data.tableName).subscribe({
190
- next: (data) => {
191
- this.searchDatasourceDetails();
192
- this.toastr.success('Config Deleted Successfully');
193
- this.loadingModal = false;
194
- }, error: (err) => {
195
- this.loadingModal = false;
196
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config Delete');
197
- }
198
- });
199
- }
200
- });
201
- }
202
- createCDRConfig() {
203
- this.isCdrConfigCreate = true;
204
- }
205
- cancelCdrConfig() {
206
- this.isCdrConfigCreate = false;
207
- this.submitObject['columnDefList'] = [];
208
- this.submitObject['active'] = false;
209
- this.submitObject['endDateFunction'] = "";
210
- this.submitObject['startDateFunction'] = "";
211
- this.submitObject['tableName'] = "";
212
- this.isProceed = false;
213
- this.loadingModal = false;
214
- this.isTableSelected = false;
215
- this.isEditDatasource = false;
216
- }
217
- deleteColume(i) {
218
- this.submitObject.columnDefList.splice(i, 1);
219
- }
220
- moveItemForColumns(index, direction) {
221
- if (index < 0 || index >= this.submitObject.columnDefList.length)
222
- return;
223
- const newPosition = direction === 'up' ? index - 1 : index + 1;
224
- if (newPosition < 0 || newPosition >= this.submitObject.columnDefList.length)
225
- return;
226
- const itemToMove = this.submitObject.columnDefList[index];
227
- this.submitObject.columnDefList.splice(index, 1);
228
- this.submitObject.columnDefList.splice(newPosition, 0, itemToMove);
229
- }
230
- }
231
- CdrConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CdrConfigComponent, deps: [{ token: i1.ApplicationContentService }, { token: i2.ToastrService }, { token: i3.CommonService }], target: i0.ɵɵFactoryTarget.Component });
232
- CdrConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CdrConfigComponent, selector: "app-cdr-config", ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-col flex-auto min-w-0\">\n <!-- header start -->\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1 py-2\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-2 font-extrabold items-center ml-2 tracking-tight leading-5 truncate\">\n CDR Config Creation\n </h2>\n </div>\n\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createCDRConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-bar-chart-o mr-2\"></i> Table Configurations\n </h6>\n\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allTablsDropDownData\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"tableName\"></dxi-column>\n <dxi-column dataField=\"startDateFunction\"></dxi-column>\n <dxi-column dataField=\"endDateFunction\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editCdrConfigConfig(data.data)\">\n Edit\n </button>\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteCdrConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\"\n class=\"{{commonService.btnSuccessGreen}}\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\"\n class=\"{{commonService.btnWarningYellow}}\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isCdrConfigCreate\">\n <div class=\"m-2 py-3 border-b border-t\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-1/3 px-2\">\n <div class=\"text-md mb-2\">Select Table Name</div>\n <dx-select-box [items]=\"availableTableDatasource\" [(ngModel)]=\"submitObject.tableName\"\n (onValueChanged)=\"getSelectedTableMetaData($event)\"></dx-select-box>\n </div>\n <div class=\"w-1/3 px-2\" *ngIf=\"isTableSelected\">\n <div class=\"text-md mb-2\">Select Columns</div>\n\n <dx-tag-box [dataSource]=\"listOfColumns\" valueExpr=\"fieldName\" displayExpr=\"fieldName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedColumnName\"\n (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\" *ngIf=\"isTableSelected\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add Columns\n </button>\n <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\"\n (click)=\"cancelCdrConfig()\">Cancel\n </button>\n </div>\n </div>\n </div>\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of submitObject.columnDefList; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Column Name</div>\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Data Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"filter_type\"\n [(ngModel)]=\"item.datatype\"></dx-select-box>\n\n </div>\n\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Container Type</div>\n <dx-select-box [items]=\"['input','select','multiselect','date']\"\n [(ngModel)]=\"item.containerType\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Allowed Operations</div>\n <dx-tag-box [dataSource]=\"CdrBrowserAllowedDatasource\" valueExpr=\"value\" displayExpr=\"name\"\n [maxDisplayedTags]=\"3\" [multiline]=\"true\" [showSelectionControls]=\"true\"\n [(ngModel)]=\"item.allowedOperations\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Lookup Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\" valueExpr=\"apiUrl\"\n displayExpr=\"apiName\" [(ngModel)]=\"item.lookupName\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-8\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== submitObject.columnDefList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-8\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-8\" (click)=\"deleteColume(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n \n </div>\n </ng-container>\n </div>\n <div class=\"m-2\" *ngIf=\"isProceed\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/4\">\n <div class=\"text-md mb-2\">StartDate Function</div>\n <dx-select-box [items]=\"['subtract']\" [(ngModel)]=\"submitObject.startDateFunction\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"text-md mb-2\">EndDate Function</div>\n <dx-select-box [items]=\"['subtract']\" [(ngModel)]=\"submitObject.endDateFunction\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"mt-8\">\n <dx-check-box [(ngModel)]=\"submitObject.active\" text='Active'>\n </dx-check-box>\n </div>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"flex flex-row justify-end\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-6\" *ngIf=\"!isEditDatasource\"\n (click)=\"submitDatasource()\">Submit\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-6\" *ngIf=\"isEditDatasource\"\n (click)=\"updateDatasource()\">Update\n </button>\n\n </div>\n </div>\n </div>\n\n </div>\n </ng-container>\n\n</div>", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i6.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i7.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: i8.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i6.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i6.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i6.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i6.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i9.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: i10.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: i11.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: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i14.LoadingComponent, selector: "app-loading" }] });
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CdrConfigComponent, decorators: [{
234
- type: Component,
235
- args: [{ selector: 'app-cdr-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-col flex-auto min-w-0\">\n <!-- header start -->\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1 py-2\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-2 font-extrabold items-center ml-2 tracking-tight leading-5 truncate\">\n CDR Config Creation\n </h2>\n </div>\n\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createCDRConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-bar-chart-o mr-2\"></i> Table Configurations\n </h6>\n\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allTablsDropDownData\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"tableName\"></dxi-column>\n <dxi-column dataField=\"startDateFunction\"></dxi-column>\n <dxi-column dataField=\"endDateFunction\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editCdrConfigConfig(data.data)\">\n Edit\n </button>\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteCdrConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\"\n class=\"{{commonService.btnSuccessGreen}}\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\"\n class=\"{{commonService.btnWarningYellow}}\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isCdrConfigCreate\">\n <div class=\"m-2 py-3 border-b border-t\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-1/3 px-2\">\n <div class=\"text-md mb-2\">Select Table Name</div>\n <dx-select-box [items]=\"availableTableDatasource\" [(ngModel)]=\"submitObject.tableName\"\n (onValueChanged)=\"getSelectedTableMetaData($event)\"></dx-select-box>\n </div>\n <div class=\"w-1/3 px-2\" *ngIf=\"isTableSelected\">\n <div class=\"text-md mb-2\">Select Columns</div>\n\n <dx-tag-box [dataSource]=\"listOfColumns\" valueExpr=\"fieldName\" displayExpr=\"fieldName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedColumnName\"\n (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\" *ngIf=\"isTableSelected\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add Columns\n </button>\n <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\"\n (click)=\"cancelCdrConfig()\">Cancel\n </button>\n </div>\n </div>\n </div>\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of submitObject.columnDefList; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Column Name</div>\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Data Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"filter_type\"\n [(ngModel)]=\"item.datatype\"></dx-select-box>\n\n </div>\n\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Container Type</div>\n <dx-select-box [items]=\"['input','select','multiselect','date']\"\n [(ngModel)]=\"item.containerType\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Allowed Operations</div>\n <dx-tag-box [dataSource]=\"CdrBrowserAllowedDatasource\" valueExpr=\"value\" displayExpr=\"name\"\n [maxDisplayedTags]=\"3\" [multiline]=\"true\" [showSelectionControls]=\"true\"\n [(ngModel)]=\"item.allowedOperations\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\">Lookup Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\" valueExpr=\"apiUrl\"\n displayExpr=\"apiName\" [(ngModel)]=\"item.lookupName\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-8\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== submitObject.columnDefList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-8\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-8\" (click)=\"deleteColume(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n \n </div>\n </ng-container>\n </div>\n <div class=\"m-2\" *ngIf=\"isProceed\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/4\">\n <div class=\"text-md mb-2\">StartDate Function</div>\n <dx-select-box [items]=\"['subtract']\" [(ngModel)]=\"submitObject.startDateFunction\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"text-md mb-2\">EndDate Function</div>\n <dx-select-box [items]=\"['subtract']\" [(ngModel)]=\"submitObject.endDateFunction\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"mt-8\">\n <dx-check-box [(ngModel)]=\"submitObject.active\" text='Active'>\n </dx-check-box>\n </div>\n </div>\n <div class=\"mx-2 w-1/4\">\n <div class=\"flex flex-row justify-end\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-6\" *ngIf=\"!isEditDatasource\"\n (click)=\"submitDatasource()\">Submit\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-6\" *ngIf=\"isEditDatasource\"\n (click)=\"updateDatasource()\">Update\n </button>\n\n </div>\n </div>\n </div>\n\n </div>\n </ng-container>\n\n</div>" }]
236
- }], ctorParameters: function () { return [{ type: i1.ApplicationContentService }, { type: i2.ToastrService }, { type: i3.CommonService }]; } });
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RyLWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS10ZW1wbGF0ZXMvY2RyLWNvbmZpZy9jZHItY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9wYWdlLXRlbXBsYXRlcy9jZHItY29uZmlnL2Nkci1jb25maWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLGtCQUFrQjtJQXFCN0IsWUFBb0IsT0FBa0MsRUFBVSxNQUFxQixFQUFTLGFBQTRCO1FBQXRHLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBbkIxSCw2QkFBd0IsR0FBUSxFQUFFLENBQUM7UUFLbkMsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsNkJBQXdCLEdBQVEsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQ0FBMkIsR0FBUSxFQUFFLENBQUM7UUFJdEMsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBRTdCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVB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WSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7OytHQTVQVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixzRENWL0IsMitUQW1NTTsyRkR6TE8sa0JBQWtCO2tCQUo5QixTQUFTOytCQUNFLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnZGV2ZXh0cmVtZS91aS9kaWFsb2cnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNkci1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2RyLWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIENkckNvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgYXZhaWxhYmxlVGFibGVEYXRhc291cmNlOiBhbnkgPSBbXTtcbiAgc2VsZWN0ZWRUYWJsZU5hbWU6IGFueTtcbiAgaXNUYWJsZVNlbGVjdGVkOiBib29sZWFuO1xuICBpc1Byb2NlZWQ6IGJvb2xlYW47XG4gIGxpc3RPZkNvbHVtbnM6IGFueTtcbiAgc3VibWl0T2JqZWN0OiBhbnkgPSB7fTtcbiAgc2VsZWN0ZWRDb2x1bW5EYXRhc291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIENkckJyb3dzZXJBbGxvd2VkRGF0YXNvdXJjZTogYW55ID0gW107XG5cbiAgY2RyVGFibGVEYXRhU291cmNlOiBhbnk7XG4gIGFsbFRhYmxzRHJvcERvd25EYXRhOiBhbnk7XG4gIHNlbGVjdGVkQ29sdW1uTmFtZTogYW55ID0gW107XG5cbiAgaXNDZHJDb25maWdDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNFZGl0RGF0YXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJfdHlwZSA9IFsnZGF0ZScsICdzdHJpbmcnLCAndGltZXN0YW1wJywgJ2ludCcsICdkb3VibGUnLCAnYm9vbGVhbiddO1xuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UpIHtcblxuICB9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0QXZhaWxhYmxlVGFiZU5hbWUoKTtcbiAgICB0aGlzLmdldEZpbHRlckRhdGFTZXQoKTtcbiAgICB0aGlzLmdldENkckJyb3dzZXJBbGxvd2VkT3BlcmF0aW9uKCk7XG4gICAgdGhpcy5zZWFyY2hEYXRhc291cmNlRGV0YWlscygpO1xuXG4gIH1cblxuICBnZXRGaWx0ZXJEYXRhU2V0KCkge1xuICAgIHRoaXMua3BpX2VucmljaG1lbnRfbmFtZSA9IFtdO1xuICAgIHRoaXMuc2VydmljZS5nZXRLUElSZWZlcmVuY2VFbmRQb2ludHMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBkYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgdGhpcy5rcGlfZW5yaWNobWVudF9uYW1lLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlVuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLlwiLCBcIkNEUiBDb25maWdcIilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuXG4gIHNlYXJjaERhdGFzb3VyY2VEZXRhaWxzKCkge1xuICAgIHRoaXMuY2RyVGFibGVEYXRhU291cmNlID0ge307XG4gICAgdGhpcy5hbGxUYWJsc0Ryb3BEb3duRGF0YSA9IFtdO1xuICAgIHRoaXMuc2VydmljZS5nZXRTZWFyY2hEYXRhc291cmNlRGV0YWlscygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2RyVGFibGVEYXRhU291cmNlID0gZGF0YTtcblxuICAgICAgICB0aGlzLmFsbFRhYmxzRHJvcERvd25EYXRhID0gT2JqZWN0LmtleXMoZGF0YSkubWFwKGtleSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAuLi5kYXRhW2tleV1cbiAgICAgICAgfSkpO1xuXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ0RSIENvbmZpZycpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgZ2V0Q2RyQnJvd3NlckFsbG93ZWRPcGVyYXRpb24oKSB7XG5cbiAgICB0aGlzLnNlcnZpY2UuZ2V0Q2RyQnJvd3Nlck9wZXJhdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLkNkckJyb3dzZXJBbGxvd2VkRGF0YXNvdXJjZSA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGdldEF2YWlsYWJsZVRhYmVOYW1lKCkge1xuICAgIHRoaXMuYXZhaWxhYmxlVGFibGVEYXRhc291cmNlID0gW107XG4gICAgdGhpcy5zZXJ2aWNlLmdldEF2YWlsYWJsZVRhYmxlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlVGFibGVEYXRhc291cmNlID0gZGF0YTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDRFIgQ29uZmlnJyk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldFNlbGVjdGVkVGFibGVNZXRhRGF0YShlKSB7XG4gICAgaWYgKGUudmFsdWUpIHtcbiAgICAgIHRoaXMuaXNQcm9jZWVkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgbGV0IHRhYmxlTmFtZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmxpc3RPZkNvbHVtbnMgPSBbXTtcbiAgICAgIHRoaXMuc2VydmljZS5nZXRUYWJsZU1ldGFkYXRhKHRhYmxlTmFtZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmxpc3RPZkNvbHVtbnMgPSBkYXRhO1xuICAgICAgICAgIC8vIHRoaXMuYXZhaWxhYmxlVGFibGVEYXRhc291cmNlID0gZGF0YTtcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ0RSIENvbmZpZycpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdGVkQ29sdW1uU291cmNlKGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uRGF0YXNvdXJjZSA9IGUudmFsdWU7XG5cbiAgfVxuXG4gIGdldFByb2Nlc3NGb3JDb25maWcoKSB7XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gdGhpcy5saXN0T2ZDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gdGhpcy5zZWxlY3RlZENvbHVtbkRhdGFzb3VyY2UuaW5jbHVkZXMoY29sdW1uLmZpZWxkTmFtZSkpO1xuICAgIGNvbnN0IGNvbHVtbkRlZkxpc3QgPSBbXTtcblxuICAgIGZpbHRlcmVkQ29sdW1ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW4gPSAodGhpcy5zdWJtaXRPYmplY3RbJ2NvbHVtbkRlZkxpc3QnXSkgPyB0aGlzLnN1Ym1pdE9iamVjdFsnY29sdW1uRGVmTGlzdCddLmZpbmQoY29sID0+IGNvbC5jb2x1bW5OYW1lID09PSBlbGVtZW50LmZpZWxkTmFtZSkgOiBmYWxzZTtcblxuICAgICAgaWYgKCFleGlzdGluZ0NvbHVtbikge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgIFwiY29sdW1uTmFtZVwiOiBlbGVtZW50LmZpZWxkTmFtZSxcbiAgICAgICAgICBcImNvbnRhaW5lclR5cGVcIjogXCJcIixcbiAgICAgICAgICBcImRhdGF0eXBlXCI6IFwiXCIsXG4gICAgICAgICAgXCJhbGxvd2VkT3BlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgICBcImxvb2t1cE5hbWVcIjogXCJcIlxuICAgICAgICB9O1xuICAgICAgICBjb2x1bW5EZWZMaXN0LnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5zdWJtaXRPYmplY3RbJ2NvbHVtbkRlZkxpc3QnXSAmJiB0aGlzLnN1Ym1pdE9iamVjdFsnY29sdW1uRGVmTGlzdCddLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5zdWJtaXRPYmplY3RbJ2NvbHVtbkRlZkxpc3QnXSA9IFsuLi50aGlzLnN1Ym1pdE9iamVjdFsnY29sdW1uRGVmTGlzdCddLCAuLi5jb2x1bW5EZWZMaXN0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJtaXRPYmplY3RbJ2NvbHVtbkRlZkxpc3QnXSA9IGNvbHVtbkRlZkxpc3Q7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb2NlZWQgPSB0cnVlO1xuICB9XG5cbiAgc3VibWl0RGF0YXNvdXJjZSgpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLnNhdmVEYXRhc291cmNlQ29uZmlnKHRoaXMuc3VibWl0T2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnY29sdW1uRGVmTGlzdCddID0gW107XG4gICAgICAgIHRoaXMuc3VibWl0T2JqZWN0WydhY3RpdmUnXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnZW5kRGF0ZUZ1bmN0aW9uJ10gPSBcIlwiO1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnc3RhcnREYXRlRnVuY3Rpb24nXSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc3VibWl0T2JqZWN0Wyd0YWJsZU5hbWUnXSA9IFwiXCI7XG4gICAgICAgIHRoaXMuaXNQcm9jZWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNFZGl0RGF0YXNvdXJjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2RyQ29uZmlnQ3JlYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoRGF0YXNvdXJjZURldGFpbHMoKTtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnQ29uZmlnIENyZWF0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDRFIgQ29uZmlnJyk7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGVkaXRDZHJDb25maWdDb25maWcoZGF0YSkge1xuICAgIHRoaXMuaXNFZGl0RGF0YXNvdXJjZSA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuaXNDZHJDb25maWdDcmVhdGUgPSB0cnVlO1xuICAgIHRoaXMuc3VibWl0T2JqZWN0ID0gZGF0YTtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0VGFibGVNZXRhZGF0YSh0aGlzLnN1Ym1pdE9iamVjdC50YWJsZU5hbWUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoY29sRGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXN0T2ZDb2x1bW5zID0gY29sRGF0YTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbk5hbWUgPSB0aGlzLnN1Ym1pdE9iamVjdC5jb2x1bW5EZWZMaXN0Lm1hcChpdGVtID0+IGl0ZW0uY29sdW1uTmFtZSk7XG4gICAgICAgIHRoaXMuaXNQcm9jZWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDRFIgQ29uZmlnJyk7XG4gICAgICB9XG4gICAgfSlcblxuICB9XG5cbiAgdXBkYXRlRGF0YXNvdXJjZSgpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmVkaXREYXRhc291cmNlQ29uZmlnKHRoaXMuc3VibWl0T2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnY29sdW1uRGVmTGlzdCddID0gW107XG4gICAgICAgIHRoaXMuc3VibWl0T2JqZWN0WydhY3RpdmUnXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnZW5kRGF0ZUZ1bmN0aW9uJ10gPSBcIlwiO1xuICAgICAgICB0aGlzLnN1Ym1pdE9iamVjdFsnc3RhcnREYXRlRnVuY3Rpb24nXSA9IFwiXCI7XG4gICAgICAgIHRoaXMuc3VibWl0T2JqZWN0Wyd0YWJsZU5hbWUnXSA9IFwiXCI7XG4gICAgICAgIHRoaXMuaXNQcm9jZWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNFZGl0RGF0YXNvdXJjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2RyQ29uZmlnQ3JlYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoRGF0YXNvdXJjZURldGFpbHMoKTtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnQ29uZmlnIFVwZGF0ZSBTdWNjZXNzZnVsbHknKVxuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0NEUiBDb25maWcnKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGVsZXRlQ2RyQ29uZmlnKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVsZXRlIENvbmZpZ1wiKTtcbiAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZVxuICAgICAgICB0aGlzLnNlcnZpY2UuZGVsZXRlRGF0YXNvdXJjZUNvbmZpZyhkYXRhLnRhYmxlTmFtZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERhdGFzb3VyY2VEZXRhaWxzKCk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKCdDb25maWcgRGVsZXRlZCBTdWNjZXNzZnVsbHknKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDRFIgQ29uZmlnIERlbGV0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUNEUkNvbmZpZygpIHtcbiAgICB0aGlzLmlzQ2RyQ29uZmlnQ3JlYXRlID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbmNlbENkckNvbmZpZygpIHtcbiAgICB0aGlzLmlzQ2RyQ29uZmlnQ3JlYXRlID0gZmFsc2U7XG4gICAgdGhpcy5zdWJtaXRPYmplY3RbJ2NvbHVtbkRlZkxpc3QnXSA9IFtdO1xuICAgIHRoaXMuc3VibWl0T2JqZWN0WydhY3RpdmUnXSA9IGZhbHNlO1xuICAgIHRoaXMuc3VibWl0T2JqZWN0WydlbmREYXRlRnVuY3Rpb24nXSA9IFwiXCI7XG4gICAgdGhpcy5zdWJtaXRPYmplY3RbJ3N0YXJ0RGF0ZUZ1bmN0aW9uJ10gPSBcIlwiO1xuICAgIHRoaXMuc3VibWl0T2JqZWN0Wyd0YWJsZU5hbWUnXSA9IFwiXCI7XG4gICAgLy8gdGhpcy5zZWFyY2hEYXRhc291cmNlRGV0YWlscygpO1xuICAgIHRoaXMuaXNQcm9jZWVkID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0RGF0YXNvdXJjZSA9IGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlQ29sdW1lKGkpIHtcbiAgICB0aGlzLnN1Ym1pdE9iamVjdC5jb2x1bW5EZWZMaXN0LnNwbGljZShpLCAxKVxuICB9XG5cblxuICAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5zdWJtaXRPYmplY3QuY29sdW1uRGVmTGlzdC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuc3VibWl0T2JqZWN0LmNvbHVtbkRlZkxpc3QubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5zdWJtaXRPYmplY3QuY29sdW1uRGVmTGlzdFtpbmRleF07XG4gICAgdGhpcy5zdWJtaXRPYmplY3QuY29sdW1uRGVmTGlzdC5zcGxpY2UoaW5kZXgsIDEpOyBcbiAgICB0aGlzLnN1Ym1pdE9iamVjdC5jb2x1bW5EZWZMaXN0LnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IFxuICB9XG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wXCI+XG4gICAgPCEtLSBoZWFkZXIgc3RhcnQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGRhcms6YmctdHJhbnNwYXJlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG1sLTEgcHktMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBmbG9hdC1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLXNpemUtMlwiIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfc29saWQ6dGVtcGxhdGUnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxoMlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTJ4bCBtZDp0ZXh0LTJ4bCBweS0yIGZvbnQtZXh0cmFib2xkIGl0ZW1zLWNlbnRlciBtbC0yIHRyYWNraW5nLXRpZ2h0IGxlYWRpbmctNSB0cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ0RSIENvbmZpZyBDcmVhdGlvblxuICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWwtMiBwLTAgbS0wXCI+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEgaC1mdWxsIGJvcmRlci1sLTJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBwLTFcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlQ0RSQ29uZmlnKClcIj5DcmVhdGUgQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTMgcC00IGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWQgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMiBmb250LWJvbGQgdGV4dC1sZyB0cmFja2luZy10aWdodCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBib3JkZXItYiBwYi0zXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1iYXItY2hhcnQtbyBtci0yXCI+PC9pPiBUYWJsZSBDb25maWd1cmF0aW9uc1xuICAgICAgICAgICAgPC9oNj5cblxuICAgICAgICAgICAgPGR4LWRhdGEtZ3JpZCBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIiBbZGF0YVNvdXJjZV09XCJhbGxUYWJsc0Ryb3BEb3duRGF0YVwiIFtzZWxlY3RlZFJvd0tleXNdPVwiW11cIlxuICAgICAgICAgICAgICAgIFtzaG93Qm9yZGVyc109XCJ0cnVlXCIgW3Nob3dSb3dMaW5lc109XCJ0cnVlXCIgaWQ9XCJncmlkQ29udGFpbmVyXCIgW2hvdmVyU3RhdGVFbmFibGVkXT1cInRydWVcIj5cblxuICAgICAgICAgICAgICAgIDxkeG8tc2VhcmNoLXBhbmVsIFtoaWdobGlnaHRDYXNlU2Vuc2l0aXZlXT1cInRydWVcIiBbdmlzaWJsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPC9keG8tc2VhcmNoLXBhbmVsPlxuICAgICAgICAgICAgICAgIDxkeG8tZXhwb3J0IFtlbmFibGVkXT1cInRydWVcIiBmaWxlTmFtZT1cImFsZXJ0X2RhdGFfYnlfc3RhdHVzXCI+PC9keG8tZXhwb3J0PlxuICAgICAgICAgICAgICAgIDxkeG8tcGFnaW5nIFtwYWdlU2l6ZV09XCIxMFwiPjwvZHhvLXBhZ2luZz5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2VyIFtzaG93SW5mb109XCJ0cnVlXCIgW3Nob3dQYWdlU2l6ZVNlbGVjdG9yXT1cInRydWVcIiBbYWxsb3dlZFBhZ2VTaXplc109XCJbMTAsMjAsNTAsMTAwXVwiPlxuICAgICAgICAgICAgICAgIDwvZHhvLXBhZ2VyPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInRhYmxlTmFtZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJzdGFydERhdGVGdW5jdGlvblwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJlbmREYXRlRnVuY3Rpb25cIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gY2FwdGlvbj1cIlN0YXR1c1wiIGRhdGFGaWVsZD1cImFjdGl2ZVwiIGNlbGxUZW1wbGF0ZT1cImNlbGxUZW1wbGF0ZTFcIj48L2R4aS1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJhY3Rpb25cIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGVcIiBbZml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGZpeGVkUG9zaXRpb249XCJyaWdodFwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5QcmltYXJ5Qmx1ZX19XCIgKGNsaWNrKT1cImVkaXRDZHJDb25maWdDb25maWcoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfbWR9fVwiIChjbGljayk9XCJkZWxldGVDZHJDb25maWcoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY2VsbFRlbXBsYXRlMSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLmRhdGEuYWN0aXZlID09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuU3VjY2Vzc0dyZWVufX1cIj5BY3RpdmU8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEuZGF0YS5hY3RpdmUgPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuV2FybmluZ1llbGxvd319XCI+SW5hY3RpdmU8L2J1dHRvbj5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZHgtZGF0YS1ncmlkPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NkckNvbmZpZ0NyZWF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS0yIHB5LTMgYm9yZGVyLWIgYm9yZGVyLXRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB4LTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5TZWxlY3QgVGFibGUgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiYXZhaWxhYmxlVGFibGVEYXRhc291cmNlXCIgWyhuZ01vZGVsKV09XCJzdWJtaXRPYmplY3QudGFibGVOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRTZWxlY3RlZFRhYmxlTWV0YURhdGEoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzMgcHgtMlwiICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5TZWxlY3QgQ29sdW1uczwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtkYXRhU291cmNlXT1cImxpc3RPZkNvbHVtbnNcIiB2YWx1ZUV4cHI9XCJmaWVsZE5hbWVcIiBkaXNwbGF5RXhwcj1cImZpZWxkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlsaW5lXT1cInRydWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29sdW1uTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0U2VsZWN0ZWRDb2x1bW5Tb3VyY2UoJGV2ZW50KVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMyBweC0yXCIgKm5nSWY9XCJpc1RhYmxlU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG10LTZcIiAoY2xpY2spPVwiZ2V0UHJvY2Vzc0ZvckNvbmZpZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQgQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsQ2RyQ29uZmlnKClcIj5DYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTIgYm9yZGVyLWJcIiAqbmdJZj1cImlzUHJvY2VlZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzdWJtaXRPYmplY3QuY29sdW1uRGVmTGlzdDsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+Q29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29sdW1uTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YSBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImZpbHRlcl90eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZGF0YXR5cGVcIj48L2R4LXNlbGVjdC1ib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+Q29udGFpbmVyIFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2lucHV0Jywnc2VsZWN0JywnbXVsdGlzZWxlY3QnLCdkYXRlJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5jb250YWluZXJUeXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+QWxsb3dlZCBPcGVyYXRpb25zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbZGF0YVNvdXJjZV09XCJDZHJCcm93c2VyQWxsb3dlZERhdGFzb3VyY2VcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpc3BsYXllZFRhZ3NdPVwiM1wiIFttdWx0aWxpbmVdPVwidHJ1ZVwiIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmFsbG93ZWRPcGVyYXRpb25zXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5Mb29rdXAgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJrcGlfZW5yaWNobWVudF9uYW1lXCIgdmFsdWVFeHByPVwiYXBpVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cImFwaU5hbWVcIiBbKG5nTW9kZWwpXT1cIml0ZW0ubG9va3VwTmFtZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IHN1Ym1pdE9iamVjdC5jb2x1bW5EZWZMaXN0Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LThcIiAoY2xpY2spPVwiZGVsZXRlQ29sdW1lKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiICpuZ0lmPVwiaXNQcm9jZWVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+U3RhcnREYXRlIEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ3N1YnRyYWN0J11cIiBbKG5nTW9kZWwpXT1cInN1Ym1pdE9iamVjdC5zdGFydERhdGVGdW5jdGlvblwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+RW5kRGF0ZSBGdW5jdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydzdWJ0cmFjdCddXCIgWyhuZ01vZGVsKV09XCJzdWJtaXRPYmplY3QuZW5kRGF0ZUZ1bmN0aW9uXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS80XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwic3VibWl0T2JqZWN0LmFjdGl2ZVwiIHRleHQ9J0FjdGl2ZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC02XCIgKm5nSWY9XCIhaXNFZGl0RGF0YXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdERhdGFzb3VyY2UoKVwiPlN1Ym1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtNlwiICpuZ0lmPVwiaXNFZGl0RGF0YXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZURhdGFzb3VyY2UoKVwiPlVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuPC9kaXY+Il19