gamma-app-controller 1.1.25 → 1.1.27

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 (156) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +20 -20
  2. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
  4. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
  5. package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
  6. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
  7. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
  8. package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
  9. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
  10. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
  11. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
  12. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
  13. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
  14. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
  15. package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
  16. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
  17. package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
  18. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
  19. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
  20. package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
  21. package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
  22. package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
  23. package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
  24. package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
  25. package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
  26. package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
  27. package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
  28. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
  29. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
  30. package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
  31. package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
  32. package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
  33. package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
  34. package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
  35. package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
  36. package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
  37. package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
  38. package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
  39. package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
  40. package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
  41. package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +381 -0
  42. package/esm2020/lib/template-module/KpiCreationModule/createKpi.service.mjs +90 -0
  43. package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +184 -0
  44. package/esm2020/lib/template-module/KpiCreationModule/treeview/animation.mjs +15 -0
  45. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/defaults.mjs +12 -0
  46. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/expand-collapse.mjs +16 -0
  47. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/fade.mjs +160 -0
  48. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/shake.mjs +58 -0
  49. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/slide.mjs +116 -0
  50. package/esm2020/lib/template-module/KpiCreationModule/treeview/animations/zoom.mjs +36 -0
  51. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/aside/aside.component.mjs +85 -0
  52. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/basic/basic.component.mjs +118 -0
  53. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/collapsable/collapsable.component.mjs +159 -0
  54. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/divider/divider.component.mjs +27 -0
  55. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/group/group.component.mjs +37 -0
  56. package/esm2020/lib/template-module/KpiCreationModule/treeview/components/spacer/spacer.component.mjs +27 -0
  57. package/esm2020/lib/template-module/KpiCreationModule/treeview/moment-helper.mjs +4 -0
  58. package/esm2020/lib/template-module/KpiCreationModule/treeview/treeview-navigation.service.mjs +2 -0
  59. package/esm2020/lib/template-module/KpiCreationModule/treeview/treeview-shared.service.mjs +16 -0
  60. package/esm2020/lib/template-module/KpiCreationModule/treeview/treeview.component.mjs +134 -0
  61. package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
  62. package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +149 -0
  63. package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
  64. package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
  65. package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +149 -0
  66. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
  67. package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
  68. package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
  69. package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
  70. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
  71. package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +154 -0
  72. package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
  73. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
  74. package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +154 -0
  75. package/esm2020/public-api.mjs +39 -20
  76. package/fesm2015/gamma-app-controller.mjs +6750 -475
  77. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  78. package/fesm2020/gamma-app-controller.mjs +6709 -475
  79. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  80. package/lib/application-controller/application-controller.module.d.ts +19 -19
  81. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
  82. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
  83. package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
  84. package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
  85. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
  86. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
  87. package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
  88. package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
  89. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
  90. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
  91. package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
  92. package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
  93. package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
  94. package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
  95. package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
  96. package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
  97. package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
  98. package/lib/template-module/KpiCreationModule/create-kpi-tree.component.d.ts +75 -0
  99. package/lib/template-module/KpiCreationModule/createKpi.service.d.ts +32 -0
  100. package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +23 -0
  101. package/lib/template-module/KpiCreationModule/treeview/animation.d.ts +1 -0
  102. package/lib/template-module/KpiCreationModule/treeview/animations/defaults.d.ts +11 -0
  103. package/lib/template-module/KpiCreationModule/treeview/animations/expand-collapse.d.ts +2 -0
  104. package/lib/template-module/KpiCreationModule/treeview/animations/fade.d.ts +11 -0
  105. package/lib/template-module/KpiCreationModule/treeview/animations/shake.d.ts +2 -0
  106. package/lib/template-module/KpiCreationModule/treeview/animations/slide.d.ts +9 -0
  107. package/lib/template-module/KpiCreationModule/treeview/animations/zoom.d.ts +3 -0
  108. package/lib/template-module/KpiCreationModule/treeview/components/aside/aside.component.d.ts +26 -0
  109. package/lib/template-module/KpiCreationModule/treeview/components/basic/basic.component.d.ts +29 -0
  110. package/lib/template-module/KpiCreationModule/treeview/components/collapsable/collapsable.component.d.ts +37 -0
  111. package/lib/template-module/KpiCreationModule/treeview/components/divider/divider.component.d.ts +13 -0
  112. package/lib/template-module/KpiCreationModule/treeview/components/group/group.component.d.ts +17 -0
  113. package/lib/template-module/KpiCreationModule/treeview/components/spacer/spacer.component.d.ts +13 -0
  114. package/lib/template-module/KpiCreationModule/treeview/moment-helper.d.ts +3 -0
  115. package/lib/template-module/KpiCreationModule/treeview/treeview-navigation.service.d.ts +39 -0
  116. package/lib/template-module/KpiCreationModule/treeview/treeview-shared.service.d.ts +8 -0
  117. package/lib/template-module/KpiCreationModule/treeview/treeview.component.d.ts +52 -0
  118. package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
  119. package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
  120. package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
  121. package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
  122. package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
  123. package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
  124. package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
  125. package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
  126. package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
  127. package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
  128. package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
  129. package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
  130. package/package.json +1 -1
  131. package/public-api.d.ts +38 -19
  132. package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
  133. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
  134. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
  135. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
  136. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
  137. package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
  138. package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
  139. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
  140. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
  141. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
  142. package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
  143. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
  144. package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
  145. package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
  146. package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
  147. package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
  148. package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
  149. package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
  150. package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
  151. /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
  152. /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
  153. /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
  154. /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
  155. /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
  156. /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
@@ -0,0 +1,992 @@
1
+ import { Component, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { forkJoin } from 'rxjs';
3
+ import moment from '../../application-controller/moment-helper';
4
+ import { GammaAdvanceChartComponent } from '../../shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component';
5
+ import { GammaTodayPreviousComponent } from '../../shared/advanced-component/gamma-today-previous/gamma-today-previous.component';
6
+ import { AppAdvanceHeaderComponent } from '../../shared/advanced-component/app-advance-header/app-header.component';
7
+ import { GammaTableWithPercentageComponent } from '../../shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component';
8
+ import { GammSingleNumberCardComponent } from '../../shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component';
9
+ import { GammaAdvanceOperatorTableComponent } from '../../shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component';
10
+ import { AdvanceWidgetHeaderFilterComponent } from '../../shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component';
11
+ import { GammaGeoChartComponent } from '../../shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component';
12
+ import { GammaHeatChartComponent } from '../../shared/advanced-component/gamma-heatmap/gamma-heatmap.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../../application-controller/common";
15
+ import * as i2 from "@angular/router";
16
+ import * as i3 from "../../application-controller/application-content.service";
17
+ import * as i4 from "ngx-toastr";
18
+ import * as i5 from "../../application-controller/application-dataset-call.service";
19
+ import * as i6 from "@angular/common";
20
+ import * as i7 from "../../shared/loading/loading.component";
21
+ import * as i8 from "devextreme-angular/core";
22
+ import * as i9 from "devextreme-angular/ui/popup";
23
+ import * as i10 from "devextreme-angular/ui/scroll-view";
24
+ import * as i11 from "devextreme-angular/ui/select-box";
25
+ import * as i12 from "devextreme-angular/ui/text-box";
26
+ import * as i13 from "@angular/forms";
27
+ export class KpiWithMultilayoutSetTestComponent {
28
+ constructor(commonService, activatedRoute, viewContainerRef, componentFactoryResolver, service, toastr, router, datasetService) {
29
+ this.commonService = commonService;
30
+ this.activatedRoute = activatedRoute;
31
+ this.viewContainerRef = viewContainerRef;
32
+ this.componentFactoryResolver = componentFactoryResolver;
33
+ this.service = service;
34
+ this.toastr = toastr;
35
+ this.router = router;
36
+ this.datasetService = datasetService;
37
+ this.dashbord_container = [];
38
+ this.widget_width = ['w-full', 'w-1/2', 'w-1/3', 'w-1/4', 'w-1/5', 'w-1/6'];
39
+ this.page_title = 'Dashboard';
40
+ this.dynamicComponentRefs = [];
41
+ this.componentClassMap = {
42
+ GammaAdvanceChartComponent,
43
+ GammaTodayPreviousComponent,
44
+ AppAdvanceHeaderComponent,
45
+ GammaTableWithPercentageComponent,
46
+ GammSingleNumberCardComponent,
47
+ GammaAdvanceOperatorTableComponent,
48
+ AdvanceWidgetHeaderFilterComponent,
49
+ GammaGeoChartComponent,
50
+ GammaHeatChartComponent
51
+ };
52
+ this.dataSourceMataData = [];
53
+ this.queryType = "mongo";
54
+ this.dataSetModal = [];
55
+ this.componentConfigDataSource = [];
56
+ this.dataSourceModal = {};
57
+ this.isDashBoardContent = false;
58
+ this.selectedViewFormComponent = {};
59
+ this.addedwidGetConfig = {
60
+ "display": true,
61
+ "widgetTitle": "",
62
+ "width": "",
63
+ "height": ""
64
+ };
65
+ this.dashBoardWidgetConfig = [];
66
+ this.selectedIndexObjForChart = {};
67
+ this.selectedContainerObjectForChart = {};
68
+ this.uniqueDataSetObject = {};
69
+ this.isDashBoardContentTypeView = true;
70
+ this.allWidgetByDataset = [];
71
+ this.stateDataSource = new Map();
72
+ this.mainPageDivElement = new Map();
73
+ this.contextMenuDataSource = [];
74
+ this.havingDataObject = {};
75
+ this.globalDefaultFilter = {};
76
+ }
77
+ ngOnInit() {
78
+ this.service.getlistKpiBrowser().subscribe({
79
+ next: ((data) => {
80
+ this.kpi_breadcrumbs_container = data;
81
+ })
82
+ });
83
+ this.loadingModal = true;
84
+ this.pageId = this.activatedRoute.snapshot.queryParams['pageId'];
85
+ this.getPadeDataSource(false);
86
+ }
87
+ async getFiltersForTemplate(filter) {
88
+ this.filters = filter;
89
+ this.defaultStartDate = filter.startDate;
90
+ this.defaultEndDate = filter.endDate;
91
+ filter.operationFilter['startDate'] = filter.startDate;
92
+ filter.operationFilter['endDate'] = filter.endDate;
93
+ this.loadingModal = true;
94
+ this.dashBoardWidgetConfig = [];
95
+ await this.getPadeDataSource(true);
96
+ this.uniqueDataSetObject = {};
97
+ let apiCalls = [];
98
+ this.allWidgetByDataset.forEach(view => {
99
+ view.datasetIds.forEach(id => {
100
+ let found = this.dataSetModal.find(d => d.datasetId === id);
101
+ if (found) {
102
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, filter));
103
+ }
104
+ });
105
+ });
106
+ Promise.all(apiCalls).then(() => {
107
+ this.globalDefaultFilter = filter;
108
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
109
+ this.createDivElements(this.uniqueDataSetObject, true);
110
+ this.loadingModal = false;
111
+ });
112
+ }
113
+ getPadeDataSource(context) {
114
+ return new Promise((resolve, reject) => {
115
+ this.service.getAppPageDetailConfig(this.pageId).subscribe({
116
+ next: (data) => {
117
+ this.pageTitle = data.pageName;
118
+ this.dashBoardWidgetConfig = data;
119
+ if (!context) {
120
+ if (Object.keys(this.uniqueDataSetObject).length != 0) {
121
+ this.createDivElements(this.uniqueDataSetObject, false);
122
+ }
123
+ this.getComponentConfigSet();
124
+ }
125
+ resolve();
126
+ },
127
+ error: (err) => {
128
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
129
+ reject(err);
130
+ }
131
+ });
132
+ });
133
+ }
134
+ getComponentConfigSet() {
135
+ let dataset = this.service.getAppDatasetConfigs();
136
+ let viewComponent = this.service.getAppViewConfigs();
137
+ forkJoin({
138
+ datasetConfig: dataset,
139
+ viewConfig: viewComponent
140
+ }).subscribe({
141
+ next: (({ datasetConfig, viewConfig }) => {
142
+ this.componentConfigDataSource = viewConfig;
143
+ this.dataSetModal = datasetConfig;
144
+ this.allWidgetByDataset = [];
145
+ let defaultFilters = { operationFilter: { startDate: "", endDate: "" } };
146
+ this.dashBoardWidgetConfig.widgets.forEach(widget => {
147
+ widget.filters.filterItems.forEach(element => {
148
+ if (element.filterType === 'date' || element.filterType === 'datetime') {
149
+ if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
150
+ let [count, unit] = element.defaultFilterValue.split(',');
151
+ if (element.apiName === "endDate") {
152
+ if (element.display) {
153
+ defaultFilters.operationFilter.endDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
154
+ this.defaultEndDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
155
+ }
156
+ }
157
+ if (element.apiName === "startDate") {
158
+ defaultFilters.operationFilter.startDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
159
+ this.defaultStartDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
160
+ }
161
+ }
162
+ else if (element.defaultFilterType === "static" && element.defaultFilterValue !== "") {
163
+ if (element.apiName === "endDate") {
164
+ if (element.display) {
165
+ defaultFilters.operationFilter.endDate = element.defaultFilterValue;
166
+ this.defaultEndDate = element.defaultFilterValue;
167
+ }
168
+ }
169
+ if (element.apiName === "startDate") {
170
+ defaultFilters.operationFilter.startDate = element.defaultFilterValue;
171
+ this.defaultStartDate = element.defaultFilterValue;
172
+ }
173
+ }
174
+ }
175
+ else {
176
+ if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
177
+ (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
178
+ if (element.operatorName !== "") {
179
+ defaultFilters.operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue)
180
+ ? element.filterDataSourceValue
181
+ : [element.filterDataSourceValue];
182
+ }
183
+ else {
184
+ defaultFilters.operationFilter[element.apiName] = element.filterDataSourceValue.join(",");
185
+ }
186
+ }
187
+ }
188
+ });
189
+ let datasetIds = new Set();
190
+ let viewIds = new Set();
191
+ widget.widgetNode.forEach(node => {
192
+ if (node.nodeProperties.display) {
193
+ node.compConfig.viewConfig.forEach(view => {
194
+ datasetIds.add(view.datasetId);
195
+ viewIds.add(view.viewId);
196
+ });
197
+ }
198
+ else {
199
+ node.compConfig.viewConfig.forEach(view => {
200
+ this.contextMenuDataSource.push({ viewId: view.viewId, viewName: node.nodeProperties.widgetTitle, displayKey: view.kpiConfig.keyToPass });
201
+ });
202
+ }
203
+ });
204
+ viewIds.forEach(element => {
205
+ let obj = {
206
+ "filters": JSON.parse(JSON.stringify(defaultFilters)),
207
+ "keyToPass": [],
208
+ "drillDownType": "natural",
209
+ "drilldownFrom": "",
210
+ "widgetId": widget.widgetId
211
+ };
212
+ this.stateDataSource.set(element, obj);
213
+ });
214
+ let obj = {
215
+ widgetId: widget.widgetId,
216
+ pageId: widget.pageId,
217
+ filters: defaultFilters,
218
+ datasetIds: datasetIds
219
+ };
220
+ this.allWidgetByDataset.push(obj);
221
+ });
222
+ console.log(this.stateDataSource);
223
+ this.uniqueDataSetObject = {};
224
+ let apiCalls = [];
225
+ this.allWidgetByDataset.forEach(view => {
226
+ view.datasetIds.forEach(id => {
227
+ let found = datasetConfig.find(d => d.datasetId === id);
228
+ if (found) {
229
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, view.filters));
230
+ }
231
+ });
232
+ });
233
+ Promise.all(apiCalls).then(() => {
234
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
235
+ this.createDivElements(this.uniqueDataSetObject, false);
236
+ this.loadingModal = false;
237
+ let urlParams = defaultFilters.operationFilter;
238
+ urlParams['pageId'] = this.pageId;
239
+ let navigation = {
240
+ queryParams: urlParams,
241
+ queryParamsHandling: "merge"
242
+ };
243
+ this.router.navigate([], navigation);
244
+ });
245
+ }), error: (err) => {
246
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
247
+ }
248
+ });
249
+ }
250
+ getDataSet() {
251
+ this.service.getAppDatasetConfigs().subscribe({
252
+ next: (data) => {
253
+ this.dataSettableDataSource = data;
254
+ }, error: (err) => {
255
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Dataset Creation');
256
+ }
257
+ });
258
+ }
259
+ async createDivElements(datasetById, context) {
260
+ const container = this.dynamicContainer.nativeElement;
261
+ container.innerHTML = "";
262
+ if (this.dashBoardWidgetConfig.widgets.length > 0) {
263
+ const firstWidget = this.dashBoardWidgetConfig.widgets[0];
264
+ const rowDiv = document.createElement('div');
265
+ let w_height = (firstWidget.widgetProperties.height == "") ? "h-auto" : 'h-[' + firstWidget.widgetProperties.height + ']';
266
+ rowDiv.classList.add(firstWidget.widgetProperties.width, w_height);
267
+ const filterDiv = document.createElement('div');
268
+ const filterItems = (firstWidget.filters) ? firstWidget.filters.filterItems : [];
269
+ const context_filter = this.dashBoardWidgetConfig.filters ? this.dashBoardWidgetConfig.filters.filterItems : null;
270
+ this.loadFilterComponent(firstWidget, filterDiv, filterItems, context_filter);
271
+ rowDiv.appendChild(filterDiv);
272
+ container.appendChild(rowDiv);
273
+ const mainWrapperDiv = document.createElement('div');
274
+ mainWrapperDiv.classList.add("flex", "flex-row", "justify-between", "w-full");
275
+ this.dashBoardWidgetConfig.widgets.forEach(div => {
276
+ const childDiv = document.createElement('div');
277
+ childDiv.classList.add("w-full");
278
+ if (div.widgetNode.length != 0) {
279
+ this.loadWidgetNodes(div, childDiv, datasetById);
280
+ }
281
+ mainWrapperDiv.appendChild(childDiv);
282
+ });
283
+ container.appendChild(mainWrapperDiv);
284
+ }
285
+ }
286
+ loadWidgetNodes(div, mainItemDiv, datasetById) {
287
+ this.mainPageDivElement.set(div.widgetId, mainItemDiv);
288
+ div.widgetNode.forEach(item => {
289
+ this.loadSingleWidgetNode(item, mainItemDiv, datasetById, null);
290
+ });
291
+ }
292
+ loadSingleWidgetNode(item, containerElement, datasetById, widgetId) {
293
+ const elementId = `id-${item.id}`;
294
+ const existingElement = document.querySelector(`#${elementId}`);
295
+ if (item.nodeProperties.display && !existingElement) {
296
+ const w_height = item.nodeProperties.height === "" ? "h-auto" : `h-[${item.nodeProperties.height}]`;
297
+ const itemDiv = document.createElement('div');
298
+ itemDiv.id = elementId;
299
+ itemDiv.classList.add(item.nodeProperties.width, w_height, 'mb-2');
300
+ const widgetDiv = this.getWidgetTitleDiv(item);
301
+ itemDiv.appendChild(widgetDiv);
302
+ const innerDiv = document.createElement('div');
303
+ innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'border', 'p-1', 'm-1', 'flex', 'flex-row');
304
+ item.compConfig.viewConfig.forEach(element => {
305
+ element.kpiConfig['dataSource'] = datasetById[element.datasetId];
306
+ element.kpiConfig['contextMenu'] = this.contextMenuDataSource;
307
+ element['titleParams'] = item.nodeProperties.widgetParams || "";
308
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
309
+ this.loadDynamicComponent(element, comp_object, itemDiv);
310
+ });
311
+ if (widgetId) {
312
+ let childelementContainer = containerElement.get(widgetId);
313
+ childelementContainer.appendChild(itemDiv);
314
+ if (!this.isDashBoardContentTypeView) {
315
+ itemDiv.appendChild(innerDiv);
316
+ }
317
+ console.log(childelementContainer);
318
+ }
319
+ else {
320
+ containerElement.appendChild(itemDiv);
321
+ if (!this.isDashBoardContentTypeView) {
322
+ itemDiv.appendChild(innerDiv);
323
+ }
324
+ }
325
+ }
326
+ else if (existingElement) {
327
+ const itemDiv = existingElement;
328
+ itemDiv.innerHTML = '';
329
+ const widgetDiv = this.getWidgetTitleDiv(item);
330
+ itemDiv.appendChild(widgetDiv);
331
+ item.compConfig.viewConfig.forEach(element => {
332
+ element.kpiConfig['dataSource'] = datasetById[element.datasetId];
333
+ element.kpiConfig['contextMenu'] = this.contextMenuDataSource;
334
+ element['titleParams'] = item.nodeProperties.widgetParams || "";
335
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
336
+ this.loadDynamicComponent(element, comp_object, itemDiv);
337
+ });
338
+ if (!this.isDashBoardContentTypeView) {
339
+ const innerDiv = document.createElement('div');
340
+ innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'border', 'p-1', 'm-1', 'flex', 'flex-row');
341
+ itemDiv.appendChild(innerDiv);
342
+ }
343
+ }
344
+ }
345
+ getWidgetTitleDiv(item) {
346
+ const widgetDiv = document.createElement('div');
347
+ widgetDiv.classList.add('flex', 'items-center', 'justify-between', 'font-bold', 'text-md', 'text-gray-900', 'dark:text-white', 'border-b', 'p-3', 'bg-gray-800', 'mx-2', 'rounded-t-lg');
348
+ const titleDiv = document.createElement('div');
349
+ const params = item.nodeProperties.widgetParams || "";
350
+ titleDiv.innerText = item.nodeProperties.widgetTitle + params;
351
+ widgetDiv.appendChild(titleDiv);
352
+ const searchContainerDiv = document.createElement('div');
353
+ searchContainerDiv.classList.add('flex', 'items-center', 'ml-auto', 'space-x-2', 'justify-end');
354
+ if (item.nodeProperties.isWidgetFilter) {
355
+ const searchButton = document.createElement('button');
356
+ searchButton.innerText = 'Filter';
357
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
358
+ this.nodeproperticeFilterDataSource = {};
359
+ this.nodeproperticeFilterDataSource['viewConfig'] = item;
360
+ this.nodeproperticeFilterDataSource['havingConfig'] = [];
361
+ searchButton.addEventListener('click', () => {
362
+ this.isWidgetFilters = true;
363
+ let filtePropertice = [];
364
+ item.compConfig.viewConfig.forEach(element => {
365
+ let key_name = this.uniqueDataSetObject[element.datasetId][0];
366
+ Object.keys(key_name).forEach(key => {
367
+ if (!filtePropertice.includes(key)) {
368
+ filtePropertice.push(key);
369
+ }
370
+ });
371
+ });
372
+ filtePropertice.forEach(element => {
373
+ let obj = {
374
+ columnName: element,
375
+ dataType: "float",
376
+ operator: "",
377
+ value: "",
378
+ };
379
+ this.nodeproperticeFilterDataSource.havingConfig.push(obj);
380
+ });
381
+ });
382
+ searchContainerDiv.appendChild(searchButton);
383
+ }
384
+ if (item.filterId) {
385
+ this.nodeproperticeFilterDataSource = {};
386
+ this.nodeproperticeFilterDataSource['viewConfig'] = item;
387
+ this.nodeproperticeFilterDataSource['havingConfig'] = [];
388
+ this.service.getAppFilterConfig(item.filterId).subscribe({
389
+ next: (data) => {
390
+ const filterDiv = document.createElement('div');
391
+ this.loadWidgetFilterComponent(item, widgetDiv, data.filterItems, item);
392
+ }, error: (err) => {
393
+ }
394
+ });
395
+ }
396
+ if (item.nodeProperties.nodefilters && item.nodeProperties.nodefilters.length !== 0) {
397
+ item.nodeProperties.nodefilters.forEach(filter => {
398
+ const filterDiv = document.createElement('div');
399
+ filterDiv.classList.add('flex', 'items-center');
400
+ if (filter.input_type === 'text') {
401
+ const textBox = document.createElement('input');
402
+ textBox.type = 'text';
403
+ textBox.placeholder = `Enter ${filter.local_column}`;
404
+ textBox.classList.add('px-2', 'py-1.5', 'rounded', 'border', 'mr-1', 'border-gray-500', 'text-gray-900', 'dark:bg-gray-700', 'dark:text-white');
405
+ const searchButton = document.createElement('button');
406
+ searchButton.innerText = 'Search';
407
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
408
+ const separerotButton = document.createElement('div');
409
+ separerotButton.innerHTML = '|';
410
+ searchButton.addEventListener('click', () => {
411
+ const searchTerm = textBox.value;
412
+ this.getRearchResultFromInputBox(searchTerm, item, filter);
413
+ });
414
+ filterDiv.appendChild(textBox);
415
+ filterDiv.appendChild(searchButton);
416
+ filterDiv.appendChild(separerotButton);
417
+ }
418
+ searchContainerDiv.appendChild(filterDiv);
419
+ });
420
+ }
421
+ widgetDiv.appendChild(searchContainerDiv);
422
+ return widgetDiv;
423
+ }
424
+ loadDynamicComponent(data, indexObj, containerElement) {
425
+ const componentClass = this.componentClassMap[data.kpiConfig.componentName];
426
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
427
+ const dynamicComponentInstance = this.CompRefs.instance;
428
+ dynamicComponentInstance.chartDataSource = data;
429
+ dynamicComponentInstance.kpi_name = "";
430
+ if (data.kpiConfig.componentName == "GammaAdvanceOperatorTableComponent" || data.kpiConfig.componentName == "GammaTableWithPercentageComponent") {
431
+ dynamicComponentInstance.oRowClick.subscribe((value) => {
432
+ this.getRowClick(value);
433
+ });
434
+ dynamicComponentInstance.onrightClickContextSelection.subscribe((value) => {
435
+ this.getContextClick(value);
436
+ });
437
+ }
438
+ const cssClass = "w-full";
439
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
440
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
441
+ }
442
+ loadFilterComponent(indexObj, containerElement, filterItems, context_filter) {
443
+ let userName = localStorage.getItem('user_name');
444
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
445
+ const componentClass = this.componentClassMap['AppAdvanceHeaderComponent'];
446
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
447
+ const dynamicComponentInstance = this.CompRefs.instance;
448
+ dynamicComponentInstance.selectedDates = selectedDates;
449
+ dynamicComponentInstance.filterItems = filterItems;
450
+ dynamicComponentInstance.contextFilterItems = context_filter;
451
+ dynamicComponentInstance.pageTitle = this.pageTitle;
452
+ dynamicComponentInstance.bread_crumbs_container = this.kpi_breadcrumbs_container;
453
+ dynamicComponentInstance.isEditButton = (userName && userName == "admin") ? true : false;
454
+ dynamicComponentInstance.isAdvanceButton = true;
455
+ dynamicComponentInstance.getFilterPageConfig.subscribe((value) => {
456
+ this.getFiltersForTemplate(value);
457
+ });
458
+ dynamicComponentInstance.getOperatorName.subscribe((value) => {
459
+ this.loadDataByOperator(value);
460
+ });
461
+ dynamicComponentInstance.getContextFilterData.subscribe((value) => {
462
+ this.getContextFilterData(value);
463
+ });
464
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
465
+ const cssClass = "w-full";
466
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
467
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
468
+ }
469
+ loadWidgetFilterComponent(indexObj, containerElement, filterItems, viewIds) {
470
+ let userName = localStorage.getItem('user_name');
471
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
472
+ const componentClass = this.componentClassMap['AdvanceWidgetHeaderFilterComponent'];
473
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
474
+ const dynamicComponentInstance = this.CompRefs.instance;
475
+ dynamicComponentInstance.selectedDates = selectedDates;
476
+ dynamicComponentInstance.filterItems = filterItems;
477
+ dynamicComponentInstance.viewIds = viewIds;
478
+ dynamicComponentInstance.getWidgetFilterConfig.subscribe((value) => {
479
+ this.getWidgetFilterForTemplate(value);
480
+ });
481
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
482
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
483
+ }
484
+ getContextClick(event) {
485
+ const stateData = Array.from(this.stateDataSource.keys());
486
+ const currentViewIndex = stateData.indexOf(event.viewId);
487
+ const deletedViewIds = [];
488
+ for (let i = currentViewIndex + 1; i < stateData.length; i++) {
489
+ deletedViewIds.push(stateData[i]);
490
+ }
491
+ this.loadingModal = true;
492
+ this.dashBoardWidgetConfig.widgets.forEach(element => {
493
+ element.widgetNode.forEach((node, nodeIndex) => {
494
+ if (this.getElementOfCurrentView(node, event.drilldownTo)) {
495
+ let view = element.widgetNode[nodeIndex];
496
+ let apiCalls = [];
497
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.drilldownFrom));
498
+ view.compConfig.viewConfig.forEach(contentView => {
499
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
500
+ if (found) {
501
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
502
+ }
503
+ });
504
+ Promise.all(apiCalls).then(() => {
505
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
506
+ for (let entry of deletedViewIds) {
507
+ element.widgetNode.forEach(viewValue => {
508
+ viewValue.compConfig.viewConfig.forEach(viewId => {
509
+ if (viewId.viewId == entry) {
510
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
511
+ if (!exists) {
512
+ this.contextMenuDataSource.push({
513
+ viewId: viewId.viewId,
514
+ viewName: node.nodeProperties.widgetTitle,
515
+ displayKey: viewId.kpiConfig.keyToPass
516
+ });
517
+ }
518
+ const startData = this.stateDataSource.get(entry);
519
+ if (startData) {
520
+ this.stateDataSource.delete(entry);
521
+ }
522
+ viewValue.nodeProperties['display'] = false;
523
+ const prefixedId = `id-${viewValue.id}`;
524
+ const elementToHide = document.querySelector(`#${prefixedId}`);
525
+ if (elementToHide) {
526
+ elementToHide.remove();
527
+ }
528
+ }
529
+ });
530
+ });
531
+ }
532
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== event.keyToPass);
533
+ view.compConfig.viewConfig.forEach(val => {
534
+ let obj = {
535
+ "filters": appliedFilters,
536
+ "keyToPass": this.updateOperatorData(event.keyToPass, event.data),
537
+ "drillDownType": event.drillDownType,
538
+ "drilldownFrom": event.drilldownFrom,
539
+ "widgetId": element.widgetId
540
+ };
541
+ this.stateDataSource.set(val['viewId'], obj);
542
+ });
543
+ view.nodeProperties['display'] = true;
544
+ view.nodeProperties['widgetParams'] = event.tableTitle;
545
+ const prefixedId = `id-${view.id}`;
546
+ const containerElement = document.querySelector(`#${prefixedId}`);
547
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject, element.widgetId);
548
+ setTimeout(() => {
549
+ this.scrollToBottom(this.mainPageDivElement, element.widgetId);
550
+ }, 200);
551
+ let navigation = {
552
+ queryParams: appliedFilters['operationFilter'],
553
+ queryParamsHandling: "merge"
554
+ };
555
+ this.router.navigate([], navigation);
556
+ });
557
+ }
558
+ else {
559
+ }
560
+ });
561
+ });
562
+ }
563
+ async getRowClick(event) {
564
+ const viewid_for_same = event.viewId;
565
+ const target = this.stateDataSource.get(viewid_for_same);
566
+ if (!target) {
567
+ console.warn('viewid not found in stateDataSource');
568
+ return;
569
+ }
570
+ const targetWidgetId = target.widgetId;
571
+ const matchingViewIds = Array.from(this.stateDataSource.entries())
572
+ .filter(([key, value]) => value.widgetId === targetWidgetId)
573
+ .map(([key]) => key);
574
+ console.log('Matching viewids:', targetWidgetId);
575
+ const currentViewIndex = matchingViewIds.indexOf(event.viewId);
576
+ const deletedViewIds = [];
577
+ for (let i = currentViewIndex + 1; i < matchingViewIds.length; i++) {
578
+ deletedViewIds.push(matchingViewIds[i]);
579
+ }
580
+ const hourlyNode = this.dashBoardWidgetConfig.widgets
581
+ .map(widget => widget.widgetNode.find(node => this.getHourlyData(node)))
582
+ .find(node => node);
583
+ if (hourlyNode && event.keyToPass.includes("recordDate")) {
584
+ this.getViewByRowCLickForHourlyChart(event, hourlyNode);
585
+ }
586
+ const currentViewNode = this.dashBoardWidgetConfig.widgets
587
+ .map(widget => widget.widgetNode.find(node => this.getElementOfCurrentView(node, event.viewId)))
588
+ .find(node => node);
589
+ const queryParams = this.activatedRoute.snapshot.queryParamMap;
590
+ if (currentViewNode) {
591
+ const drildownsForCurrentView = [];
592
+ currentViewNode.compConfig.viewConfig.forEach(async (element) => {
593
+ if (element.kpiConfig.viewProperties.enableClickEvent) {
594
+ if (deletedViewIds && deletedViewIds.length !== 0) {
595
+ this.dashBoardWidgetConfig.widgets.forEach(element => {
596
+ for (let entry of deletedViewIds) {
597
+ element.widgetNode.forEach(viewValue => {
598
+ viewValue.compConfig.viewConfig.forEach(viewId => {
599
+ if (viewId.viewId == entry) {
600
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
601
+ if (!exists) {
602
+ this.contextMenuDataSource.push({
603
+ viewId: viewId.viewId,
604
+ viewName: currentViewNode.nodeProperties.widgetTitle,
605
+ displayKey: viewId.kpiConfig.keyToPass
606
+ });
607
+ }
608
+ const startData = this.stateDataSource.get(entry);
609
+ if (startData) {
610
+ this.stateDataSource.delete(entry);
611
+ }
612
+ viewValue.nodeProperties['display'] = false;
613
+ const prefixedId = `id-${viewValue.id}`;
614
+ const elementToHide = document.querySelector(`#${prefixedId}`);
615
+ if (elementToHide) {
616
+ elementToHide.remove();
617
+ }
618
+ }
619
+ });
620
+ });
621
+ }
622
+ });
623
+ }
624
+ if (element.kpiConfig.viewProperties.enableClickEvent) {
625
+ if (element.kpiConfig.viewProperties.clickEventOptions?.eventType !== undefined &&
626
+ element.kpiConfig.viewProperties.clickEventOptions.eventType !== "") {
627
+ let eventType = element.kpiConfig.viewProperties.clickEventOptions.eventType;
628
+ let associatedViews = element.kpiConfig.viewProperties.clickEventOptions.associatedViews;
629
+ if (eventType == 'optionalDrillDown') {
630
+ if (associatedViews && associatedViews.length != 0) {
631
+ for (let viewForDrillDown of associatedViews) {
632
+ const filterCondition = new URLSearchParams(viewForDrillDown['filterCondition']);
633
+ let matchFound = true;
634
+ filterCondition.forEach((value, key) => {
635
+ if (queryParams.get(key) !== value) {
636
+ matchFound = false;
637
+ }
638
+ });
639
+ if (matchFound) {
640
+ viewForDrillDown['viewId'].forEach(viewForId => {
641
+ drildownsForCurrentView.push(viewForId);
642
+ });
643
+ }
644
+ }
645
+ }
646
+ }
647
+ else if (eventType == 'drilldown') {
648
+ for (let entry of associatedViews) {
649
+ drildownsForCurrentView.push(entry);
650
+ }
651
+ }
652
+ else if (eventType == 'sameViewDrilldown') {
653
+ }
654
+ if (drildownsForCurrentView.length != 0) {
655
+ for (let viewIdForNext of drildownsForCurrentView) {
656
+ const nextViewNode = this.dashBoardWidgetConfig.widgets
657
+ .map(widget => widget.widgetNode.find(node => this.getElementOfCurrentView(node, viewIdForNext)))
658
+ .find(node => node);
659
+ this.loadingModal = true;
660
+ await this.getViewByRowCLick(event, nextViewNode, targetWidgetId);
661
+ }
662
+ }
663
+ }
664
+ else {
665
+ const nextViewIndex = matchingViewIds.indexOf(event.viewId) + 1;
666
+ const matchingWidget = this.dashBoardWidgetConfig.widgets
667
+ .find(widget => widget.widgetId === targetWidgetId);
668
+ const nextView = matchingWidget?.widgetNode?.[nextViewIndex];
669
+ if (nextView) {
670
+ this.loadingModal = true;
671
+ await this.getViewByRowCLick(event, nextView, targetWidgetId);
672
+ }
673
+ }
674
+ }
675
+ }
676
+ });
677
+ }
678
+ }
679
+ getViewByRowCLickForHourlyChart(event, node) {
680
+ let apiCalls = [];
681
+ const deletedViewIds = [];
682
+ node.compConfig.viewConfig.forEach(item => {
683
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(item.viewId));
684
+ let found = this.dataSetModal.find(d => d.datasetId === item.datasetId);
685
+ deletedViewIds.push(item.viewId);
686
+ if (found) {
687
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, item.datasetId, appliedFilters));
688
+ }
689
+ });
690
+ Promise.all(apiCalls).then(() => {
691
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
692
+ this.loadSingleWidgetNode(node, this.mainPageDivElement, this.uniqueDataSetObject, null);
693
+ setTimeout(() => {
694
+ this.scrollToBottom(this.mainPageDivElement, null);
695
+ }, 200);
696
+ });
697
+ console.log(this.stateDataSource);
698
+ }
699
+ async getViewByRowCLick(event, view, targetWidgetId) {
700
+ let apiCalls = [];
701
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.viewId));
702
+ view.compConfig.viewConfig.forEach(contentView => {
703
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
704
+ if (found) {
705
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
706
+ }
707
+ });
708
+ await Promise.all(apiCalls);
709
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== event.keyToPass);
710
+ view.compConfig.viewConfig.forEach(viewforDataSet => {
711
+ let obj = {
712
+ "filters": appliedFilters,
713
+ "keyToPass": this.updateOperatorData(event.keyToPass, event.data),
714
+ "drillDownType": event.drillDownType,
715
+ "drilldownFrom": event.drilldownFrom,
716
+ "widgetId": targetWidgetId
717
+ };
718
+ this.stateDataSource.set(viewforDataSet['viewId'], obj);
719
+ });
720
+ view.nodeProperties['display'] = true;
721
+ view.nodeProperties['widgetParams'] = event.tableTitle;
722
+ const prefixedId = `id-${view.id}`;
723
+ const containerElement = document.querySelector(`#${prefixedId}`);
724
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
725
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject, targetWidgetId);
726
+ setTimeout(() => {
727
+ this.scrollToBottom(this.mainPageDivElement, targetWidgetId);
728
+ }, 200);
729
+ let navigation = {
730
+ queryParams: appliedFilters['operationFilter'],
731
+ queryParamsHandling: "merge"
732
+ };
733
+ this.router.navigate([], navigation);
734
+ console.log(this.stateDataSource);
735
+ }
736
+ scrollToBottom(container, widgetId) {
737
+ if (widgetId) {
738
+ let containerElement = container.get(widgetId);
739
+ setTimeout(() => {
740
+ containerElement.scrollIntoView({ block: 'end' });
741
+ this.loadingModal = false;
742
+ }, 0);
743
+ }
744
+ else {
745
+ setTimeout(() => {
746
+ container.scrollIntoView({ block: 'end' });
747
+ this.loadingModal = false;
748
+ }, 0);
749
+ }
750
+ }
751
+ findWidgetById(configs, id) {
752
+ for (const config of configs) {
753
+ if (config.id === id) {
754
+ return config;
755
+ }
756
+ if (config.widgetNode && config.widgetNode.length > 0) {
757
+ const found = this.findWidgetById(config.widgetNode, id);
758
+ if (found) {
759
+ return found;
760
+ }
761
+ }
762
+ }
763
+ return undefined;
764
+ }
765
+ updateOperatorData(key_name, value_data) {
766
+ let operator = [];
767
+ for (const key of key_name) {
768
+ let obj = {};
769
+ obj[key] = value_data[key];
770
+ operator.push(obj);
771
+ }
772
+ return operator;
773
+ }
774
+ getElementOfCurrentView(node, viewId) {
775
+ const matchedObject = node.compConfig.viewConfig.find(object => object.viewId === viewId);
776
+ return matchedObject ? node : null;
777
+ }
778
+ getHourlyData(node) {
779
+ const matchedObject = node.compConfig.viewConfig.find(object => object.kpiConfig.formate === 'hourly');
780
+ return matchedObject ? node : null;
781
+ }
782
+ getSetOperatorFilter(objectData, previousViewStates) {
783
+ const { data, keyToPass } = objectData;
784
+ const appliedFilter = JSON.parse(JSON.stringify(previousViewStates.filters.operationFilter));
785
+ keyToPass.forEach(key => {
786
+ if (key in data) {
787
+ const normalizedKey = key.toLowerCase().replace(/_/g, '');
788
+ if (normalizedKey === "recorddate" && "startDate" in appliedFilter && "endDate" in appliedFilter) {
789
+ appliedFilter.startDate = data[key];
790
+ appliedFilter.endDate = data[key];
791
+ }
792
+ else {
793
+ appliedFilter[key] = data[key];
794
+ }
795
+ }
796
+ });
797
+ const defaultoperationFilter = this.globalDefaultFilter.operationFilter;
798
+ if (defaultoperationFilter) {
799
+ Object.keys(defaultoperationFilter).forEach(key => {
800
+ if (!appliedFilter.hasOwnProperty(key)) {
801
+ appliedFilter[key] = defaultoperationFilter[key];
802
+ }
803
+ });
804
+ }
805
+ const operationFilter = {};
806
+ operationFilter['operationFilter'] = appliedFilter;
807
+ return operationFilter;
808
+ }
809
+ getRearchResultFromInputBox(inputValue, viewConfig, filterObject) {
810
+ let view = viewConfig;
811
+ let eventNode = { data: {}, keyToPass: [] };
812
+ eventNode.data[filterObject.server_column] = inputValue;
813
+ eventNode['keyToPass'] = [filterObject.server_column];
814
+ let apiCalls = [];
815
+ view.compConfig.viewConfig.forEach(contentView => {
816
+ let appliedFilters = this.getSetOperatorFilter(eventNode, this.stateDataSource.get(contentView.viewId));
817
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
818
+ if (found) {
819
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
820
+ }
821
+ });
822
+ viewConfig.nodeProperties['display'] = false;
823
+ const prefixedId = `id-${viewConfig.id}`;
824
+ const elementToHide = document.querySelector(`#${prefixedId}`);
825
+ if (elementToHide) {
826
+ elementToHide.remove();
827
+ }
828
+ Promise.all(apiCalls).then(() => {
829
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
830
+ this.loadingModal = true;
831
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== viewConfig.keyToPass);
832
+ view.nodeProperties['display'] = true;
833
+ const prefixedId = `id-${view.id}`;
834
+ const containerElement = document.querySelector(`#${prefixedId}`);
835
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject, null);
836
+ setTimeout(() => {
837
+ this.scrollToBottom(this.mainPageDivElement, null);
838
+ }, 200);
839
+ let params = {};
840
+ params[filterObject.server_column] = inputValue;
841
+ let navigation = {
842
+ queryParams: params,
843
+ queryParamsHandling: "merge"
844
+ };
845
+ this.router.navigate([], navigation);
846
+ });
847
+ }
848
+ submitFilter() {
849
+ let view = this.nodeproperticeFilterDataSource.viewConfig;
850
+ let apiCalls = [];
851
+ this.havingDataObject = this.nodeproperticeFilterDataSource.havingConfig.filter(value => value.value !== "");
852
+ view.compConfig.viewConfig.forEach(contentView => {
853
+ let appliedFilters = this.stateDataSource.get(contentView.viewId);
854
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
855
+ if (found) {
856
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters.filters));
857
+ }
858
+ });
859
+ Promise.all(apiCalls).then(() => {
860
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
861
+ this.nodeproperticeFilterDataSource.viewConfig.nodeProperties['display'] = false;
862
+ const prefixedId = `id-${this.nodeproperticeFilterDataSource.viewConfig.id}`;
863
+ const elementToHide = document.querySelector(`#${prefixedId}`);
864
+ if (elementToHide) {
865
+ elementToHide.remove();
866
+ }
867
+ this.loadingModal = true;
868
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== this.nodeproperticeFilterDataSource.viewConfig.keyToPass);
869
+ this.isWidgetFilters = false;
870
+ view.nodeProperties['display'] = true;
871
+ this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject, null);
872
+ setTimeout(() => {
873
+ this.scrollToBottom(this.mainPageDivElement, null);
874
+ }, 200);
875
+ });
876
+ }
877
+ getWidgetFilterForTemplate(value) {
878
+ let apiCalls = [];
879
+ const deletedViewIds = [];
880
+ value.viewNodes.compConfig.viewConfig.forEach(item => {
881
+ let widgetFilter = this.stateDataSource.get(item.viewId);
882
+ let appliedFilters = widgetFilter.filters;
883
+ let found = this.dataSetModal.find(d => d.datasetId === item.datasetId);
884
+ deletedViewIds.push(item.viewId);
885
+ const having = Object.entries(value.operationFilter).map(([key, value]) => ({
886
+ columnName: key,
887
+ dataType: "float",
888
+ operator: "gte",
889
+ value: value
890
+ }));
891
+ if (found) {
892
+ found.config.queryConfig['havings'] = having;
893
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, item.datasetId, appliedFilters));
894
+ }
895
+ });
896
+ Promise.all(apiCalls).then(() => {
897
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
898
+ this.loadSingleWidgetNode(value.viewNodes, this.mainPageDivElement, this.uniqueDataSetObject, null);
899
+ setTimeout(() => {
900
+ this.scrollToBottom(this.mainPageDivElement, null);
901
+ }, 200);
902
+ });
903
+ }
904
+ async loadDataByOperator(opName) {
905
+ console.log(opName);
906
+ let filter = { operationFilter: { startDate: "", endDate: "", operator_key: "" } };
907
+ filter.operationFilter['startDate'] = this.defaultStartDate;
908
+ filter.operationFilter['endDate'] = this.defaultEndDate;
909
+ filter.operationFilter['operator_key'] = opName;
910
+ this.loadingModal = true;
911
+ let navigation = {
912
+ queryParams: {
913
+ "operatorName": opName
914
+ },
915
+ queryParamsHandling: "merge"
916
+ };
917
+ this.router.navigate([], navigation);
918
+ await this.getPadeDataSource(true);
919
+ this.uniqueDataSetObject = {};
920
+ let apiCalls = [];
921
+ this.allWidgetByDataset.forEach(view => {
922
+ view.datasetIds.forEach(id => {
923
+ let found = this.dataSetModal.find(d => d.datasetId === id);
924
+ if (found) {
925
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, filter));
926
+ }
927
+ });
928
+ });
929
+ Promise.all(apiCalls).then(() => {
930
+ this.globalDefaultFilter = filter;
931
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
932
+ this.createDivElements(this.uniqueDataSetObject, true);
933
+ this.loadingModal = false;
934
+ });
935
+ }
936
+ async getContextFilterData(value) {
937
+ let filter = { operationFilter: { startDate: "", endDate: "" } };
938
+ filter.operationFilter['startDate'] = this.defaultStartDate;
939
+ filter.operationFilter['endDate'] = this.defaultEndDate;
940
+ filter.operationFilter[value.operatorName] = this.parseInput(value.defaultFilterValue);
941
+ this.loadingModal = true;
942
+ let obj = {};
943
+ obj[value.operatorName] = value.defaultFilterValue;
944
+ let navigation = {
945
+ queryParams: obj,
946
+ queryParamsHandling: "merge"
947
+ };
948
+ this.router.navigate([], navigation);
949
+ await this.getPadeDataSource(true);
950
+ this.uniqueDataSetObject = {};
951
+ let apiCalls = [];
952
+ this.allWidgetByDataset.forEach(view => {
953
+ view.datasetIds.forEach(id => {
954
+ let found = this.dataSetModal.find(d => d.datasetId === id);
955
+ if (found) {
956
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id, filter));
957
+ }
958
+ });
959
+ });
960
+ Promise.all(apiCalls).then(() => {
961
+ this.globalDefaultFilter = filter;
962
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
963
+ this.createDivElements(this.uniqueDataSetObject, true);
964
+ this.loadingModal = false;
965
+ });
966
+ }
967
+ parseInput(input) {
968
+ input = input.trim();
969
+ if (input.includes(',')) {
970
+ return input.split(',').map(item => item.trim());
971
+ }
972
+ else {
973
+ return input;
974
+ }
975
+ }
976
+ }
977
+ KpiWithMultilayoutSetTestComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KpiWithMultilayoutSetTestComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.ApplicationContentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.ApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
978
+ KpiWithMultilayoutSetTestComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: KpiWithMultilayoutSetTestComponent, selector: "app-kpi-with-multilayout", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource.havingConfig; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n\n\n\n", styles: [""], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.LoadingComponent, selector: "app-loading" }, { kind: "directive", type: i8.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.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: i12.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: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
979
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KpiWithMultilayoutSetTestComponent, decorators: [{
980
+ type: Component,
981
+ args: [{ selector: 'app-kpi-with-multilayout', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource.havingConfig; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n\n\n\n" }]
982
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.ApplicationContentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.ApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
983
+ type: ViewChild,
984
+ args: ['dynamicComponentContainer', { read: ViewContainerRef }]
985
+ }], containerRef: [{
986
+ type: ViewChild,
987
+ args: ['container', { read: ViewContainerRef }]
988
+ }], dynamicContainer: [{
989
+ type: ViewChild,
990
+ args: ['dynamicContainer', { static: true }]
991
+ }] } });
992
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXdpdGgtbXVsdGlsYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi90ZW1wbGF0ZS1tb2R1bGUva3BpV2l0aE11bHRpTGF5b3V0L2twaS13aXRoLW11bHRpbGF5b3V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvdGVtcGxhdGUtbW9kdWxlL2twaVdpdGhNdWx0aUxheW91dC9rcGktd2l0aC1tdWx0aWxheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBa0csU0FBUyxFQUFnQixnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdwTSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sTUFBTSxNQUFNLDRDQUE0QyxDQUFDO0FBRWhFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1GQUFtRixDQUFDO0FBQy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFGQUFxRixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG1HQUFtRyxDQUFDO0FBQ3RKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJGQUEyRixDQUFDO0FBQzFJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJFQUEyRSxDQUFDO0FBQ25ILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVFQUF1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RUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvbW9tZW50LWhlbHBlcic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9jb21tb24nO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2UtY2hhcnQvZ2FtbWEtYWR2YW5jZS1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10b2RheS1wcmV2aW91cy9nYW1tYS10b2RheS1wcmV2aW91cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYXBwLWFkdmFuY2UtaGVhZGVyL2FwcC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbVNpbmdsZU51bWJlckNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW0tc2luZ2xlLW51bWJlci1jYXJkL2dhbW0tc2luZ2xlLW51bWJlci1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlL2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFHZW9DaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtZ2VvLWNoYXJ0L2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWhlYXRtYXAvZ2FtbWEtaGVhdG1hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0c3NldHNDYWxsIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9hcHBsaWNhdGlvbi1kYXRhc2V0LWNhbGwuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWtwaS13aXRoLW11bHRpbGF5b3V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2twaS13aXRoLW11bHRpbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4va3BpLXdpdGgtbXVsdGlsYXlvdXQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEtwaVdpdGhNdWx0aWxheW91dFNldFRlc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBkYXNoYm9yZF9jb250YWluZXI6IGFueSA9IFtdO1xuICBzZWxlY3RlZF93aWR0aDogYW55O1xuICB3aWRnZXRfd2lkdGggPSBbJ3ctZnVsbCcsICd3LTEvMicsICd3LTEvMycsICd3LTEvNCcsICd3LTEvNScsICd3LTEvNiddXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgcGFnZV90aXRsZSA9ICdEYXNoYm9hcmQnO1xuICBkZWZhdWx0U3RhcnREYXRlO1xuICBkZWZhdWx0RW5kRGF0ZTtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcbiAgLy8gZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcblxuICBDb21wUmVmczogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgY29tcG9uZW50Q2xhc3NNYXAgPSB7XG4gICAgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50LFxuICAgIEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQsXG4gICAgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50LFxuICAgIEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQsXG4gICAgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCxcbiAgICBHYW1tYUdlb0NoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hSGVhdENoYXJ0Q29tcG9uZW50XG4gIH07XG4gIGRhdGFTb3VyY2VNYXRhRGF0YTogYW55ID0gW107XG4gIHF1ZXJ5VHlwZSA9IFwibW9uZ29cIjtcbiAgZGF0YVNldE1vZGFsOiBhbnkgPSBbXTtcbiAgY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZTogYW55ID0gW107XG4gIHNlbGVzY2VkRGF0YVNvdXJjZTogYW55O1xuICBkYXRhU291cmNlTW9kYWw6IGFueSA9IHt9O1xuICBpc0Rhc2hCb2FyZENvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzZWxlY3RlZFZpZXdGb3JtQ29tcG9uZW50OiBhbnkgPSB7fTtcbiAgYWRkZWR3aWRHZXRDb25maWcgPSB7XG4gICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgIFwid2lkdGhcIjogXCJcIixcbiAgICBcImhlaWdodFwiOiBcIlwiXG4gIH1cblxuXG4gIGRhc2hCb2FyZFdpZGdldENvbmZpZzogYW55ID0gW1xuXG4gIF07XG4gIGlzV2lkZ2V0Q3JlYXRpb25Db250ZW50OiBib29sZWFuO1xuICBzZWxlY3RlZFdpZHRoOiBhbnk7XG4gIHNlbGVjdGVkSGVpZ2h0OiBhbnk7XG4gIG5ld1dpZGdldEluZGV4OiBhbnk7XG4gIHNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydDogYW55ID0ge307XG4gIHNlbGVjdGVkQ29udGFpbmVyT2JqZWN0Rm9yQ2hhcnQ6IGFueSA9IHt9O1xuICBkYXRhU2V0dGFibGVEYXRhU291cmNlOiBhbnk7XG4gIHVuaXF1ZURhdGFTZXRPYmplY3QgPSB7fTtcblxuICBpc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldzogYm9vbGVhbiA9IHRydWU7XG4gIGZpbHRlcnM6IGFueTtcbiAgYWxsV2lkZ2V0QnlEYXRhc2V0ID0gW107XG4gIHBhZ2VUaXRsZTogYW55O1xuICBzdGF0ZURhdGFTb3VyY2UgPSBuZXcgTWFwKCk7XG4gIG1haW5QYWdlRGl2RWxlbWVudCA9IG5ldyBNYXAoKTtcbiAgY29udGV4dE1lbnVEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgaGF2aW5nRGF0YU9iamVjdDogYW55ID0ge307XG4gIGlzV2lkZ2V0RmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOiBhbnk7XG4gIGdsb2JhbERlZmF1bHRGaWx0ZXI6IGFueSA9IHt9O1xuICBwYWdlSWQ6IGFueTtcblxuICBrcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyOiBhbnk7XG4gIG9wZXJhdG9yTmFtZTogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCxcblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5zZXJ2aWNlLmdldGxpc3RLcGlCcm93c2VyKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMua3BpX2JyZWFkY3J1bWJzX2NvbnRhaW5lciA9IGRhdGE7XG4gICAgICB9KVxuICAgIH0pXG5cblxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3BhZ2VJZCddO1xuICAgIHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsdGVyc0ZvclRlbXBsYXRlKGZpbHRlcikge1xuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcjtcbiAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBmaWx0ZXIuc3RhcnREYXRlO1xuICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBmaWx0ZXIuZW5kRGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydzdGFydERhdGUnXSA9IGZpbHRlci5zdGFydERhdGU7XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnZW5kRGF0ZSddID0gZmlsdGVyLmVuZERhdGU7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gW107XG4gICAgYXdhaXQgdGhpcy5nZXRQYWRlRGF0YVNvdXJjZSh0cnVlKTtcbiAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB7fTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcblxuICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LmZvckVhY2godmlldyA9PiB7XG4gICAgICB2aWV3LmRhdGFzZXRJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLCBmaWx0ZXIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbERlZmF1bHRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0LCB0cnVlKTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYWRlRGF0YVNvdXJjZShjb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnKHRoaXMucGFnZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IGRhdGEucGFnZU5hbWU7XG4gICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcgPSBkYXRhO1xuXG4gICAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICAvLyB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMzAnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgICAgLy8gdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KCcxJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEaXZFbGVtZW50cyh0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIGZhbHNlKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdldENvbXBvbmVudENvbmZpZ1NldCgpO1xuICAgICAgICAgICAgLy8gdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cblxuXG4gIGdldENvbXBvbmVudENvbmZpZ1NldCgpIHtcbiAgICBsZXQgZGF0YXNldCA9IHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpO1xuICAgIGxldCB2aWV3Q29tcG9uZW50ID0gdGhpcy5zZXJ2aWNlLmdldEFwcFZpZXdDb25maWdzKCk7XG5cbiAgICBmb3JrSm9pbih7XG4gICAgICBkYXRhc2V0Q29uZmlnOiBkYXRhc2V0LFxuICAgICAgdmlld0NvbmZpZzogdmlld0NvbXBvbmVudFxuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKHsgZGF0YXNldENvbmZpZywgdmlld0NvbmZpZyB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZSA9IHZpZXdDb25maWc7XG4gICAgICAgIHRoaXMuZGF0YVNldE1vZGFsID0gZGF0YXNldENvbmZpZztcbiAgICAgICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQgPSBbXTtcbiAgICAgICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcblxuICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgICAgICB3aWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5maWx0ZXJUeXBlID09PSAnZGF0ZScgfHwgZWxlbWVudC5maWx0ZXJUeXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtjb3VudCwgdW5pdF0gPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5lbmREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuc3RhcnREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcInN0YXRpY1wiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuc3RhcnREYXRlID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICh0eXBlb2YgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9wZXJhdG9yTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQub3BlcmF0b3JOYW1lXSA9IEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBbZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXJbZWxlbWVudC5hcGlOYW1lXSA9IGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlLmpvaW4oXCIsXCIpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgbGV0IGRhdGFzZXRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGxldCB2aWV3SWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB3aWRnZXQud2lkZ2V0Tm9kZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVByb3BlcnRpZXMuZGlzcGxheSkge1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJZHMuYWRkKHZpZXcuZGF0YXNldElkKTtcbiAgICAgICAgICAgICAgICB2aWV3SWRzLmFkZCh2aWV3LnZpZXdJZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHsgdmlld0lkOiB2aWV3LnZpZXdJZCwgdmlld05hbWU6IG5vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsIGRpc3BsYXlLZXk6IHZpZXcua3BpQ29uZmlnLmtleVRvUGFzcyB9KVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vZm9yIFJURE1TIG9wZXJhdG9ybmFtZVxuICAgICAgICAgIC8vIHRoaXMub3BlcmF0b3JOYW1lID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snb3BlcmF0b3JOYW1lJ107XG4gICAgICAgICAgLy8gaWYgKHRoaXMub3BlcmF0b3JOYW1lKSB7XG4gICAgICAgICAgLy8gICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXJbJ29wZXJhdG9yX2tleSddID0gdGhpcy5vcGVyYXRvck5hbWU7XG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgdmlld0lkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgXCJmaWx0ZXJzXCI6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdEZpbHRlcnMpKSxcbiAgICAgICAgICAgICAgXCJrZXlUb1Bhc3NcIjogW10sXG4gICAgICAgICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBcIm5hdHVyYWxcIixcbiAgICAgICAgICAgICAgXCJkcmlsbGRvd25Gcm9tXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwid2lkZ2V0SWRcIjogd2lkZ2V0LndpZGdldElkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5zZXQoZWxlbWVudCwgb2JqKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICB3aWRnZXRJZDogd2lkZ2V0LndpZGdldElkLFxuICAgICAgICAgICAgcGFnZUlkOiB3aWRnZXQucGFnZUlkLFxuICAgICAgICAgICAgZmlsdGVyczogZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICBkYXRhc2V0SWRzOiBkYXRhc2V0SWRzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LnB1c2gob2JqKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zdGF0ZURhdGFTb3VyY2UpO1xuXG5cbiAgICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG4gICAgICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG4gICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LmZvckVhY2godmlldyA9PiB7XG4gICAgICAgICAgdmlldy5kYXRhc2V0SWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gKGRhdGFzZXRDb25maWcgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLCB2aWV3LmZpbHRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgbGV0IHVybFBhcmFtczogYW55ID0gZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyXG4gICAgICAgICAgdXJsUGFyYW1zWydwYWdlSWQnXSA9IHRoaXMucGFnZUlkXG4gICAgICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtczogdXJsUGFyYW1zLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSksIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRGF0YXNldCBDcmVhdGlvbicpXG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBhc3luYyBjcmVhdGVEaXZFbGVtZW50cyhkYXRhc2V0QnlJZCwgY29udGV4dCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZHluYW1pY0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgLy8gQWRkIGZpbHRlciBzZWN0aW9uXG4gICAgaWYgKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoID4gMCkge1xuXG4gICAgICBjb25zdCBmaXJzdFdpZGdldCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbMF07XG4gICAgICBjb25zdCByb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGxldCB3X2hlaWdodCA9IChmaXJzdFdpZGdldC53aWRnZXRQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGZpcnN0V2lkZ2V0LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgICAgcm93RGl2LmNsYXNzTGlzdC5hZGQoZmlyc3RXaWRnZXQud2lkZ2V0UHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQpO1xuXG4gICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnN0IGZpbHRlckl0ZW1zID0gKGZpcnN0V2lkZ2V0LmZpbHRlcnMpID8gZmlyc3RXaWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcyA6IFtdO1xuICAgICAgY29uc3QgY29udGV4dF9maWx0ZXIgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy5maWx0ZXJzID8gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcuZmlsdGVycy5maWx0ZXJJdGVtcyA6IG51bGw7XG5cbiAgICAgIC8vIExvYWQgZmlsdGVyIGNvbXBvbmVudFxuICAgICAgdGhpcy5sb2FkRmlsdGVyQ29tcG9uZW50KGZpcnN0V2lkZ2V0LCBmaWx0ZXJEaXYsIGZpbHRlckl0ZW1zLCBjb250ZXh0X2ZpbHRlcik7XG4gICAgICByb3dEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBmaWx0ZXIgc2VjdGlvbiB0byB0aGUgY29udGFpbmVyXG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocm93RGl2KTtcblxuICAgICAgLy8gQ3JlYXRlIG1haW4gd3JhcHBlciBkaXYgd2l0aCBcImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgIGNvbnN0IG1haW5XcmFwcGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtYWluV3JhcHBlckRpdi5jbGFzc0xpc3QuYWRkKFwiZmxleFwiLCBcImZsZXgtcm93XCIsIFwianVzdGlmeS1iZXR3ZWVuXCIsIFwidy1mdWxsXCIpO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggd2lkZ2V0cyB0byBhZGQgZWFjaCB0byBcImZsZXggZmxleC13cmFwXCIgZGl2c1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGRpdiA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNoaWxkRGl2LmNsYXNzTGlzdC5hZGQoXCJ3LWZ1bGxcIik7XG5cbiAgICAgICAgLy8gTG9hZCB3aWRnZXQgbm9kZXMgaW50byB0aGUgY2hpbGQgZGl2XG4gICAgICAgIGlmIChkaXYud2lkZ2V0Tm9kZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgY2hpbGREaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgY2hpbGQgZGl2IHRvIHRoZSBtYWluIHdyYXBwZXJcbiAgICAgICAgbWFpbldyYXBwZXJEaXYuYXBwZW5kQ2hpbGQoY2hpbGREaXYpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgbWFpbiB3cmFwcGVyIGRpdiBhZnRlciB0aGUgZmlsdGVyRGl2XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFpbldyYXBwZXJEaXYpO1xuICAgIH1cbiAgfVxuICBsb2FkV2lkZ2V0Tm9kZXMoZGl2OiBhbnksIG1haW5JdGVtRGl2OiBhbnksIGRhdGFzZXRCeUlkOiBhbnkpIHtcbiAgICB0aGlzLm1haW5QYWdlRGl2RWxlbWVudC5zZXQoZGl2LndpZGdldElkLCBtYWluSXRlbURpdik7XG4gICAgZGl2LndpZGdldE5vZGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbSwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkLCBudWxsKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgbG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbTogYW55LCBjb250YWluZXJFbGVtZW50OiBhbnksIGRhdGFzZXRCeUlkOiBhbnksIHdpZGdldElkKSB7XG4gICAgY29uc3QgZWxlbWVudElkID0gYGlkLSR7aXRlbS5pZH1gO1xuICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2VsZW1lbnRJZH1gKTtcbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5kaXNwbGF5ICYmICFleGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHdfaGVpZ2h0ID0gaXRlbS5ub2RlUHJvcGVydGllcy5oZWlnaHQgPT09IFwiXCIgPyBcImgtYXV0b1wiIDogYGgtWyR7aXRlbS5ub2RlUHJvcGVydGllcy5oZWlnaHR9XWA7XG4gICAgICBjb25zdCBpdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpdGVtRGl2LmlkID0gZWxlbWVudElkO1xuICAgICAgaXRlbURpdi5jbGFzc0xpc3QuYWRkKGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGgsIHdfaGVpZ2h0LCAnbWItMicpO1xuICAgICAgY29uc3Qgd2lkZ2V0RGl2ID0gdGhpcy5nZXRXaWRnZXRUaXRsZURpdihpdGVtKTtcbiAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcbiAgICAgIGNvbnN0IGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdib3JkZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG4gICAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBlbGVtZW50LmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gZGF0YXNldEJ5SWRbZWxlbWVudC5kYXRhc2V0SWRdO1xuICAgICAgICBlbGVtZW50LmtwaUNvbmZpZ1snY29udGV4dE1lbnUnXSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlO1xuICAgICAgICBlbGVtZW50Wyd0aXRsZVBhcmFtcyddID0gaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRQYXJhbXMgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGl0ZW0uaWQpO1xuICAgICAgICB0aGlzLmxvYWREeW5hbWljQ29tcG9uZW50KGVsZW1lbnQsIGNvbXBfb2JqZWN0LCBpdGVtRGl2KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgbGV0IGNoaWxkZWxlbWVudENvbnRhaW5lciA9IGNvbnRhaW5lckVsZW1lbnQuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgY2hpbGRlbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGl0ZW1EaXYpO1xuICAgICAgICBpZiAoIXRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcpIHtcbiAgICAgICAgICBpdGVtRGl2LmFwcGVuZENoaWxkKGlubmVyRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhjaGlsZGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtRGl2KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZChpbm5lckRpdik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBleGlzdGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpdGVtRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgY29uc3Qgd2lkZ2V0RGl2ID0gdGhpcy5nZXRXaWRnZXRUaXRsZURpdihpdGVtKTtcbiAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcbiAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSBkYXRhc2V0QnlJZFtlbGVtZW50LmRhdGFzZXRJZF07XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydjb250ZXh0TWVudSddID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2U7XG4gICAgICAgIGVsZW1lbnRbJ3RpdGxlUGFyYW1zJ10gPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgICAgICBjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdib3JkZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG4gICAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoaW5uZXJEaXYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFdpZGdldFRpdGxlRGl2KGl0ZW0pIHtcbiAgICBjb25zdCB3aWRnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXREaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnanVzdGlmeS1iZXR3ZWVuJywgJ2ZvbnQtYm9sZCcsICd0ZXh0LW1kJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JvcmRlci1iJywgJ3AtMycsICdiZy1ncmF5LTgwMCcsICdteC0yJywgJ3JvdW5kZWQtdC1sZycpO1xuICAgIGNvbnN0IHRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgcGFyYW1zID0gaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRQYXJhbXMgfHwgXCJcIjtcbiAgICB0aXRsZURpdi5pbm5lclRleHQgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlICsgcGFyYW1zO1xuICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG5cbiAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnbWwtYXV0bycsICdzcGFjZS14LTInLCAnanVzdGlmeS1lbmQnKTsgLy8gbWwtYXV0byBwdXNoZXMgY29udGVudCB0byB0aGUgcmlnaHQgc2lkZVxuXG4gICAgLy8gQ2hlY2sgZm9yIHdpZGdldCBmaWx0ZXJcbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5pc1dpZGdldEZpbHRlcikge1xuICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ0ZpbHRlcic7XG4gICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0ge307XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsndmlld0NvbmZpZyddID0gaXRlbTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWydoYXZpbmdDb25maWcnXSA9IFtdO1xuXG4gICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXaWRnZXRGaWx0ZXJzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZpbHRlUHJvcGVydGljZSA9IFtdO1xuICAgICAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBrZXlfbmFtZSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtlbGVtZW50LmRhdGFzZXRJZF1bMF07XG4gICAgICAgICAgT2JqZWN0LmtleXMoa2V5X25hbWUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsdGVQcm9wZXJ0aWNlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbHRlUHJvcGVydGljZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBlbGVtZW50LFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLmhhdmluZ0NvbmZpZy5wdXNoKG9iailcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGl0ZW0gZmlsdGVySWRcbiAgICBpZiAoaXRlbS5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoaXRlbS5maWx0ZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpdGVtLCB3aWRnZXREaXYsIGRhdGEuZmlsdGVySXRlbXMsIGl0ZW0pO1xuICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG5vZGUgZmlsdGVyc1xuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbHRlckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIuaW5wdXRfdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgY29uc3QgdGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgdGV4dEJveC50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIHRleHRCb3gucGxhY2Vob2xkZXIgPSBgRW50ZXIgJHtmaWx0ZXIubG9jYWxfY29sdW1ufWA7XG4gICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCdweC0yJywgJ3B5LTEuNScsICdyb3VuZGVkJywgJ2JvcmRlcicsICdtci0xJywgJ2JvcmRlci1ncmF5LTUwMCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6YmctZ3JheS03MDAnLCAnZGFyazp0ZXh0LXdoaXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ1NlYXJjaCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B4LTMnLCAncHktMS41JywgJ2JnLWJsdWUtNjAwJywgJ21yLTInLCAndGV4dC13aGl0ZScsICdyb3VuZGVkJywgJ2hvdmVyOmJnLWJsdWUtNzAwJyk7XG5cbiAgICAgICAgICBjb25zdCBzZXBhcmVyb3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBzZXBhcmVyb3RCdXR0b24uaW5uZXJIVE1MID0gJ3wnO1xuXG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdldFJlYXJjaFJlc3VsdEZyb21JbnB1dEJveChzZWFyY2hUZXJtLCBpdGVtLCBmaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHRleHRCb3gpO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZXBhcmVyb3RCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICByZXR1cm4gd2lkZ2V0RGl2O1xuICB9XG5cblxuXG4gIGxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KTogYW55IHtcbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbZGF0YS5rcGlDb25maWcuY29tcG9uZW50TmFtZV07XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG5cbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuY2hhcnREYXRhU291cmNlID0gZGF0YTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uua3BpX25hbWUgPSBcIlwiO1xuICAgIGlmIChkYXRhLmtwaUNvbmZpZy5jb21wb25lbnROYW1lID09IFwiR2FtbWFBZHZhbmNlT3BlcmF0b3JUYWJsZUNvbXBvbmVudFwiIHx8IGRhdGEua3BpQ29uZmlnLmNvbXBvbmVudE5hbWUgPT0gXCJHYW1tYVRhYmxlV2l0aFBlcmNlbnRhZ2VDb21wb25lbnRcIikge1xuICAgICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLm9Sb3dDbGljay5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5nZXRSb3dDbGljayh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5vbnJpZ2h0Q2xpY2tDb250ZXh0U2VsZWN0aW9uLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmdldENvbnRleHRDbGljayh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnN0IGNzc0NsYXNzID0gXCJ3LWZ1bGxcIjtcbiAgICB0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbG9hZEZpbHRlckNvbXBvbmVudChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCwgZmlsdGVySXRlbXMsIGNvbnRleHRfZmlsdGVyKSB7XG4gICAgbGV0IHVzZXJOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJfbmFtZScpXG4gICAgbGV0IHNlbGVjdGVkRGF0ZXMgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0U3RhcnREYXRlLCBlbmREYXRlOiB0aGlzLmRlZmF1bHRFbmREYXRlIH1cbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbJ0FwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQnXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uuc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmZpbHRlckl0ZW1zID0gZmlsdGVySXRlbXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnBhZ2VUaXRsZSA9IHRoaXMucGFnZVRpdGxlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5icmVhZF9jcnVtYnNfY29udGFpbmVyID0gdGhpcy5rcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5pc0VkaXRCdXR0b24gPSAodXNlck5hbWUgJiYgdXNlck5hbWUgPT0gXCJhZG1pblwiKSA/IHRydWUgOiBmYWxzZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNBZHZhbmNlQnV0dG9uID0gdHJ1ZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0RmlsdGVyUGFnZUNvbmZpZy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0RmlsdGVyc0ZvclRlbXBsYXRlKHZhbHVlKTtcbiAgICB9KTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0T3BlcmF0b3JOYW1lLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5sb2FkRGF0YUJ5T3BlcmF0b3IodmFsdWUpO1xuICAgIH0pO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRDb250ZXh0RmlsdGVyRGF0YS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q29udGV4dEZpbHRlckRhdGEodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnN0IGNzc0NsYXNzID0gXCJ3LWZ1bGxcIjtcbiAgICB0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG4gIGxvYWRXaWRnZXRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zLCB2aWV3SWRzKSB7XG4gICAgbGV0IHVzZXJOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJfbmFtZScpXG4gICAgbGV0IHNlbGVjdGVkRGF0ZXMgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0U3RhcnREYXRlLCBlbmREYXRlOiB0aGlzLmRlZmF1bHRFbmREYXRlIH1cbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbJ0FkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQnXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uuc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmZpbHRlckl0ZW1zID0gZmlsdGVySXRlbXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnZpZXdJZHMgPSB2aWV3SWRzO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmdldFdpZGdldEZpbHRlckNvbmZpZy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIC8vIGZvciBjb250ZXh0IG1lbnUgZnVuY3Rpb25cbiAgZ2V0Q29udGV4dENsaWNrKGV2ZW50KSB7XG4gICAgY29uc3Qgc3RhdGVEYXRhID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5rZXlzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRWaWV3SW5kZXggPSBzdGF0ZURhdGEuaW5kZXhPZihldmVudC52aWV3SWQpO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRWaWV3SW5kZXggKyAxOyBpIDwgc3RhdGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKHN0YXRlRGF0YVtpXSlcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKChub2RlOiBhbnksIG5vZGVJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LmRyaWxsZG93blRvKSkge1xuICAgICAgICAgIGxldCB2aWV3ID0gZWxlbWVudC53aWRnZXROb2RlW25vZGVJbmRleF07XG4gICAgICAgICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGV2ZW50LmRyaWxsZG93bkZyb20pKTtcbiAgICAgICAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBjb250ZW50Vmlldy5kYXRhc2V0SWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGNvbnRlbnRWaWV3LmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGRlbGV0ZWRWaWV3SWRzKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKHZpZXdWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgdmlld1ZhbHVlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKHZpZXdJZCA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodmlld0lkLnZpZXdJZCA9PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5zb21lKGl0ZW0gPT4gaXRlbS52aWV3SWQgPT09IHZpZXdJZC52aWV3SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCBleGlzdHMsIHB1c2ggdGhlIG5ldyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdJZDogdmlld0lkLnZpZXdJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lOiBub2RlLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUtleTogdmlld0lkLmtwaUNvbmZpZy5rZXlUb1Bhc3NcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGEgPSB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZGVsZXRlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZpZXdWYWx1ZS5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3VmFsdWUuaWR9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFRvSGlkZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgdG8gSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUb0hpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLmZpbHRlcihlID0+IGUuZGlzcGxheUtleSAhPT0gZXZlbnQua2V5VG9QYXNzKTtcbiAgICAgICAgICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICBcImZpbHRlcnNcIjogYXBwbGllZEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgXCJrZXlUb1Bhc3NcIjogdGhpcy51cGRhdGVPcGVyYXRvckRhdGEoZXZlbnQua2V5VG9QYXNzLCBldmVudC5kYXRhKSxcbiAgICAgICAgICAgICAgICBcImRyaWxsRG93blR5cGVcIjogZXZlbnQuZHJpbGxEb3duVHlwZSxcbiAgICAgICAgICAgICAgICBcImRyaWxsZG93bkZyb21cIjogZXZlbnQuZHJpbGxkb3duRnJvbSxcbiAgICAgICAgICAgICAgICBcIndpZGdldElkXCI6IGVsZW1lbnQud2lkZ2V0SWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5zZXQodmFsWyd2aWV3SWQnXSwgb2JqKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgICAgICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlldy5pZH1gO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIGVsZW1lbnQud2lkZ2V0SWQpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIGVsZW1lbnQud2lkZ2V0SWQpO1xuICAgICAgICAgICAgfSwgMjAwKTtcblxuXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IGFwcGxpZWRGaWx0ZXJzWydvcGVyYXRpb25GaWx0ZXInXSxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9kZS5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8vIGZvciByb3cgY2xpY2sgZnVuY3Rpb25cbiAgYXN5bmMgZ2V0Um93Q2xpY2soZXZlbnQpIHtcbiAgICBjb25zdCB2aWV3aWRfZm9yX3NhbWUgPSBldmVudC52aWV3SWQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KHZpZXdpZF9mb3Jfc2FtZSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIGNvbnNvbGUud2Fybigndmlld2lkIG5vdCBmb3VuZCBpbiBzdGF0ZURhdGFTb3VyY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0V2lkZ2V0SWQgPSB0YXJnZXQud2lkZ2V0SWQ7XG4gICAgY29uc3QgbWF0Y2hpbmdWaWV3SWRzID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5lbnRyaWVzKCkpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlLndpZGdldElkID09PSB0YXJnZXRXaWRnZXRJZClcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuXG4gICAgY29uc29sZS5sb2coJ01hdGNoaW5nIHZpZXdpZHM6JywgdGFyZ2V0V2lkZ2V0SWQpO1xuXG4gICAgLy8gY29uc3Qgc3RhdGVEYXRhID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5rZXlzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRWaWV3SW5kZXggPSBtYXRjaGluZ1ZpZXdJZHMuaW5kZXhPZihldmVudC52aWV3SWQpO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRWaWV3SW5kZXggKyAxOyBpIDwgbWF0Y2hpbmdWaWV3SWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKG1hdGNoaW5nVmlld0lkc1tpXSk7XG4gICAgfVxuICAgIGNvbnN0IGhvdXJseU5vZGUgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzXG4gICAgICAubWFwKHdpZGdldCA9PiB3aWRnZXQud2lkZ2V0Tm9kZS5maW5kKG5vZGUgPT4gdGhpcy5nZXRIb3VybHlEYXRhKG5vZGUpKSlcbiAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICBpZiAoaG91cmx5Tm9kZSAmJiBldmVudC5rZXlUb1Bhc3MuaW5jbHVkZXMoXCJyZWNvcmREYXRlXCIpKSB7XG4gICAgICB0aGlzLmdldFZpZXdCeVJvd0NMaWNrRm9ySG91cmx5Q2hhcnQoZXZlbnQsIGhvdXJseU5vZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWaWV3Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LnZpZXdJZCkpKVxuICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcblxuXG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcbiAgICBpZiAoY3VycmVudFZpZXdOb2RlKSB7XG5cbiAgICAgIGNvbnN0IGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3ID0gW107XG4gICAgICBjdXJyZW50Vmlld05vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goYXN5bmMgZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50KSB7XG4gICAgICAgICAgaWYgKGRlbGV0ZWRWaWV3SWRzICYmIGRlbGV0ZWRWaWV3SWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKHZpZXdWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdJZC52aWV3SWQgPT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5zb21lKGl0ZW0gPT4gaXRlbS52aWV3SWQgPT09IHZpZXdJZC52aWV3SWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3TmFtZTogY3VycmVudFZpZXdOb2RlLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZGVsZXRlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB2aWV3VmFsdWUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3VmFsdWUuaWR9YDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9IaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICBpZiAoZWxlbWVudC5rcGlDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudCkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zPy5ldmVudFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgbGV0IGV2ZW50VHlwZSA9IGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZTtcbiAgICAgICAgICAgICAgbGV0IGFzc29jaWF0ZWRWaWV3cyA9IGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3cztcbiAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzc29jaWF0ZWRWaWV3cyAmJiBhc3NvY2lhdGVkVmlld3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IHZpZXdGb3JEcmlsbERvd24gb2YgYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckNvbmRpdGlvbiA9IG5ldyBVUkxTZWFyY2hQYXJhbXModmlld0ZvckRyaWxsRG93blsnZmlsdGVyQ29uZGl0aW9uJ10pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckNvbmRpdGlvbi5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmlld0ZvckRyaWxsRG93blsndmlld0lkJ10uZm9yRWFjaCh2aWV3Rm9ySWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJpbGRvd25zRm9yQ3VycmVudFZpZXcucHVzaCh2aWV3Rm9ySWQpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBhc3NvY2lhdGVkVmlld3MpIHtcbiAgICAgICAgICAgICAgICAgIGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3LnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gJ3NhbWVWaWV3RHJpbGxkb3duJykge1xuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZHJpbGRvd25zRm9yQ3VycmVudFZpZXcubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB2aWV3SWRGb3JOZXh0IG9mIGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Vmlld05vZGUgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIHZpZXdJZEZvck5leHQpKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcblxuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3QnlSb3dDTGljayhldmVudCwgbmV4dFZpZXdOb2RlLCB0YXJnZXRXaWRnZXRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBuZXh0Vmlld0luZGV4ID0gbWF0Y2hpbmdWaWV3SWRzLmluZGV4T2YoZXZlbnQudmlld0lkKSArIDE7XG5cbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdXaWRnZXQgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzXG4gICAgICAgICAgICAgICAgLmZpbmQod2lkZ2V0ID0+IHdpZGdldC53aWRnZXRJZCA9PT0gdGFyZ2V0V2lkZ2V0SWQpO1xuXG4gICAgICAgICAgICAgIGNvbnN0IG5leHRWaWV3ID0gbWF0Y2hpbmdXaWRnZXQ/LndpZGdldE5vZGU/LltuZXh0Vmlld0luZGV4XTtcblxuICAgICAgICAgICAgICAvLyBjb25zdCBuZXh0VmlldyA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgICAgICAgLy8gICAubWFwKHdpZGdldCA9PiB3aWRnZXQud2lkZ2V0Tm9kZVtuZXh0Vmlld0luZGV4XSlcbiAgICAgICAgICAgICAgLy8gICAuZmluZChub2RlID0+IG5vZGUpO1xuXG4gICAgICAgICAgICAgIGlmIChuZXh0Vmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFZpZXdCeVJvd0NMaWNrKGV2ZW50LCBuZXh0VmlldywgdGFyZ2V0V2lkZ2V0SWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gIGVsc2Uge1xuXG4gICAgICAgICAgLy8gICBjb25zdCBuZXh0Vmlld0luZGV4ID0gc3RhdGVEYXRhLmluZGV4T2YoZXZlbnQudmlld0lkKSArIDE7XG4gICAgICAgICAgLy8gICBjb25zdCBuZXh0VmlldyA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgICAvLyAgICAgLm1hcCh3aWRnZXQgPT4gd2lkZ2V0LndpZGdldE5vZGVbbmV4dFZpZXdJbmRleF0pXG4gICAgICAgICAgLy8gICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgICAgICAvLyAgIGlmIChuZXh0Vmlldykge1xuICAgICAgICAgIC8vICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgLy8gICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2soZXZlbnQsIG5leHRWaWV3KTtcbiAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAvLyB9XG5cblxuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIC8vIGZvciB2aWV3IGdyb3VwXG5cblxuXG4gICAgfVxuICB9XG5cbiAgZ2V0Vmlld0J5Um93Q0xpY2tGb3JIb3VybHlDaGFydChldmVudCwgbm9kZSkge1xuXG4gICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGl0ZW0udmlld0lkKSk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaXRlbS5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKG5vZGUsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIG51bGwpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIG51bGwpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG4gIH1cblxuICBhc3luYyBnZXRWaWV3QnlSb3dDTGljayhldmVudCwgdmlldywgdGFyZ2V0V2lkZ2V0SWQpIHtcblxuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuZ2V0U2V0T3BlcmF0b3JGaWx0ZXIoZXZlbnQsIHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChldmVudC52aWV3SWQpKTtcbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBjb250ZW50Vmlldy5kYXRhc2V0SWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGNvbnRlbnRWaWV3LmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChhcGlDYWxscylcblxuICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld2ZvckRhdGFTZXQgPT4ge1xuXG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcImZpbHRlcnNcIjogYXBwbGllZEZpbHRlcnMsXG4gICAgICAgIFwia2V5VG9QYXNzXCI6IHRoaXMudXBkYXRlT3BlcmF0b3JEYXRhKGV2ZW50LmtleVRvUGFzcywgZXZlbnQuZGF0YSksXG4gICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICBcImRyaWxsZG93bkZyb21cIjogZXZlbnQuZHJpbGxkb3duRnJvbSxcbiAgICAgICAgXCJ3aWRnZXRJZFwiOiB0YXJnZXRXaWRnZXRJZFxuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZpZXdmb3JEYXRhU2V0Wyd2aWV3SWQnXSwgb2JqKVxuICAgIH0pO1xuICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgLy8gdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIHRhcmdldFdpZGdldElkKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRhcmdldFdpZGdldElkKTtcbiAgICB9LCAyMDApO1xuICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IGFwcGxpZWRGaWx0ZXJzWydvcGVyYXRpb25GaWx0ZXInXSxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgIH07XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgIC8vIH0pO1xuICAgIC8vIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbShjb250YWluZXI6IGFueSwgd2lkZ2V0SWQpIHtcblxuICAgIGlmICh3aWRnZXRJZCkge1xuICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIuZ2V0KHdpZGdldElkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcgfSk7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJyB9KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICB9XG5cbiAgZmluZFdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLndpZGdldE5vZGUgJiYgY29uZmlnLndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZFdpZGdldEJ5SWQoY29uZmlnLndpZGdldE5vZGUsIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1cGRhdGVPcGVyYXRvckRhdGEoa2V5X25hbWU6IHN0cmluZ1tdLCB2YWx1ZV9kYXRhOiBhbnkpOiBhbnkge1xuICAgIGxldCBvcGVyYXRvciA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleV9uYW1lKSB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcbiAgICAgIG9ialtrZXldID0gdmFsdWVfZGF0YVtrZXldO1xuICAgICAgb3BlcmF0b3IucHVzaChvYmopXG4gICAgfVxuICAgIHJldHVybiBvcGVyYXRvcjtcbiAgfVxuXG5cbiAgZ2V0RWxlbWVudE9mQ3VycmVudFZpZXcobm9kZSwgdmlld0lkKSB7XG4gICAgY29uc3QgbWF0Y2hlZE9iamVjdCA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZpbmQob2JqZWN0ID0+IG9iamVjdC52aWV3SWQgPT09IHZpZXdJZCk7XG4gICAgcmV0dXJuIG1hdGNoZWRPYmplY3QgPyBub2RlIDogbnVsbDtcbiAgfVxuICBnZXRIb3VybHlEYXRhKG5vZGUpIHtcbiAgICBjb25zdCBtYXRjaGVkT2JqZWN0ID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZmluZChvYmplY3QgPT4gb2JqZWN0LmtwaUNvbmZpZy5mb3JtYXRlID09PSAnaG91cmx5Jyk7XG4gICAgcmV0dXJuIG1hdGNoZWRPYmplY3QgPyBub2RlIDogbnVsbDtcbiAgfVxuXG4gIGdldFNldE9wZXJhdG9yRmlsdGVyKG9iamVjdERhdGEsIHByZXZpb3VzVmlld1N0YXRlcykge1xuXG4gICAgY29uc3QgeyBkYXRhLCBrZXlUb1Bhc3MgfSA9IG9iamVjdERhdGE7XG4gICAgY29uc3QgYXBwbGllZEZpbHRlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocHJldmlvdXNWaWV3U3RhdGVzLmZpbHRlcnMub3BlcmF0aW9uRmlsdGVyKSk7XG5cbiAgICBrZXlUb1Bhc3MuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICcnKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRLZXkgPT09IFwicmVjb3JkZGF0ZVwiICYmIFwic3RhcnREYXRlXCIgaW4gYXBwbGllZEZpbHRlciAmJiBcImVuZERhdGVcIiBpbiBhcHBsaWVkRmlsdGVyKSB7XG4gICAgICAgICAgYXBwbGllZEZpbHRlci5zdGFydERhdGUgPSBkYXRhW2tleV07XG4gICAgICAgICAgYXBwbGllZEZpbHRlci5lbmREYXRlID0gZGF0YVtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXJba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGRlZmF1bHRvcGVyYXRpb25GaWx0ZXIgPSB0aGlzLmdsb2JhbERlZmF1bHRGaWx0ZXIub3BlcmF0aW9uRmlsdGVyO1xuICAgIGlmIChkZWZhdWx0b3BlcmF0aW9uRmlsdGVyKSB7XG4gICAgICBPYmplY3Qua2V5cyhkZWZhdWx0b3BlcmF0aW9uRmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmICghYXBwbGllZEZpbHRlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgYXBwbGllZEZpbHRlcltrZXldID0gZGVmYXVsdG9wZXJhdGlvbkZpbHRlcltrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXIgPSB7fTtcbiAgICBvcGVyYXRpb25GaWx0ZXJbJ29wZXJhdGlvbkZpbHRlciddID0gYXBwbGllZEZpbHRlcjtcbiAgICByZXR1cm4gb3BlcmF0aW9uRmlsdGVyO1xuICB9XG5cblxuICBnZXRSZWFyY2hSZXN1bHRGcm9tSW5wdXRCb3goaW5wdXRWYWx1ZSwgdmlld0NvbmZpZywgZmlsdGVyT2JqZWN0KSB7XG4gICAgbGV0IHZpZXcgPSB2aWV3Q29uZmlnO1xuICAgIGxldCBldmVudE5vZGUgPSB7IGRhdGE6IHt9LCBrZXlUb1Bhc3M6IFtdIH1cbiAgICBldmVudE5vZGUuZGF0YVtmaWx0ZXJPYmplY3Quc2VydmVyX2NvbHVtbl0gPSBpbnB1dFZhbHVlO1xuICAgIGV2ZW50Tm9kZVsna2V5VG9QYXNzJ10gPSBbZmlsdGVyT2JqZWN0LnNlcnZlcl9jb2x1bW5dO1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50Tm9kZSwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGNvbnRlbnRWaWV3LnZpZXdJZCkpO1xuICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZpZXdDb25maWcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3Q29uZmlnLmlkfWA7XG4gICAgY29uc3QgZWxlbWVudFRvSGlkZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgdG8gSFRNTEVsZW1lbnRcbiAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgZWxlbWVudFRvSGlkZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcblxuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5maWx0ZXIoZSA9PiBlLmRpc3BsYXlLZXkgIT09IHZpZXdDb25maWcua2V5VG9QYXNzKTtcblxuICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gdHJ1ZTtcbiAgICAgIC8vIHZpZXcubm9kZVByb3BlcnRpZXNbJ3dpZGdldFBhcmFtcyddID0gZXZlbnQudGFibGVUaXRsZTtcbiAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUodmlldywgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgbnVsbCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgbnVsbCk7XG4gICAgICB9LCAyMDApO1xuICAgICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgICAgcGFyYW1zW2ZpbHRlck9iamVjdC5zZXJ2ZXJfY29sdW1uXSA9IGlucHV0VmFsdWU7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICB9O1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgIH0pO1xuICB9XG5cblxuICBzdWJtaXRGaWx0ZXIoKSB7XG4gICAgbGV0IHZpZXcgPSB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS52aWV3Q29uZmlnO1xuICAgIC8vIGxldCBjYWxfdmFsdWUgPSAocGFyc2VGbG9hdChzZWFyY2hUZXJtKSAvIDEwMClcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmhhdmluZ0RhdGFPYmplY3QgPSB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS5oYXZpbmdDb25maWcuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnZhbHVlICE9PSBcIlwiKTtcbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChjb250ZW50Vmlldy52aWV3SWQpO1xuICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycy5maWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG5cbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3RoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWcuaWR9YDtcbiAgICAgIGNvbnN0IGVsZW1lbnRUb0hpZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IHRvIEhUTUxFbGVtZW50XG4gICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLmZpbHRlcihlID0+IGUuZGlzcGxheUtleSAhPT0gdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2Uudmlld0NvbmZpZy5rZXlUb1Bhc3MpO1xuICAgICAgdGhpcy5pc1dpZGdldEZpbHRlcnMgPSBmYWxzZTtcbiAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgICAvLyB2aWV3Lm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICAvLyBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlldy5pZH1gO1xuICAgICAgLy8gY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIG51bGwpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIG51bGwpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpIHtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBjb25zdCBkZWxldGVkVmlld0lkcyA9IFtdO1xuICAgIHZhbHVlLnZpZXdOb2Rlcy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGxldCB3aWRnZXRGaWx0ZXIgPSB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoaXRlbS52aWV3SWQpO1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gd2lkZ2V0RmlsdGVyLmZpbHRlcnM7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBjb25zdCBoYXZpbmcgPSBPYmplY3QuZW50cmllcyh2YWx1ZS5vcGVyYXRpb25GaWx0ZXIpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBjb2x1bW5OYW1lOiBrZXksXG4gICAgICAgIGRhdGFUeXBlOiBcImZsb2F0XCIsXG4gICAgICAgIG9wZXJhdG9yOiBcImd0ZVwiLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGZvdW5kLmNvbmZpZy5xdWVyeUNvbmZpZ1snaGF2aW5ncyddID0gaGF2aW5nO1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpdGVtLmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIC8vIHZhbHVlLnZpZXdOb2Rlcy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2YWx1ZS52aWV3Tm9kZXMsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIG51bGwpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIG51bGwpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGFzeW5jIGxvYWREYXRhQnlPcGVyYXRvcihvcE5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhvcE5hbWUpXG4gICAgbGV0IGZpbHRlciA9IHsgb3BlcmF0aW9uRmlsdGVyOiB7IHN0YXJ0RGF0ZTogXCJcIiwgZW5kRGF0ZTogXCJcIiwgb3BlcmF0b3Jfa2V5OiBcIlwiIH0gfTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydzdGFydERhdGUnXSA9IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydlbmREYXRlJ10gPSB0aGlzLmRlZmF1bHRFbmREYXRlO1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbJ29wZXJhdG9yX2tleSddID0gb3BOYW1lO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcblxuICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgXCJvcGVyYXRvck5hbWVcIjogb3BOYW1lXG4gICAgICB9LFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgfTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG5cbiAgICAvLyB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZyA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UodHJ1ZSk7XG4gICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG4gICAgbGV0IGFwaUNhbGxzID0gW107XG5cbiAgICB0aGlzLmFsbFdpZGdldEJ5RGF0YXNldC5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgdmlldy5kYXRhc2V0SWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpZCwgZmlsdGVyKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxEZWZhdWx0RmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0pO1xuXG4gIH1cblxuICBhc3luYyBnZXRDb250ZXh0RmlsdGVyRGF0YSh2YWx1ZSkge1xuXG4gICAgbGV0IGZpbHRlciA9IHsgb3BlcmF0aW9uRmlsdGVyOiB7IHN0YXJ0RGF0ZTogXCJcIiwgZW5kRGF0ZTogXCJcIiB9IH07XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnc3RhcnREYXRlJ10gPSB0aGlzLmRlZmF1bHRTdGFydERhdGU7XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnZW5kRGF0ZSddID0gdGhpcy5kZWZhdWx0RW5kRGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyW3ZhbHVlLm9wZXJhdG9yTmFtZV0gPSB0aGlzLnBhcnNlSW5wdXQodmFsdWUuZGVmYXVsdEZpbHRlclZhbHVlKTtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgbGV0IG9iaiA9IHt9O1xuICAgIG9ialt2YWx1ZS5vcGVyYXRvck5hbWVdID0gdmFsdWUuZGVmYXVsdEZpbHRlclZhbHVlO1xuICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IG9iaixcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgIH07XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuXG4gICAgLy8gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmdldFBhZGVEYXRhU291cmNlKHRydWUpO1xuICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG4gICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgIHZpZXcuZGF0YXNldElkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGlkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaWQsIGZpbHRlcikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuZ2xvYmFsRGVmYXVsdEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgdGhpcy5jcmVhdGVEaXZFbGVtZW50cyh0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIHRydWUpO1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHBhcnNlSW5wdXQoaW5wdXQpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcblxuICAgIGlmIChpbnB1dC5pbmNsdWRlcygnLCcpKSB7XG4gICAgICByZXR1cm4gaW5wdXQuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gIH1cblxuXG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuXG48ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIFwiICNkeW5hbWljQ29udGFpbmVyPjwvZGl2PlxuPC9kaXY+XG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzV2lkZ2V0RmlsdGVyc1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjgwMFwiIFtoZWlnaHRdPVwiNDAwXCJcbiAgICBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEZpbHRlclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cbiAgICAgICAgICAgIDxkeC1zY3JvbGwtdmlldyBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInODUlJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLmhhdmluZ0NvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb2x1bW5OYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2dldCcsJ2xldCddXCIgWyhuZ01vZGVsKV09XCJpdGVtLm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3cgYm9yZGVyLXRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGaWx0ZXIoKVwiPlN1Ym1pdDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cblxuXG4iXX0=