gamma-app-controller 1.1.26 → 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.
- package/esm2020/lib/application-controller/application-controller.module.mjs +20 -20
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
- package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
- package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
- package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
- package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
- package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
- package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
- package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
- package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
- package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
- package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
- package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
- package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
- package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
- package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
- package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
- package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
- package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
- package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
- package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
- package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
- package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +1 -1
- package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +2 -2
- package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
- package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +149 -0
- package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
- package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
- package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +149 -0
- package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
- package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
- package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
- package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +154 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +154 -0
- package/esm2020/public-api.mjs +30 -20
- package/fesm2015/gamma-app-controller.mjs +5121 -399
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +5082 -399
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-controller.module.d.ts +19 -19
- package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
- package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
- package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
- package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
- package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +1 -1
- package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
- package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
- package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
- package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
- package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
- package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
- package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
- package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
- package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
- package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
- package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
- package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
- package/package.json +1 -1
- package/public-api.d.ts +29 -19
- package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
- package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
- package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
- package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
- package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
- package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
- package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
- package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
- package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
- package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
- package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
- /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import moment from '../../../application-controller/moment-helper';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "../../../application-controller/common";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "devextreme-angular/core";
|
|
8
|
+
import * as i5 from "devextreme-angular/ui/popup";
|
|
9
|
+
import * as i6 from "devextreme-angular/ui/select-box";
|
|
10
|
+
import * as i7 from "@angular/forms";
|
|
11
|
+
import * as i8 from "@angular/material/icon";
|
|
12
|
+
import * as i9 from "../../gamma-advance-filter/gamma-advance-filter.component";
|
|
13
|
+
import * as i10 from "../../gamma-bread-crumbs/bread-crumbs.component";
|
|
14
|
+
export class AppAdvanceHeaderComponent {
|
|
15
|
+
constructor(activatedRoute, route, commonService) {
|
|
16
|
+
this.activatedRoute = activatedRoute;
|
|
17
|
+
this.route = route;
|
|
18
|
+
this.commonService = commonService;
|
|
19
|
+
this.toggleEvent = new EventEmitter();
|
|
20
|
+
this.autoload_button = true;
|
|
21
|
+
this.toolTipText = 'By Date Range';
|
|
22
|
+
this.defaultSelectedOperator = 'AFGAT';
|
|
23
|
+
this.operaTorList = [
|
|
24
|
+
{ name: "AFTEL", value: "AFGAT" },
|
|
25
|
+
{ name: "ROSHAN", value: "AFGTD" },
|
|
26
|
+
{ name: "MTNAF", value: "AFGAR" },
|
|
27
|
+
{ name: "ETISALAT", value: "AFGEA" },
|
|
28
|
+
{ name: "AWCC", value: "AFGAW" },
|
|
29
|
+
];
|
|
30
|
+
this.daterange = {};
|
|
31
|
+
this.daterange_options = {
|
|
32
|
+
locale: { format: 'YYYY-MM-DD' },
|
|
33
|
+
alwaysShowCalendars: true,
|
|
34
|
+
showCustomRangeLabel: true,
|
|
35
|
+
ranges: {
|
|
36
|
+
Today: [moment(), moment()],
|
|
37
|
+
'Last 1 Month': [moment().subtract(30, 'days'), moment()],
|
|
38
|
+
'Last 3 Month': [moment().subtract(91, 'days'), moment()],
|
|
39
|
+
'Last 6 Month': [moment().subtract(182, 'days'), moment()],
|
|
40
|
+
'Last 12 Month': [moment().subtract(365, 'days'), moment()],
|
|
41
|
+
'Last 13 Months': [
|
|
42
|
+
moment().subtract(12, 'month').startOf('month'),
|
|
43
|
+
moment(),
|
|
44
|
+
],
|
|
45
|
+
'This Month': [moment().startOf('month'), moment().endOf('month')],
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
this.srvTypeDataSource = [];
|
|
49
|
+
this.srvTypeDisplayValue = [];
|
|
50
|
+
this.selectedDateRangeOrServtype = new EventEmitter();
|
|
51
|
+
this.getFilterPageConfig = new EventEmitter();
|
|
52
|
+
this.getOperatorName = new EventEmitter();
|
|
53
|
+
this.getContextFilterData = new EventEmitter();
|
|
54
|
+
}
|
|
55
|
+
set filterItems(value) {
|
|
56
|
+
if (value === undefined || value.length === 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
let displayStartDate = '';
|
|
61
|
+
let displayEndDate = '';
|
|
62
|
+
this.filterItemsForFilter = value;
|
|
63
|
+
value.forEach(element => {
|
|
64
|
+
if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
|
|
65
|
+
if (element.momentFunction == "monthPicker" || element.momentFunction == "weekPicker") {
|
|
66
|
+
if (element.apiName === "startDate") {
|
|
67
|
+
if (element.display) {
|
|
68
|
+
displayStartDate = moment(this.selectedDates[element.apiName]).format('MMM-YYYY');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (element.apiName === "endDate") {
|
|
72
|
+
if (element.display) {
|
|
73
|
+
displayEndDate = moment(this.selectedDates[element.apiName]).format('MMM-YYYY');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (element.apiName === "startDate") {
|
|
79
|
+
if (element.display) {
|
|
80
|
+
displayStartDate = moment(this.selectedDates[element.apiName]).format(element.momentFormat);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (element.apiName === "endDate") {
|
|
84
|
+
if (element.display) {
|
|
85
|
+
displayEndDate = moment(this.selectedDates[element.apiName]).format(element.momentFormat);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (element.defaultFilterType === "static" && element.defaultFilterValue !== "") {
|
|
91
|
+
if (element.apiName === "startDate") {
|
|
92
|
+
if (element.display) {
|
|
93
|
+
displayStartDate = moment(this.selectedDates[element.apiName]).format(element.momentFormat);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (element.apiName === "endDate") {
|
|
97
|
+
if (element.display) {
|
|
98
|
+
displayEndDate = moment(this.selectedDates[element.apiName]).format(element.momentFormat);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
if (displayStartDate && displayEndDate) {
|
|
104
|
+
this.selectedDetesforView = `${displayStartDate} - ${displayEndDate}`;
|
|
105
|
+
}
|
|
106
|
+
else if (displayStartDate) {
|
|
107
|
+
this.selectedDetesforView = displayStartDate;
|
|
108
|
+
}
|
|
109
|
+
else if (displayEndDate) {
|
|
110
|
+
this.selectedDetesforView = displayEndDate;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.selectedDetesforView = '';
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
set contextFilterItems(value) {
|
|
118
|
+
if (!value) {
|
|
119
|
+
this.contextFilterItemsForFilter = value;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.contextFilterItemsForFilter = [];
|
|
123
|
+
value.forEach(element => {
|
|
124
|
+
if (element.filterType == "context") {
|
|
125
|
+
this.contextFilterItemsForFilter.push(element);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
this.activatedRoute.queryParams.subscribe((params) => {
|
|
129
|
+
this.defaultFilterValue = this.getDefaultFilterValue(params);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getContextMenuChange(event) {
|
|
134
|
+
if (event.event) {
|
|
135
|
+
const foundObject = this.contextFilterItemsForFilter.find(item => item.defaultFilterValue === event.value);
|
|
136
|
+
this.getContextFilterData.emit(foundObject);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
ngOnInit() {
|
|
140
|
+
const userData = localStorage.getItem('user_name');
|
|
141
|
+
if (userData == 'admin') {
|
|
142
|
+
this.isEditButton = true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
pageAutoloadStopRun() {
|
|
146
|
+
if (this.autoload_button == true) {
|
|
147
|
+
this.autoload_button = false;
|
|
148
|
+
clearInterval(this.time_out_id);
|
|
149
|
+
this.time_out_id = 0;
|
|
150
|
+
}
|
|
151
|
+
else if (this.autoload_button == false) {
|
|
152
|
+
this.autoload_button = true;
|
|
153
|
+
this.time_out_id = 1;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
callPageDocumentation() {
|
|
157
|
+
}
|
|
158
|
+
getDateOrServeTypeValueChange(node) {
|
|
159
|
+
this.selectedDateRangeOrServtype.emit(node);
|
|
160
|
+
}
|
|
161
|
+
editKpi() {
|
|
162
|
+
const pageId = this.activatedRoute.snapshot.queryParams['pageId'];
|
|
163
|
+
let navigationExtras = {
|
|
164
|
+
queryParams: {
|
|
165
|
+
pageId: pageId,
|
|
166
|
+
contentType: "edit"
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
this.route.navigate(['/apps/controlPanel/pageConfigController'], navigationExtras);
|
|
170
|
+
}
|
|
171
|
+
advanceFilterKpi() {
|
|
172
|
+
this.isAdvanceFilter = true;
|
|
173
|
+
}
|
|
174
|
+
getSerchFilter(filter) {
|
|
175
|
+
this.isAdvanceFilter = false;
|
|
176
|
+
let displayStartDate = '';
|
|
177
|
+
let displayEndDate = '';
|
|
178
|
+
this.filterItemsForFilter.forEach(element => {
|
|
179
|
+
if (element.filterType === 'date' || element.filterType === 'datetime') {
|
|
180
|
+
if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
|
|
181
|
+
if (element.momentFunction == "monthPicker" || element.momentFunction == "weekPicker") {
|
|
182
|
+
if (element.apiName === "startDate") {
|
|
183
|
+
if (element.display) {
|
|
184
|
+
displayStartDate = moment(filter.startDate).format('MMM-YYYY');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
displayEndDate = moment(filter.endDate).format('MMM-YYYY');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (element.apiName === "endDate") {
|
|
191
|
+
filter.endDate = moment(filter.endDate).format(element.momentFormat);
|
|
192
|
+
if (element.display) {
|
|
193
|
+
displayEndDate = moment(filter.endDate).format('MMM-YYYY');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
let [count, unit] = element.defaultFilterValue.split(',');
|
|
199
|
+
if (element.apiName === "startDate") {
|
|
200
|
+
if (element.display) {
|
|
201
|
+
filter.startDate = moment(filter.startDate).format(element.momentFormat);
|
|
202
|
+
displayStartDate = filter.startDate;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
filter.startDate = moment(filter.endDate)[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (element.apiName === "endDate") {
|
|
209
|
+
filter.endDate = moment(filter.endDate).format(element.momentFormat);
|
|
210
|
+
if (element.display) {
|
|
211
|
+
displayEndDate = filter.endDate;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
if (displayStartDate && displayEndDate) {
|
|
219
|
+
this.selectedDetesforView = `${displayStartDate} - ${displayEndDate}`;
|
|
220
|
+
}
|
|
221
|
+
else if (displayStartDate) {
|
|
222
|
+
this.selectedDetesforView = displayStartDate;
|
|
223
|
+
}
|
|
224
|
+
else if (displayEndDate) {
|
|
225
|
+
this.selectedDetesforView = displayEndDate;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.selectedDetesforView = '';
|
|
229
|
+
}
|
|
230
|
+
this.getFilterPageConfig.emit(filter);
|
|
231
|
+
}
|
|
232
|
+
getOperatorDataSource(event) {
|
|
233
|
+
this.defaultSelectedOperator = event.value;
|
|
234
|
+
let operator_logo_map = this.commonService.getOperatorBylogo();
|
|
235
|
+
this.operatorLogo = operator_logo_map[event.value];
|
|
236
|
+
this.defaultSelectedOperator = event.value;
|
|
237
|
+
if (event.event) {
|
|
238
|
+
let navigation = {
|
|
239
|
+
queryParams: {
|
|
240
|
+
"operatorName": event.value
|
|
241
|
+
},
|
|
242
|
+
queryParamsHandling: "merge"
|
|
243
|
+
};
|
|
244
|
+
this.route.navigate([], navigation);
|
|
245
|
+
const opName = localStorage.getItem('operator_key');
|
|
246
|
+
if (opName) {
|
|
247
|
+
localStorage.removeItem('operator_key');
|
|
248
|
+
localStorage.setItem('operator_key', event.value);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
localStorage.setItem('operator_key', event.value);
|
|
252
|
+
}
|
|
253
|
+
this.getOperatorName.emit(event.value);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
getDefaultFilterValue(params) {
|
|
257
|
+
for (const item of this.contextFilterItemsForFilter) {
|
|
258
|
+
if (params[item.operatorName] === item.defaultFilterValue) {
|
|
259
|
+
return item.defaultFilterValue;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
getOperationFilter(params) {
|
|
265
|
+
const operationFilter = {};
|
|
266
|
+
for (const item of this.contextFilterItemsForFilter) {
|
|
267
|
+
if (params[item.operatorName] === item.defaultFilterValue) {
|
|
268
|
+
operationFilter[item.operatorName] = item.defaultFilterValue;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return operationFilter;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
AppAdvanceHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppAdvanceHeaderComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
275
|
+
AppAdvanceHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AppAdvanceHeaderComponent, selector: "app-advance-header", inputs: { pageTitle: "pageTitle", bread_crumbs_container: "bread_crumbs_container", isEditButton: "isEditButton", isAdvanceButton: "isAdvanceButton", selectedDates: "selectedDates", filterItems: "filterItems", contextFilterItems: "contextFilterItems" }, outputs: { toggleEvent: "toggleEvent", selectedDateRangeOrServtype: "selectedDateRangeOrServtype", getFilterPageConfig: "getFilterPageConfig", getOperatorName: "getOperatorName", getContextFilterData: "getContextFilterData" }, ngImport: i0, template: "<div class=\"flex flex-col mb-2\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n {{ pageTitle }}\n </h2>\n </div>\n <div class=\"\">\n <!-- INCOMING -->\n <gamma-bread-crumbs [kpi_data_container]=\"bread_crumbs_container\"></gamma-bread-crumbs>\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n <div class=\"mx-2\" *ngIf=\"isEditButton\">\n <div (click)=\"editKpi()\"\n class=\"bg-blue-700 cursor-pointer dark:bg-blue-600 dark:focus:ring-blue-800 dark:hover:bg-blue-700 focus:outline-none focus:ring-4 focus:ring-blue-300 font-medium hover:bg-blue-800 mr-2 px-2.5 py-2 rounded text-sm text-white ng-star-inserted\">\n Edit\n </div>\n </div>\n <ng-container *ngIf=\"contextFilterItemsForFilter && contextFilterItemsForFilter.length !== 0 \">\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\" >\n <dx-select-box [items]=\"contextFilterItemsForFilter\" (onValueChanged)=\"getContextMenuChange($event)\" displayExpr=\"label\" valueExpr=\"defaultFilterValue\"\n [(ngModel)]=\"defaultFilterValue\"></dx-select-box>\n </div>\n </ng-container>\n \n <div class=\"w-1 h-full border-l-2\" *ngIf=\"isEditButton\"></div>\n\n <div class=\"mx-2\">\n <div class=\"cursor-pointer\" (click)=\"advanceFilterKpi()\"> {{selectedDetesforView}}</div>\n </div>\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\" *ngIf=\"isAdvanceButton\">\n <button class=\"mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base\"\n aria-haspopup=\"menu\" (click)=\"advanceFilterKpi()\">\n <span class=\"mat-button-wrapper\">\n <span class=\"relative\">\n <mat-icon title=\"Filters\" [svgIcon]=\"'heroicons_outline:adjustments'\">\n </mat-icon>\n </span>\n </span>\n </button>\n </div>\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <!-- <div class=\"mx-2\">\n <button class=\"mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base\"\n aria-haspopup=\"menu\">\n <span class=\"mat-button-wrapper\">\n <span class=\"relative\">\n <mat-icon (click)=\"callPageDocumentation()\" title=\"Add Filters\" [svgIcon]=\"\n 'heroicons_outline:question-mark-circle'\n \">\n </mat-icon>\n </span>\n </span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> -->\n\n </div>\n </div>\n</div>\n\n<dx-popup [(visible)]=\"isAdvanceFilter\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"600\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <app-gamma-advance-filter [kpiId]=\"'231212'\" [filterOperatorData]=\"filterItemsForFilter\"\n [isButtonDesiable]=\"isAdvanceFilter\" [filterStartDate]=\"filterStartDate\" [filterEndDate]=\"filterEndDate\"\n (filterDataObject)=\"getSerchFilter($event)\"></app-gamma-advance-filter>\n </div>\n</dx-popup>", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i5.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: i6.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: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.GammaAdvanceFilterComponent, selector: "app-gamma-advance-filter", inputs: ["kpiId", "filterStartDate", "filterEndDate", "browser_api_config", "isButtonDesiable", "filterOperatorData"], outputs: ["filterDataObject"] }, { kind: "component", type: i10.BreadCrumbsComponent, selector: "gamma-bread-crumbs", inputs: ["kpi_data_container"] }] });
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppAdvanceHeaderComponent, decorators: [{
|
|
277
|
+
type: Component,
|
|
278
|
+
args: [{ selector: 'app-advance-header', template: "<div class=\"flex flex-col mb-2\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n {{ pageTitle }}\n </h2>\n </div>\n <div class=\"\">\n <!-- INCOMING -->\n <gamma-bread-crumbs [kpi_data_container]=\"bread_crumbs_container\"></gamma-bread-crumbs>\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n <div class=\"mx-2\" *ngIf=\"isEditButton\">\n <div (click)=\"editKpi()\"\n class=\"bg-blue-700 cursor-pointer dark:bg-blue-600 dark:focus:ring-blue-800 dark:hover:bg-blue-700 focus:outline-none focus:ring-4 focus:ring-blue-300 font-medium hover:bg-blue-800 mr-2 px-2.5 py-2 rounded text-sm text-white ng-star-inserted\">\n Edit\n </div>\n </div>\n <ng-container *ngIf=\"contextFilterItemsForFilter && contextFilterItemsForFilter.length !== 0 \">\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\" >\n <dx-select-box [items]=\"contextFilterItemsForFilter\" (onValueChanged)=\"getContextMenuChange($event)\" displayExpr=\"label\" valueExpr=\"defaultFilterValue\"\n [(ngModel)]=\"defaultFilterValue\"></dx-select-box>\n </div>\n </ng-container>\n \n <div class=\"w-1 h-full border-l-2\" *ngIf=\"isEditButton\"></div>\n\n <div class=\"mx-2\">\n <div class=\"cursor-pointer\" (click)=\"advanceFilterKpi()\"> {{selectedDetesforView}}</div>\n </div>\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\" *ngIf=\"isAdvanceButton\">\n <button class=\"mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base\"\n aria-haspopup=\"menu\" (click)=\"advanceFilterKpi()\">\n <span class=\"mat-button-wrapper\">\n <span class=\"relative\">\n <mat-icon title=\"Filters\" [svgIcon]=\"'heroicons_outline:adjustments'\">\n </mat-icon>\n </span>\n </span>\n </button>\n </div>\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <!-- <div class=\"mx-2\">\n <button class=\"mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base\"\n aria-haspopup=\"menu\">\n <span class=\"mat-button-wrapper\">\n <span class=\"relative\">\n <mat-icon (click)=\"callPageDocumentation()\" title=\"Add Filters\" [svgIcon]=\"\n 'heroicons_outline:question-mark-circle'\n \">\n </mat-icon>\n </span>\n </span>\n <span class=\"mat-button-focus-overlay\"></span>\n </button>\n </div> -->\n\n </div>\n </div>\n</div>\n\n<dx-popup [(visible)]=\"isAdvanceFilter\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"600\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <app-gamma-advance-filter [kpiId]=\"'231212'\" [filterOperatorData]=\"filterItemsForFilter\"\n [isButtonDesiable]=\"isAdvanceFilter\" [filterStartDate]=\"filterStartDate\" [filterEndDate]=\"filterEndDate\"\n (filterDataObject)=\"getSerchFilter($event)\"></app-gamma-advance-filter>\n </div>\n</dx-popup>" }]
|
|
279
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.CommonService }]; }, propDecorators: { pageTitle: [{
|
|
280
|
+
type: Input
|
|
281
|
+
}], bread_crumbs_container: [{
|
|
282
|
+
type: Input
|
|
283
|
+
}], isEditButton: [{
|
|
284
|
+
type: Input
|
|
285
|
+
}], isAdvanceButton: [{
|
|
286
|
+
type: Input
|
|
287
|
+
}], selectedDates: [{
|
|
288
|
+
type: Input
|
|
289
|
+
}], toggleEvent: [{
|
|
290
|
+
type: Output
|
|
291
|
+
}], selectedDateRangeOrServtype: [{
|
|
292
|
+
type: Output
|
|
293
|
+
}], getFilterPageConfig: [{
|
|
294
|
+
type: Output
|
|
295
|
+
}], getOperatorName: [{
|
|
296
|
+
type: Output
|
|
297
|
+
}], getContextFilterData: [{
|
|
298
|
+
type: Output
|
|
299
|
+
}], filterItems: [{
|
|
300
|
+
type: Input,
|
|
301
|
+
args: ['filterItems']
|
|
302
|
+
}], contextFilterItems: [{
|
|
303
|
+
type: Input,
|
|
304
|
+
args: ['contextFilterItems']
|
|
305
|
+
}] } });
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYXBwLWFkdmFuY2UtaGVhZGVyL2FwcC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FwcC1hZHZhbmNlLWhlYWRlci9hcHAtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxNQUFNLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7Ozs7OztBQU1uRSxNQUFNLE9BQU8seUJBQXlCO0lBNkRsQyxZQUNZLGNBQThCLEVBQzlCLEtBQWEsRUFDYixhQUE0QjtRQUY1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBeEQ5QixnQkFBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBU3pFLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRXZCLGdCQUFXLEdBQUcsZUFBZSxDQUFDO1FBQzlCLDRCQUF1QixHQUFHLE9BQU8sQ0FBQztRQU1sQyxpQkFBWSxHQUFHO1lBQ1gsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDakMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDbEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFP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QTdVTSx5QkFBeUI7MEdBQXpCLHlCQUF5QiwyaEJDUnRDLHdvSUErRVc7MkZEdkVFLHlCQUF5QjtrQkFKckMsU0FBUzsrQkFDSSxvQkFBb0I7c0pBSXJCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBaURVLDJCQUEyQjtzQkFBM0MsTUFBTTtnQkFDVSxtQkFBbUI7c0JBQW5DLE1BQU07Z0JBQ1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFDVSxvQkFBb0I7c0JBQXBDLE1BQU07Z0JBWUgsV0FBVztzQkFEZCxLQUFLO3VCQUFDLGFBQWE7Z0JBc0VoQixrQkFBa0I7c0JBRHJCLEtBQUs7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uLy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvbW9tZW50LWhlbHBlcic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9jb21tb24nO1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZS1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hcHAtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYnJlYWRfY3J1bWJzX2NvbnRhaW5lcjogYW55O1xuICAgIEBJbnB1dCgpIGlzRWRpdEJ1dHRvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc0FkdmFuY2VCdXR0b246IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVzOiBhbnk7XG5cbiAgICBAT3V0cHV0KCkgdG9nZ2xlRXZlbnQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gICAgaXNBZHZhbmNlRmlsdGVyOiBib29sZWFuO1xuICAgIGJyb3dzZXJfY29uZmlnOiBhbnk7XG4gICAga3BpX2lkOiBhbnk7XG5cbiAgICBmaWx0ZXJTdGFydERhdGU7XG4gICAgZmlsdGVyRW5kRGF0ZTtcbiAgICBmaWx0ZXJPcHRpb25zO1xuXG4gICAgYXV0b2xvYWRfYnV0dG9uID0gdHJ1ZTtcbiAgICBwcml2YXRlIHRpbWVfb3V0X2lkO1xuICAgIHRvb2xUaXBUZXh0ID0gJ0J5IERhdGUgUmFuZ2UnO1xuICAgIGRlZmF1bHRTZWxlY3RlZE9wZXJhdG9yID0gJ0FGR0FUJztcblxuICAgIGlzb3BlcmF0b3JLZXk6IGJvb2xlYW47XG5cbiAgICBkZWZhdWx0RmlsdGVyVmFsdWU6IGFueTtcblxuICAgIG9wZXJhVG9yTGlzdCA9IFtcbiAgICAgICAgeyBuYW1lOiBcIkFGVEVMXCIsIHZhbHVlOiBcIkFGR0FUXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIlJPU0hBTlwiLCB2YWx1ZTogXCJBRkdURFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJNVE5BRlwiLCB2YWx1ZTogXCJBRkdBUlwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJFVElTQUxBVFwiLCB2YWx1ZTogXCJBRkdFQVwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJBV0NDXCIsIHZhbHVlOiBcIkFGR0FXXCIgfSxcbiAgICBdXG5cbiAgICBwdWJsaWMgZGF0ZXJhbmdlOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgZGF0ZXJhbmdlX29wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgbG9jYWxlOiB7IGZvcm1hdDogJ1lZWVktTU0tREQnIH0sXG4gICAgICAgIGFsd2F5c1Nob3dDYWxlbmRhcnM6IHRydWUsXG4gICAgICAgIHNob3dDdXN0b21SYW5nZUxhYmVsOiB0cnVlLFxuICAgICAgICByYW5nZXM6IHtcbiAgICAgICAgICAgIFRvZGF5OiBbbW9tZW50KCksIG1vbWVudCgpXSxcbiAgICAgICAgICAgIC8vIFllc3RlcmRheTogW21vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyksIG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxuICAgICAgICAgICAgJ0xhc3QgMSBNb250aCc6IFttb21lbnQoKS5zdWJ0cmFjdCgzMCwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICAgICAgICAgJ0xhc3QgMyBNb250aCc6IFttb21lbnQoKS5zdWJ0cmFjdCg5MSwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICAgICAgICAgJ0xhc3QgNiBNb250aCc6IFttb21lbnQoKS5zdWJ0cmFjdCgxODIsICdkYXlzJyksIG1vbWVudCgpXSxcbiAgICAgICAgICAgICdMYXN0IDEyIE1vbnRoJzogW21vbWVudCgpLnN1YnRyYWN0KDM2NSwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICAgICAgICAgJ0xhc3QgMTMgTW9udGhzJzogW1xuICAgICAgICAgICAgICAgIG1vbWVudCgpLnN1YnRyYWN0KDEyLCAnbW9udGgnKS5zdGFydE9mKCdtb250aCcpLFxuICAgICAgICAgICAgICAgIG1vbWVudCgpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICdUaGlzIE1vbnRoJzogW21vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJyksIG1vbWVudCgpLmVuZE9mKCdtb250aCcpXSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgc3J2VHlwZURhdGFTb3VyY2U6IGFueSA9IFtdO1xuICAgIHNydlR5cGVEaXNwbGF5VmFsdWU6IGFueSA9IFtdO1xuICAgIHNlbGVjdGVkRGV0ZXNmb3JWaWV3OiBhbnk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZERhdGVSYW5nZU9yU2VydnR5cGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0RmlsdGVyUGFnZUNvbmZpZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXRPcGVyYXRvck5hbWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0Q29udGV4dEZpbHRlckRhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogUm91dGVyLFxuICAgICAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgKSB7XG5cbiAgICB9XG5cbiAgICBmaWx0ZXJJdGVtc0ZvckZpbHRlcjogYW55O1xuICAgIG9wZXJhdG9yTG9nbzogc3RyaW5nO1xuICAgIEBJbnB1dCgnZmlsdGVySXRlbXMnKVxuICAgIHNldCBmaWx0ZXJJdGVtcyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgbGV0IGRpc3BsYXlTdGFydERhdGUgPSAnJztcbiAgICAgICAgICAgIGxldCBkaXNwbGF5RW5kRGF0ZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtc0ZvckZpbHRlciA9IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGZvcm1hdHRlZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJtb250aFBpY2tlclwiIHx8IGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJ3ZWVrUGlja2VyXCIpeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGFydERhdGUgPSBtb21lbnQodGhpcy5zZWxlY3RlZERhdGVzW2VsZW1lbnQuYXBpTmFtZV0pLmZvcm1hdCgnTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVuZERhdGUgPSBtb21lbnQodGhpcy5zZWxlY3RlZERhdGVzW2VsZW1lbnQuYXBpTmFtZV0pLmZvcm1hdCgnTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3RhcnREYXRlID0gbW9tZW50KHRoaXMuc2VsZWN0ZWREYXRlc1tlbGVtZW50LmFwaU5hbWVdKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RW5kRGF0ZSA9IG1vbWVudCh0aGlzLnNlbGVjdGVkRGF0ZXNbZWxlbWVudC5hcGlOYW1lXSkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZGVmYXVsdEZpbHRlclR5cGUgPT09IFwic3RhdGljXCIgJiYgZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUgIT09IFwiXCIpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0YXJ0RGF0ZSA9IG1vbWVudCh0aGlzLnNlbGVjdGVkRGF0ZXNbZWxlbWVudC5hcGlOYW1lXSkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFbmREYXRlID0gbW9tZW50KHRoaXMuc2VsZWN0ZWREYXRlc1tlbGVtZW50LmFwaU5hbWVdKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMuZ2V0RmlsdGVyUGFnZUNvbmZpZy5lbWl0KGZpbHRlcl9jb25maWcpXG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5U3RhcnREYXRlICYmIGRpc3BsYXlFbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERldGVzZm9yVmlldyA9IGAke2Rpc3BsYXlTdGFydERhdGV9IC0gJHtkaXNwbGF5RW5kRGF0ZX1gO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U3RhcnREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERldGVzZm9yVmlldyA9IGRpc3BsYXlTdGFydERhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlFbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERldGVzZm9yVmlldyA9IGRpc3BsYXlFbmREYXRlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGV0ZXNmb3JWaWV3ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgY29udGV4dEZpbHRlckl0ZW1zRm9yRmlsdGVyOiBhbnk7XG4gICAgQElucHV0KCdjb250ZXh0RmlsdGVySXRlbXMnKVxuICAgIHNldCBjb250ZXh0RmlsdGVySXRlbXModmFsdWUpIHtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRGaWx0ZXJJdGVtc0ZvckZpbHRlciA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0RmlsdGVySXRlbXNGb3JGaWx0ZXIgPSBbXTtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PSBcImNvbnRleHRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRGaWx0ZXJJdGVtc0ZvckZpbHRlci5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXJWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdEZpbHRlclZhbHVlKHBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGdldENvbnRleHRNZW51Q2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5ldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRPYmplY3QgPSB0aGlzLmNvbnRleHRGaWx0ZXJJdGVtc0ZvckZpbHRlci5maW5kKGl0ZW0gPT4gaXRlbS5kZWZhdWx0RmlsdGVyVmFsdWUgPT09IGV2ZW50LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dEZpbHRlckRhdGEuZW1pdChmb3VuZE9iamVjdCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuXG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcl9uYW1lJyk7XG4gICAgICAgIGlmICh1c2VyRGF0YSA9PSAnYWRtaW4nKSB7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdEJ1dHRvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgcGFnZUF1dG9sb2FkU3RvcFJ1bigpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b2xvYWRfYnV0dG9uID09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2xvYWRfYnV0dG9uID0gZmFsc2U7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZV9vdXRfaWQpO1xuICAgICAgICAgICAgdGhpcy50aW1lX291dF9pZCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hdXRvbG9hZF9idXR0b24gPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2xvYWRfYnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudGltZV9vdXRfaWQgPSAxO1xuICAgICAgICAgICAgLy8gdGhpcy5kYXRlc1VwZGF0ZWQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsUGFnZURvY3VtZW50YXRpb24oKSB7XG5cbiAgICB9XG5cblxuICAgIGdldERhdGVPclNlcnZlVHlwZVZhbHVlQ2hhbmdlKG5vZGU6IGFueSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlT3JTZXJ2dHlwZS5lbWl0KG5vZGUpXG4gICAgfVxuXG5cbiAgICBlZGl0S3BpKCkge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydwYWdlSWQnXTtcbiAgICAgICAgbGV0IG5hdmlnYXRpb25FeHRyYXM6IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImVkaXRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3V0ZS5uYXZpZ2F0ZShbJy9hcHBzL2NvbnRyb2xQYW5lbC9wYWdlQ29uZmlnQ29udHJvbGxlciddLCBuYXZpZ2F0aW9uRXh0cmFzKTtcbiAgICB9XG5cblxuICAgIGFkdmFuY2VGaWx0ZXJLcGkoKSB7XG4gICAgICAgIHRoaXMuaXNBZHZhbmNlRmlsdGVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRTZXJjaEZpbHRlcihmaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5pc0FkdmFuY2VGaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRpc3BsYXlTdGFydERhdGUgPSAnJztcbiAgICAgICAgbGV0IGRpc3BsYXlFbmREYXRlID0gJyc7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJJdGVtc0ZvckZpbHRlci5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGUnIHx8IGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJtb250aFBpY2tlclwiIHx8IGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJ3ZWVrUGlja2VyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGFydERhdGUgPSBtb21lbnQoZmlsdGVyLnN0YXJ0RGF0ZSkuZm9ybWF0KCdNTU0tWVlZWScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFbmREYXRlID0gbW9tZW50KGZpbHRlci5lbmREYXRlKS5mb3JtYXQoJ01NTS1ZWVlZJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5lbmREYXRlID0gbW9tZW50KGZpbHRlci5lbmREYXRlKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUVuZERhdGUgPSBtb21lbnQoZmlsdGVyLmVuZERhdGUpLmZvcm1hdCgnTU1NLVlZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoZmlsdGVyLnN0YXJ0RGF0ZSkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0YXJ0RGF0ZSA9IGZpbHRlci5zdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudChmaWx0ZXIuZW5kRGF0ZSlbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmVuZERhdGUgPSBtb21lbnQoZmlsdGVyLmVuZERhdGUpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RW5kRGF0ZSA9IGZpbHRlci5lbmREYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cblxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRpc3BsYXlTdGFydERhdGUgJiYgZGlzcGxheUVuZERhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREZXRlc2ZvclZpZXcgPSBgJHtkaXNwbGF5U3RhcnREYXRlfSAtICR7ZGlzcGxheUVuZERhdGV9YDtcbiAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U3RhcnREYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGV0ZXNmb3JWaWV3ID0gZGlzcGxheVN0YXJ0RGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5RW5kRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERldGVzZm9yVmlldyA9IGRpc3BsYXlFbmREYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERldGVzZm9yVmlldyA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZXRGaWx0ZXJQYWdlQ29uZmlnLmVtaXQoZmlsdGVyKVxuICAgIH1cblxuXG5cbiAgICBnZXRPcGVyYXRvckRhdGFTb3VyY2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0ZWRPcGVyYXRvciA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBsZXQgb3BlcmF0b3JfbG9nb19tYXAgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0T3BlcmF0b3JCeWxvZ28oKTtcbiAgICAgICAgdGhpcy5vcGVyYXRvckxvZ28gPSBvcGVyYXRvcl9sb2dvX21hcFtldmVudC52YWx1ZV1cbiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0ZWRPcGVyYXRvciA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBpZiAoZXZlbnQuZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIFwib3BlcmF0b3JOYW1lXCI6IGV2ZW50LnZhbHVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJvdXRlLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IG9wTmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdvcGVyYXRvcl9rZXknKVxuICAgICAgICAgICAgaWYgKG9wTmFtZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdvcGVyYXRvcl9rZXknKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnb3BlcmF0b3Jfa2V5JywgZXZlbnQudmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnb3BlcmF0b3Jfa2V5JywgZXZlbnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nZXRPcGVyYXRvck5hbWUuZW1pdChldmVudC52YWx1ZSlcbiAgICAgICAgfVxuXG5cbiAgICB9XG5cblxuICAgIGdldERlZmF1bHRGaWx0ZXJWYWx1ZShwYXJhbXM6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb250ZXh0RmlsdGVySXRlbXNGb3JGaWx0ZXIpIHtcbiAgICAgICAgICAgIGlmIChwYXJhbXNbaXRlbS5vcGVyYXRvck5hbWVdID09PSBpdGVtLmRlZmF1bHRGaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRPcGVyYXRpb25GaWx0ZXIocGFyYW1zOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXI6IGFueSA9IHt9O1xuICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb250ZXh0RmlsdGVySXRlbXNGb3JGaWx0ZXIpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIG1hdGNoZXMgdGhlIG9wZXJhdG9yTmFtZSBhbmQgaXRzIHZhbHVlXG4gICAgICAgICAgaWYgKHBhcmFtc1tpdGVtLm9wZXJhdG9yTmFtZV0gPT09IGl0ZW0uZGVmYXVsdEZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgICBvcGVyYXRpb25GaWx0ZXJbaXRlbS5vcGVyYXRvck5hbWVdID0gaXRlbS5kZWZhdWx0RmlsdGVyVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiBvcGVyYXRpb25GaWx0ZXI7XG4gICAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtYi0yXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGRhcms6YmctdHJhbnNwYXJlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbWwtMVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGZsb2F0LXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLXNpemUtMlwiIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfc29saWQ6dGVtcGxhdGUnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aDJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTJ4bCBtZDp0ZXh0LTJ4bCBweS0zIGZvbnQtZXh0cmFib2xkIGl0ZW1zLWNlbnRlciBtbC0yIHRyYWNraW5nLXRpZ2h0IGxlYWRpbmctNSB0cnVuY2F0ZSBjYXBpdGFsaXplXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHBhZ2VUaXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIElOQ09NSU5HIC0tPlxuICAgICAgICAgICAgICAgIDxnYW1tYS1icmVhZC1jcnVtYnMgW2twaV9kYXRhX2NvbnRhaW5lcl09XCJicmVhZF9jcnVtYnNfY29udGFpbmVyXCI+PC9nYW1tYS1icmVhZC1jcnVtYnM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWwtMiBwLTAgbS0wXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCIgKm5nSWY9XCJpc0VkaXRCdXR0b25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJlZGl0S3BpKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWJsdWUtNzAwIGN1cnNvci1wb2ludGVyIGRhcms6YmctYmx1ZS02MDAgZGFyazpmb2N1czpyaW5nLWJsdWUtODAwIGRhcms6aG92ZXI6YmctYmx1ZS03MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctNCBmb2N1czpyaW5nLWJsdWUtMzAwIGZvbnQtbWVkaXVtIGhvdmVyOmJnLWJsdWUtODAwIG1yLTIgcHgtMi41IHB5LTIgcm91bmRlZCB0ZXh0LXNtIHRleHQtd2hpdGUgbmctc3Rhci1pbnNlcnRlZFwiPlxuICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0RmlsdGVySXRlbXNGb3JGaWx0ZXIgJiYgY29udGV4dEZpbHRlckl0ZW1zRm9yRmlsdGVyLmxlbmd0aCAhPT0gMCBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xIGgtZnVsbCBib3JkZXItbC0yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJjb250ZXh0RmlsdGVySXRlbXNGb3JGaWx0ZXJcIiAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0Q29udGV4dE1lbnVDaGFuZ2UoJGV2ZW50KVwiIGRpc3BsYXlFeHByPVwibGFiZWxcIiB2YWx1ZUV4cHI9XCJkZWZhdWx0RmlsdGVyVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRlZmF1bHRGaWx0ZXJWYWx1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xIGgtZnVsbCBib3JkZXItbC0yXCIgKm5nSWY9XCJpc0VkaXRCdXR0b25cIj48L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWR2YW5jZUZpbHRlcktwaSgpXCI+IHt7c2VsZWN0ZWREZXRlc2ZvclZpZXd9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xIGgtZnVsbCBib3JkZXItbC0yXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiICpuZ0lmPVwiaXNBZHZhbmNlQnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1hdC1mb2N1cy1pbmRpY2F0b3IgbWF0LW1lbnUtdHJpZ2dlciBtYXQtaWNvbi1idXR0b24gbWF0LWJ1dHRvbi1iYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIiAoY2xpY2spPVwiYWR2YW5jZUZpbHRlcktwaSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHRpdGxlPVwiRmlsdGVyc1wiIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTphZGp1c3RtZW50cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xIGgtZnVsbCBib3JkZXItbC0yXCI+PC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1hdC1mb2N1cy1pbmRpY2F0b3IgbWF0LW1lbnUtdHJpZ2dlciBtYXQtaWNvbi1idXR0b24gbWF0LWJ1dHRvbi1iYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtYnV0dG9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNhbGxQYWdlRG9jdW1lbnRhdGlvbigpXCIgdGl0bGU9XCJBZGQgRmlsdGVyc1wiIFtzdmdJY29uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm9pY29uc19vdXRsaW5lOnF1ZXN0aW9uLW1hcmstY2lyY2xlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQWR2YW5jZUZpbHRlclwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjYwMFwiXG4gICAgW2hlaWdodF09XCInYXV0bydcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJGaWx0ZXJcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxhcHAtZ2FtbWEtYWR2YW5jZS1maWx0ZXIgW2twaUlkXT1cIicyMzEyMTInXCIgW2ZpbHRlck9wZXJhdG9yRGF0YV09XCJmaWx0ZXJJdGVtc0ZvckZpbHRlclwiXG4gICAgICAgICAgICBbaXNCdXR0b25EZXNpYWJsZV09XCJpc0FkdmFuY2VGaWx0ZXJcIiBbZmlsdGVyU3RhcnREYXRlXT1cImZpbHRlclN0YXJ0RGF0ZVwiIFtmaWx0ZXJFbmREYXRlXT1cImZpbHRlckVuZERhdGVcIlxuICAgICAgICAgICAgKGZpbHRlckRhdGFPYmplY3QpPVwiZ2V0U2VyY2hGaWx0ZXIoJGV2ZW50KVwiPjwvYXBwLWdhbW1hLWFkdmFuY2UtZmlsdGVyPlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD4iXX0=
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import moment from '../../../application-controller/moment-helper';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../../application-controller/common";
|
|
5
|
+
import * as i2 from "ngx-toastr";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "../../loader/loader.component";
|
|
8
|
+
export class GammSingleNumberCardComponent {
|
|
9
|
+
constructor(commonService, toastr) {
|
|
10
|
+
this.commonService = commonService;
|
|
11
|
+
this.toastr = toastr;
|
|
12
|
+
this.isLoader = true;
|
|
13
|
+
this.colors = [
|
|
14
|
+
"text-green-500",
|
|
15
|
+
"text-orange-500",
|
|
16
|
+
"text-blue-500",
|
|
17
|
+
"text-purple-500",
|
|
18
|
+
"text-yellow-500"
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
set chartDataSource(value) {
|
|
22
|
+
this.objectdataSource = value;
|
|
23
|
+
if (!this.objectdataSource || this.objectdataSource.length === 0) {
|
|
24
|
+
this.isChartvisible = false;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.isLoader = true;
|
|
29
|
+
this.selectedColumn = value.kpiConfig?.dataConfig?.columns?.[0]?.dataField || "";
|
|
30
|
+
this.sortBy = value.kpiConfig?.dataConfig?.sortBy;
|
|
31
|
+
if (value.kpiConfig.dataSource?.length) {
|
|
32
|
+
this.page_config = value;
|
|
33
|
+
let sortedData = value.kpiConfig.dataSource;
|
|
34
|
+
if (this.sortBy?.length) {
|
|
35
|
+
let sortKey = this.sortBy[0];
|
|
36
|
+
sortedData = sortedData.sort((a, b) => moment(b[sortKey], "YYYY-MM-DD").diff(moment(a[sortKey], "YYYY-MM-DD")));
|
|
37
|
+
}
|
|
38
|
+
if (value.kpiConfig.formate === "daily") {
|
|
39
|
+
this.currentDateData = sortedData.length ? this.commonService.abbreviateNumber(sortedData[0][this.selectedColumn] || 0) : "0";
|
|
40
|
+
}
|
|
41
|
+
else if (value.kpiConfig.formate === "monthly") {
|
|
42
|
+
let total = sortedData.reduce((sum, item) => {
|
|
43
|
+
let value = Number(item[this.selectedColumn]) || 0;
|
|
44
|
+
return sum + value;
|
|
45
|
+
}, 0);
|
|
46
|
+
this.currentDateData = this.commonService.abbreviateNumber(total);
|
|
47
|
+
}
|
|
48
|
+
this.isLoader = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
getDynamicValue(data) {
|
|
53
|
+
if (!this.selectedColumn || !data.hasOwnProperty(this.selectedColumn)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
let value = data[this.selectedColumn];
|
|
57
|
+
const numericValue = Number(value);
|
|
58
|
+
if (!isNaN(numericValue)) {
|
|
59
|
+
return this.commonService.abbreviateNumber(numericValue);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
ngOnInit() {
|
|
64
|
+
this.randomColorClass = this.getRandomColor();
|
|
65
|
+
}
|
|
66
|
+
getRandomColor() {
|
|
67
|
+
const randomIndex = Math.floor(Math.random() * this.colors.length);
|
|
68
|
+
return this.colors[randomIndex];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
GammSingleNumberCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammSingleNumberCardComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
72
|
+
GammSingleNumberCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GammSingleNumberCardComponent, selector: "app-gamm-single-number-card", inputs: { chartDataSource: "chartDataSource" }, ngImport: i0, template: "<div class=\"flex flex-row justify-center items-start bg-gray-800 p-4 mx-2 text-center\">\n <ng-container *ngIf=\"isLoader\">\n <app-loader></app-loader>\n </ng-container>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex justify-center items-center text-4xl font-bold p-2 {{randomColorClass}}\">\n {{ currentDateData }}\n </div>\n </ng-container>\n\n</div>", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.LoaderComponent, selector: "app-loader" }] });
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammSingleNumberCardComponent, decorators: [{
|
|
74
|
+
type: Component,
|
|
75
|
+
args: [{ selector: 'app-gamm-single-number-card', template: "<div class=\"flex flex-row justify-center items-start bg-gray-800 p-4 mx-2 text-center\">\n <ng-container *ngIf=\"isLoader\">\n <app-loader></app-loader>\n </ng-container>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex justify-center items-center text-4xl font-bold p-2 {{randomColorClass}}\">\n {{ currentDateData }}\n </div>\n </ng-container>\n\n</div>" }]
|
|
76
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }]; }, propDecorators: { chartDataSource: [{
|
|
77
|
+
type: Input,
|
|
78
|
+
args: ['chartDataSource']
|
|
79
|
+
}] } });
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW0tc2luZ2xlLW51bWJlci1jYXJkL2dhbW0tc2luZ2xlLW51bWJlci1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxNQUFNLE1BQU0sK0NBQStDLENBQUM7Ozs7OztBQU9uRSxNQUFNLE9BQU8sNkJBQTZCO0lBb0J4QyxZQUNTLGFBQTRCLEVBQzNCLE1BQXFCO1FBRHRCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFYL0IsYUFBUSxHQUFZLElBQUksQ0FBQztRQUN6QixXQUFNLEdBQUc7WUFDUCxnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixpQkFBaUI7WUFDakIsaUJBQWlCO1NBQ2xCLENBQUM7SUFLRSxDQUFDO0lBS0wsSUFDRSxlQUFlLENBQUMsS0FBSztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRTlCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFL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QyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7MEhBOUZVLDZCQUE2Qjs4R0FBN0IsNkJBQTZCLG1IQ1QxQywwWkFVTTsyRkRETyw2QkFBNkI7a0JBSnpDLFNBQVM7K0JBQ0UsNkJBQTZCO2dJQWdDckMsZUFBZTtzQkFEaEIsS0FBSzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uLy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvbW9tZW50LWhlbHBlcic7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG9iamVjdGRhdGFTb3VyY2U6IGFueTtcbiAgaXNDaGFydHZpc2libGU6IGJvb2xlYW47XG4gIHBhZ2VfY29uZmlnOiBhbnk7XG4gIGN1cnJlbnREYXRlRGF0YTogYW55O1xuICBwcmV2b3VzRGF5c0RhdGE6IGFueTtcbiAgY2FsY3VsYXRlZFZhbHVlOiBhbnk7XG4gIGlzUHJldmlvdXNEYXk6IGJvb2xlYW47XG4gIHNvcnRCeTogYW55O1xuICBzZWxlY3RlZENvbHVtbjogYW55O1xuICBzdWJzY3JpYmVyX2NvdW50O1xuICBpc0xvYWRlcjogYm9vbGVhbiA9IHRydWU7IFxuICBjb2xvcnMgPSBbXG4gICAgXCJ0ZXh0LWdyZWVuLTUwMFwiLFxuICAgIFwidGV4dC1vcmFuZ2UtNTAwXCIsXG4gICAgXCJ0ZXh0LWJsdWUtNTAwXCIsXG4gICAgXCJ0ZXh0LXB1cnBsZS01MDBcIixcbiAgICBcInRleHQteWVsbG93LTUwMFwiXG4gIF07XG4gIHJhbmRvbUNvbG9yQ2xhc3M6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICkgeyB9XG5cblxuICBcblxuICBASW5wdXQoJ2NoYXJ0RGF0YVNvdXJjZScpXG5zZXQgY2hhcnREYXRhU291cmNlKHZhbHVlKSB7XG4gIHRoaXMub2JqZWN0ZGF0YVNvdXJjZSA9IHZhbHVlO1xuXG4gIGlmICghdGhpcy5vYmplY3RkYXRhU291cmNlIHx8IHRoaXMub2JqZWN0ZGF0YVNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmlzQ2hhcnR2aXNpYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4gPSB2YWx1ZS5rcGlDb25maWc/LmRhdGFDb25maWc/LmNvbHVtbnM/LlswXT8uZGF0YUZpZWxkIHx8IFwiXCI7XG4gICAgdGhpcy5zb3J0QnkgPSB2YWx1ZS5rcGlDb25maWc/LmRhdGFDb25maWc/LnNvcnRCeTtcblxuICAgIGlmICh2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhZ2VfY29uZmlnID0gdmFsdWU7XG4gICAgICBsZXQgc29ydGVkRGF0YSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlO1xuXG4gICAgICBpZiAodGhpcy5zb3J0Qnk/Lmxlbmd0aCkge1xuICAgICAgICBsZXQgc29ydEtleSA9IHRoaXMuc29ydEJ5WzBdO1xuICAgICAgICBzb3J0ZWREYXRhID0gc29ydGVkRGF0YS5zb3J0KChhLCBiKSA9PiBcbiAgICAgICAgICBtb21lbnQoYltzb3J0S2V5XSwgXCJZWVlZLU1NLUREXCIpLmRpZmYobW9tZW50KGFbc29ydEtleV0sIFwiWVlZWS1NTS1ERFwiKSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLmtwaUNvbmZpZy5mb3JtYXRlID09PSBcImRhaWx5XCIpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0ZURhdGEgPSBzb3J0ZWREYXRhLmxlbmd0aCA/IHRoaXMuY29tbW9uU2VydmljZS5hYmJyZXZpYXRlTnVtYmVyKHNvcnRlZERhdGFbMF1bdGhpcy5zZWxlY3RlZENvbHVtbl0gfHwgMCkgOiBcIjBcIjtcblxuICAgICAgfSBlbHNlIGlmICh2YWx1ZS5rcGlDb25maWcuZm9ybWF0ZSA9PT0gXCJtb250aGx5XCIpIHtcbiAgICAgICAgbGV0IHRvdGFsID0gc29ydGVkRGF0YS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZSA9IE51bWJlcihpdGVtW3RoaXMuc2VsZWN0ZWRDb2x1bW5dKSB8fCAwO1xuICAgICAgICAgIHJldHVybiBzdW0gKyB2YWx1ZTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGVEYXRhID0gdGhpcy5jb21tb25TZXJ2aWNlLmFiYnJldmlhdGVOdW1iZXIodG90YWwpO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgXG4gIH1cbn1cblxuXG5cbiAgZ2V0RHluYW1pY1ZhbHVlKGRhdGE6IGFueSk6IG51bWJlciB8IHN0cmluZyB8IGFueSB7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW4gfHwgIWRhdGEuaGFzT3duUHJvcGVydHkodGhpcy5zZWxlY3RlZENvbHVtbikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IGRhdGFbdGhpcy5zZWxlY3RlZENvbHVtbl07XG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgIC8vIGxldCBjYWxfbnVtYmVyID0gTWF0aC5hYnMobnVtZXJpY1ZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuY29tbW9uU2VydmljZS5hYmJyZXZpYXRlTnVtYmVyKG51bWVyaWNWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmFuZG9tQ29sb3JDbGFzcyA9IHRoaXMuZ2V0UmFuZG9tQ29sb3IoKTtcbiAgfVxuXG5cblxuICBnZXRSYW5kb21Db2xvcigpIHtcbiAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuY29sb3JzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JzW3JhbmRvbUluZGV4XTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1zdGFydCBiZy1ncmF5LTgwMCBwLTQgbXgtMiB0ZXh0LWNlbnRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRlclwiPlxuICAgICAgICA8YXBwLWxvYWRlcj48L2FwcC1sb2FkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC00eGwgZm9udC1ib2xkIHAtMiB7e3JhbmRvbUNvbG9yQ2xhc3N9fVwiPlxuICAgICAgICAgICAge3sgY3VycmVudERhdGVEYXRhIH19XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj4iXX0=
|