@provoly/dashboard 0.14.11 → 0.14.13

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 (108) hide show
  1. package/admin/admin.module.d.ts +2 -1
  2. package/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.d.ts +1 -0
  3. package/admin/components/admin-classes/store/admin-class.actions.d.ts +11 -0
  4. package/admin/components/admin-classes/store/admin-class.effects.d.ts +5 -0
  5. package/admin/components/admin-classes/store/admin-class.reducer.d.ts +1 -0
  6. package/admin/components/admin-classes/store/admin-class.selectors.d.ts +1 -0
  7. package/admin/i18n/en.translations.d.ts +11 -0
  8. package/admin/i18n/fr.translations.d.ts +11 -0
  9. package/admin/store/admin.service.d.ts +1 -0
  10. package/esm2022/admin/admin.module.mjs +8 -4
  11. package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +8 -4
  12. package/esm2022/admin/components/admin-classes/store/admin-class.actions.mjs +5 -2
  13. package/esm2022/admin/components/admin-classes/store/admin-class.effects.mjs +4 -1
  14. package/esm2022/admin/components/admin-classes/store/admin-class.reducer.mjs +6 -2
  15. package/esm2022/admin/components/admin-classes/store/admin-class.selectors.mjs +4 -2
  16. package/esm2022/admin/i18n/en.translations.mjs +12 -1
  17. package/esm2022/admin/i18n/fr.translations.mjs +12 -1
  18. package/esm2022/admin/store/admin.service.mjs +6 -1
  19. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +2 -1
  20. package/esm2022/dataset/i18n/fr.translations.mjs +2 -2
  21. package/esm2022/lib/core/components/about/about.component.mjs +14 -9
  22. package/esm2022/lib/core/i18n/en.translations.mjs +3 -2
  23. package/esm2022/lib/core/i18n/fr.translations.mjs +3 -2
  24. package/esm2022/lib/core/model/widget-aggregated-chart-manifest.interface.mjs +2 -1
  25. package/esm2022/lib/core/model/widget-map-manifest.interface.mjs +2 -1
  26. package/esm2022/lib/core/public-api.mjs +4 -1
  27. package/esm2022/lib/core/store/aggregation/backend-aggregation.service.mjs +101 -0
  28. package/esm2022/lib/core/store/aggregation/base-aggregation.service.mjs +16 -0
  29. package/esm2022/lib/core/store/aggregation/frontend-aggregation.service.mjs +210 -0
  30. package/esm2022/lib/core/store/class/class.interface.mjs +1 -1
  31. package/esm2022/lib/core/store/config/config.service.mjs +13 -13
  32. package/esm2022/lib/core/store/config/versions.interface.mjs +1 -1
  33. package/esm2022/lib/core/store/context-menu/context-menu.actions.mjs +1 -1
  34. package/esm2022/lib/core/store/context-menu/context-menu.reducer.mjs +5 -3
  35. package/esm2022/lib/core/store/context-menu/context-menu.selectors.mjs +4 -2
  36. package/esm2022/lib/core/store/field/field.interface.mjs +1 -1
  37. package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +23 -17
  38. package/esm2022/lib/dashboard/components/context-menu/object-edition/object-edition.component.mjs +1 -1
  39. package/esm2022/lib/dashboard/components/widgets/data-widget.component.mjs +1 -1
  40. package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +4 -3
  41. package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +5 -3
  42. package/esm2022/toolbox/components/save-view/save-view.component.mjs +5 -4
  43. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +8 -9
  44. package/esm2022/widgets/widget-aggregated-chart/public-api.mjs +1 -4
  45. package/esm2022/widgets/widget-aggregated-chart/widget-aggregated-chart.module.mjs +2 -3
  46. package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +2 -2
  47. package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +3 -2
  48. package/esm2022/widgets/widget-map/component/widget-map-layer.service.mjs +2 -1
  49. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +94 -34
  50. package/esm2022/widgets/widget-map/interaction/interaction-manager.class.mjs +3 -2
  51. package/esm2022/widgets/widget-map/utils/xml-utils.class.mjs +3 -2
  52. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +47 -52
  53. package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +3 -2
  54. package/esm2022/widgets/widget-vega/i18n/en.translations.mjs +4 -2
  55. package/esm2022/widgets/widget-vega/i18n/fr.translations.mjs +4 -2
  56. package/fesm2022/provoly-dashboard-admin.mjs +55 -9
  57. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  58. package/fesm2022/provoly-dashboard-dataset.mjs +2 -1
  59. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  60. package/fesm2022/provoly-dashboard-toolbox.mjs +4 -3
  61. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  62. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +10 -313
  63. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  64. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +1 -1
  65. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
  66. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +2 -1
  67. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
  68. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +98 -36
  69. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  70. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +47 -52
  71. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  72. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +2 -1
  73. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
  74. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +6 -2
  75. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  76. package/fesm2022/provoly-dashboard.mjs +420 -99
  77. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  78. package/lib/core/components/about/about.component.d.ts +3 -1
  79. package/lib/core/i18n/en.translations.d.ts +1 -0
  80. package/lib/core/i18n/fr.translations.d.ts +1 -0
  81. package/lib/core/model/widget-aggregated-chart-manifest.interface.d.ts +2 -1
  82. package/lib/core/model/widget-map-manifest.interface.d.ts +1 -0
  83. package/lib/core/public-api.d.ts +3 -0
  84. package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/backend-aggregation.service.d.ts +4 -1
  85. package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/base-aggregation.service.d.ts +14 -1
  86. package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/frontend-aggregation.service.d.ts +3 -2
  87. package/lib/core/store/class/class.interface.d.ts +1 -0
  88. package/lib/core/store/config/config.service.d.ts +2 -1
  89. package/lib/core/store/config/versions.interface.d.ts +3 -3
  90. package/lib/core/store/context-menu/context-menu.actions.d.ts +2 -0
  91. package/lib/core/store/context-menu/context-menu.reducer.d.ts +1 -0
  92. package/lib/core/store/context-menu/context-menu.selectors.d.ts +1 -0
  93. package/lib/core/store/field/field.interface.d.ts +1 -0
  94. package/lib/dashboard/components/context-menu/context-menu.component.d.ts +1 -0
  95. package/lib/dashboard/store/dashboard.selectors.d.ts +6 -1
  96. package/package.json +1 -1
  97. package/styles/base/_utils.scss +4 -0
  98. package/styles/components/_o-pry-admin-classes-customize.scss +6 -4
  99. package/toolbox/components/save-view/save-view.component.d.ts +2 -1
  100. package/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.d.ts +1 -7
  101. package/widgets/widget-aggregated-chart/public-api.d.ts +0 -3
  102. package/widgets/widget-map/component/widget-map.component.d.ts +14 -3
  103. package/widgets/widget-table/component/widget-table.component.d.ts +6 -1
  104. package/widgets/widget-vega/i18n/en.translations.d.ts +2 -0
  105. package/widgets/widget-vega/i18n/fr.translations.d.ts +2 -0
  106. package/esm2022/widgets/widget-aggregated-chart/service/backend-aggregation.service.mjs +0 -96
  107. package/esm2022/widgets/widget-aggregated-chart/service/base-aggregation.service.mjs +0 -16
  108. package/esm2022/widgets/widget-aggregated-chart/service/frontend-aggregation.service.mjs +0 -206
@@ -1,206 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { ClassSelectors, DashboardSelectors, ItemUtils, Operation, ResultsetUtils } from '@provoly/dashboard';
3
- import { combineLatest, map } from 'rxjs';
4
- import { PryAggregationService } from './base-aggregation.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@ngrx/store";
7
- export class PryFrontendAggregationService extends PryAggregationService {
8
- constructor(store) {
9
- super();
10
- this.store = store;
11
- }
12
- // @ts-ignore
13
- aggregate(datasource, options) {
14
- return combineLatest([
15
- this.store.select(DashboardSelectors.resultSets),
16
- this.store.select(ClassSelectors.classes)
17
- ]).pipe(map(([resultSets, classes]) => {
18
- const abscissa = classes
19
- .map((clazz) => clazz.attributes.find((attr) => attr.id === options.abscissa.attribute))
20
- .find((attr) => !!attr)?.name;
21
- const ordinate = classes
22
- .map((clazz) => clazz.attributes.find((attr) => attr.id === options.ordinate.attribute))
23
- .find((attr) => !!attr)?.name;
24
- if (!abscissa || !ordinate) {
25
- throw new Error('abscissaorodinateinvalid');
26
- }
27
- let data = datasource.map((rsName) => resultSets[rsName ?? '']).filter((rsName) => !!rsName);
28
- const resultSet = data.reduce((rs1, rs2) => ResultsetUtils.mergeResultSets(rs1, rs2), {
29
- items: {},
30
- relations: [],
31
- merged: data.length
32
- });
33
- let items = Object.keys(resultSet.items)
34
- .map((classId) => resultSet.items[classId])
35
- .reduce((prev, curr) => [...prev, ...curr], []);
36
- if (!!options.groupBy) {
37
- const groupBy = classes
38
- .map((clazz) => clazz.attributes.find((attr) => attr.id === options.groupBy?.attribute))
39
- .find((attr) => !!attr)?.name;
40
- if (!groupBy) {
41
- throw new Error('groupByAttributeisinvalid');
42
- }
43
- const itemsGrouped = this.groupBy(items, groupBy);
44
- const values = [];
45
- Object.keys(itemsGrouped).forEach((key) => {
46
- values.push({
47
- key,
48
- groupBy: this.getValueFromOperation(itemsGrouped[key], options.ordinate.operation, abscissa, ordinate, options.abscissa.limit)
49
- });
50
- });
51
- return { operation: options.ordinate.operation, values: values };
52
- }
53
- const values = this.getValueFromOperation(items, options.ordinate.operation, abscissa, ordinate, options.abscissa.limit);
54
- return { operation: options.ordinate.operation, values: values };
55
- }));
56
- }
57
- getValueFromOperation(items, operation, abscissa, ordinate, limit) {
58
- let result = [];
59
- const groupByAbscissa = this.groupBy(items, abscissa);
60
- groupByAbscissa.map((test) => console.log(groupByAbscissa[test]));
61
- switch (operation) {
62
- case Operation.COUNT:
63
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
64
- key: key,
65
- value: groupByAbscissa[key].length
66
- })));
67
- break;
68
- case Operation.SUM:
69
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
70
- key: key,
71
- value: this.getSum(groupByAbscissa[key], ordinate)
72
- })));
73
- break;
74
- case Operation.DISTINCT:
75
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
76
- key: key,
77
- value: this.getDistinct(groupByAbscissa[key], ordinate)
78
- })));
79
- break;
80
- case Operation.AVERAGE:
81
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
82
- key: key,
83
- value: this.getAverage(groupByAbscissa[key], ordinate)
84
- })));
85
- break;
86
- case Operation.MEDIAN:
87
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
88
- key: key,
89
- value: this.getQuartile(groupByAbscissa[key], ordinate, 0.5)
90
- })));
91
- break;
92
- case Operation.Q1:
93
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
94
- key: key,
95
- value: this.getQuartile(groupByAbscissa[key], ordinate, 0.25)
96
- })));
97
- break;
98
- case Operation.Q3:
99
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
100
- key: key,
101
- value: this.getQuartile(groupByAbscissa[key], ordinate, 0.75)
102
- })));
103
- break;
104
- case Operation.MIN:
105
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
106
- key: key,
107
- value: this.getMin(groupByAbscissa[key], ordinate)
108
- })));
109
- break;
110
- default:
111
- result.push(...Object.keys(groupByAbscissa).map((key) => ({
112
- key: key,
113
- value: this.getMax(groupByAbscissa[key], ordinate)
114
- })));
115
- break;
116
- }
117
- if (limit) {
118
- result = this.formatByLimit(result, limit);
119
- }
120
- return result;
121
- }
122
- groupBy(items, attribute) {
123
- let distincts = [];
124
- items.forEach((item) => {
125
- let value = this.getValueFromAttribute(item, attribute);
126
- if (distincts[value.value]) {
127
- distincts[value.value].push(item);
128
- }
129
- else {
130
- distincts[value.value] = [item];
131
- }
132
- });
133
- return distincts;
134
- }
135
- getValueFromAttribute(item, attribute) {
136
- let value = ItemUtils.getAttributeValue(item, attribute);
137
- return Array.isArray(value) ? value[0] : value;
138
- }
139
- getSum(items, attribute) {
140
- let sum = 0;
141
- items.forEach((item) => {
142
- sum += this.getValueFromAttribute(item, attribute).value;
143
- });
144
- return sum;
145
- }
146
- getMin(items, attribute) {
147
- const result = items.reduce((prev, curr) => {
148
- const prevValue = this.getValueFromAttribute(prev, attribute).value;
149
- const currValue = this.getValueFromAttribute(curr, attribute).value;
150
- return prevValue < currValue ? prev : curr;
151
- });
152
- return this.getValueFromAttribute(result, attribute).value;
153
- }
154
- getMax(items, attribute) {
155
- const result = items.reduce((prev, curr) => {
156
- const prevValue = this.getValueFromAttribute(prev, attribute).value;
157
- const currValue = this.getValueFromAttribute(curr, attribute).value;
158
- return prevValue > currValue ? prev : curr;
159
- });
160
- return this.getValueFromAttribute(result, attribute).value;
161
- }
162
- getAverage(items, attribute) {
163
- const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
164
- return allValues.reduce((acc, val) => acc + val, 0) / allValues.length;
165
- }
166
- getDistinct(items, attribute) {
167
- return [...new Set(items.map((item) => this.getValueFromAttribute(item, attribute).value))].length;
168
- }
169
- getQuartile(items, attribute, q) {
170
- const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
171
- const allValuesSorted = allValues.sort((a, b) => a - b);
172
- let pos = (allValuesSorted.length - 1) * q;
173
- if (pos % 1 === 0) {
174
- return allValuesSorted[pos];
175
- }
176
- pos = Math.floor(pos);
177
- if (allValuesSorted[pos + 1] !== undefined) {
178
- return (allValuesSorted[pos] + allValuesSorted[pos + 1]) / 2;
179
- }
180
- return allValuesSorted[pos];
181
- }
182
- getPercentile(items, attribute, q) {
183
- const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
184
- const allValuesSorted = allValues.sort((a, b) => a - b);
185
- return ((100 * allValuesSorted.reduce((acc, v) => acc + (v < q ? 1 : 0) + (v === q ? 0.5 : 0), 0)) /
186
- allValuesSorted.length);
187
- }
188
- formatByLimit(data, limit) {
189
- if (!limit.isTimeLimit) {
190
- data
191
- .sort((a, b) => (limit.order === 'asc' ? (a.value > b.value ? 1 : -1) : a.value < b.value ? 1 : -1))
192
- .splice(limit.at);
193
- return data;
194
- }
195
- return data;
196
- }
197
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
198
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, providedIn: 'root' }); }
199
- }
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, decorators: [{
201
- type: Injectable,
202
- args: [{
203
- providedIn: 'root'
204
- }]
205
- }], ctorParameters: function () { return [{ type: i1.Store }]; } });
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtYWdncmVnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWFnZ3JlZ2F0ZWQtY2hhcnQvc2VydmljZS9mcm9udGVuZC1hZ2dyZWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUdMLGNBQWMsRUFDZCxrQkFBa0IsRUFFbEIsU0FBUyxFQUNULFNBQVMsRUFDVCxjQUFjLEVBR2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQXFCLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUt0RixNQUFNLE9BQU8sNkJBQThCLFNBQVEscUJBQXFCO0lBQ3RFLFlBQW9CLEtBQVk7UUFDOUIsS0FBSyxFQUFFLENBQUM7UUFEVSxVQUFLLEdBQUwsS0FBSyxDQUFPO0lBRWhDLENBQUM7SUFFRCxhQUFhO0lBQ0osU0FBUyxDQUFDLFVBQW9CLEVBQUUsT0FBcUM7UUFDNUUsT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7U0FDMUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sUUFBUSxHQUFHLE9BQU87aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FB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QVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBBdExpbWl0LFxuICBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBJdGVtLFxuICBJdGVtVXRpbHMsXG4gIE9wZXJhdGlvbixcbiAgUmVzdWx0c2V0VXRpbHMsXG4gIFRpbWVMaW1pdCxcbiAgVmFsdWVUeXBlXG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uUmVzdWx0LCBQcnlBZ2dyZWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2Jhc2UtYWdncmVnYXRpb24uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByeUZyb250ZW5kQWdncmVnYXRpb25TZXJ2aWNlIGV4dGVuZHMgUHJ5QWdncmVnYXRpb25TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogU3RvcmUpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvdmVycmlkZSBhZ2dyZWdhdGUoZGF0YXNvdXJjZTogc3RyaW5nW10sIG9wdGlvbnM6IENoYXJ0QWdncmVnYXRlZFdpZGdldE9wdGlvbnMpOiBPYnNlcnZhYmxlPEFnZ3JlZ2F0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnJlc3VsdFNldHMpLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3NlcylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcmVzdWx0U2V0cywgY2xhc3Nlc10pID0+IHtcbiAgICAgICAgY29uc3QgYWJzY2lzc2EgPSBjbGFzc2VzXG4gICAgICAgICAgLm1hcCgoY2xhenopID0+IGNsYXp6LmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci5pZCA9PT0gb3B0aW9ucy5hYnNjaXNzYS5hdHRyaWJ1dGUpKVxuICAgICAgICAgIC5maW5kKChhdHRyKSA9PiAhIWF0dHIpPy5uYW1lO1xuICAgICAgICBjb25zdCBvcmRpbmF0ZSA9IGNsYXNzZXNcbiAgICAgICAgICAubWFwKChjbGF6eikgPT4gY2xhenouYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLmlkID09PSBvcHRpb25zLm9yZGluYXRlLmF0dHJpYnV0ZSkpXG4gICAgICAgICAgLmZpbmQoKGF0dHIpID0+ICEhYXR0cik/Lm5hbWU7XG4gICAgICAgIGlmICghYWJzY2lzc2EgfHwgIW9yZGluYXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYnNjaXNzYW9yb2RpbmF0ZWludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0YSA9IGRhdGFzb3VyY2UubWFwKChyc05hbWUpID0+IHJlc3VsdFNldHNbcnNOYW1lID8/ICcnXSkuZmlsdGVyKChyc05hbWUpID0+ICEhcnNOYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0U2V0ID0gZGF0YS5yZWR1Y2UoKHJzMSwgcnMyKSA9PiBSZXN1bHRzZXRVdGlscy5tZXJnZVJlc3VsdFNldHMocnMxLCByczIpLCB7XG4gICAgICAgICAgaXRlbXM6IHt9LFxuICAgICAgICAgIHJlbGF0aW9uczogW10sXG4gICAgICAgICAgbWVyZ2VkOiBkYXRhLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGl0ZW1zOiBJdGVtW10gPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT4gcmVzdWx0U2V0Lml0ZW1zW2NsYXNzSWRdKVxuICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFsuLi5wcmV2LCAuLi5jdXJyXSwgW10pIGFzIEl0ZW1bXTtcbiAgICAgICAgaWYgKCEhb3B0aW9ucy5ncm91cEJ5KSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBCeSA9IGNsYXNzZXNcbiAgICAgICAgICAgIC5tYXAoKGNsYXp6KSA9PiBjbGF6ei5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIuaWQgPT09IG9wdGlvbnMuZ3JvdXBCeT8uYXR0cmlidXRlKSlcbiAgICAgICAgICAgIC5maW5kKChhdHRyKSA9PiAhIWF0dHIpPy5uYW1lO1xuICAgICAgICAgIGlmICghZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdncm91cEJ5QXR0cmlidXRlaXNpbnZhbGlkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGl0ZW1zR3JvdXBlZDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBJdGVtW10gfSA9IHRoaXMuZ3JvdXBCeShpdGVtcywgZ3JvdXBCeSk7XG4gICAgICAgICAgY29uc3QgdmFsdWVzOiB7IGtleTogVmFsdWVUeXBlOyBncm91cEJ5OiB7fVtdIH1bXSA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGl0ZW1zR3JvdXBlZCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgZ3JvdXBCeTogdGhpcy5nZXRWYWx1ZUZyb21PcGVyYXRpb24oXG4gICAgICAgICAgICAgICAgaXRlbXNHcm91cGVkW2tleV0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcmRpbmF0ZS5vcGVyYXRpb24sXG4gICAgICAgICAgICAgICAgYWJzY2lzc2EsXG4gICAgICAgICAgICAgICAgb3JkaW5hdGUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hYnNjaXNzYS5saW1pdFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBvcGVyYXRpb246IG9wdGlvbnMub3JkaW5hdGUub3BlcmF0aW9uLCB2YWx1ZXM6IHZhbHVlcyB9IGFzIEFnZ3JlZ2F0aW9uUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVGcm9tT3BlcmF0aW9uKFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG9wdGlvbnMub3JkaW5hdGUub3BlcmF0aW9uLFxuICAgICAgICAgIGFic2Npc3NhLFxuICAgICAgICAgIG9yZGluYXRlLFxuICAgICAgICAgIG9wdGlvbnMuYWJzY2lzc2EubGltaXRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgb3BlcmF0aW9uOiBvcHRpb25zLm9yZGluYXRlLm9wZXJhdGlvbiwgdmFsdWVzOiB2YWx1ZXMgfSBhcyBBZ2dyZWdhdGlvblJlc3VsdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbU9wZXJhdGlvbihcbiAgICBpdGVtczogSXRlbVtdLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uLFxuICAgIGFic2Npc3NhOiBzdHJpbmcsXG4gICAgb3JkaW5hdGU6IHN0cmluZyxcbiAgICBsaW1pdD86IEF0TGltaXQgfCBUaW1lTGltaXRcbiAgKSB7XG4gICAgbGV0IHJlc3VsdDogeyBrZXk6IFZhbHVlVHlwZTsgdmFsdWU6IFZhbHVlVHlwZSB9W10gPSBbXTtcbiAgICBjb25zdCBncm91cEJ5QWJzY2lzc2EgPSB0aGlzLmdyb3VwQnkoaXRlbXMsIGFic2Npc3NhKTtcbiAgICBncm91cEJ5QWJzY2lzc2EubWFwKCh0ZXN0OiBhbnkpID0+IGNvbnNvbGUubG9nKGdyb3VwQnlBYnNjaXNzYVt0ZXN0XSkpO1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5DT1VOVDpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IGdyb3VwQnlBYnNjaXNzYVtrZXldLmxlbmd0aFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLlNVTTpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0U3VtKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5ESVNUSU5DVDpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0RGlzdGluY3QoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLkFWRVJBR0U6XG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwQnlBYnNjaXNzYSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldEF2ZXJhZ2UoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLk1FRElBTjpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0UXVhcnRpbGUoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlLCAwLjUpXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPcGVyYXRpb24uUTE6XG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwQnlBYnNjaXNzYSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFF1YXJ0aWxlKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSwgMC4yNSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5RMzpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0UXVhcnRpbGUoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlLCAwLjc1KVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLk1JTjpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0TWluKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhncm91cEJ5QWJzY2lzc2EpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRNYXgoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGxpbWl0KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmZvcm1hdEJ5TGltaXQocmVzdWx0LCBsaW1pdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBncm91cEJ5KGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgbGV0IGRpc3RpbmN0czogYW55ID0gW107XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogSXRlbSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUoaXRlbSwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChkaXN0aW5jdHNbdmFsdWUudmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyXSkge1xuICAgICAgICBkaXN0aW5jdHNbdmFsdWUudmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyXS5wdXNoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdGluY3RzW3ZhbHVlLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlcl0gPSBbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc3RpbmN0cztcbiAgfVxuXG4gIGdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtOiBJdGVtLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGxldCB2YWx1ZSA9IEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShpdGVtLCBhdHRyaWJ1dGUpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gIH1cblxuICBnZXRTdW0oaXRlbXM6IEl0ZW1bXSwgYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBsZXQgc3VtOiBudW1iZXIgPSAwO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHN1bSArPSB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gc3VtO1xuICB9XG5cbiAgZ2V0TWluKGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaXRlbXMucmVkdWNlKChwcmV2OiBhbnksIGN1cnI6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUocHJldiwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKGN1cnIsIGF0dHJpYnV0ZSkudmFsdWU7XG4gICAgICByZXR1cm4gcHJldlZhbHVlIDwgY3VyclZhbHVlID8gcHJldiA6IGN1cnI7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKHJlc3VsdCwgYXR0cmlidXRlKS52YWx1ZTtcbiAgfVxuXG4gIGdldE1heChpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1zLnJlZHVjZSgocHJldjogYW55LCBjdXJyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKHByZXYsIGF0dHJpYnV0ZSkudmFsdWU7XG4gICAgICBjb25zdCBjdXJyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShjdXJyLCBhdHRyaWJ1dGUpLnZhbHVlO1xuICAgICAgcmV0dXJuIHByZXZWYWx1ZSA+IGN1cnJWYWx1ZSA/IHByZXYgOiBjdXJyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShyZXN1bHQsIGF0dHJpYnV0ZSkudmFsdWU7XG4gIH1cblxuICBnZXRBdmVyYWdlKGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgcmV0dXJuIGFsbFZhbHVlcy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwsIDApIC8gYWxsVmFsdWVzLmxlbmd0aDtcbiAgfVxuXG4gIGdldERpc3RpbmN0KGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUoaXRlbSwgYXR0cmlidXRlKS52YWx1ZSkpXS5sZW5ndGg7XG4gIH1cblxuICBnZXRRdWFydGlsZShpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZywgcTogbnVtYmVyKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgYWxsVmFsdWVzU29ydGVkID0gYWxsVmFsdWVzLnNvcnQoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC0gYik7XG5cbiAgICBsZXQgcG9zID0gKGFsbFZhbHVlc1NvcnRlZC5sZW5ndGggLSAxKSAqIHE7XG4gICAgaWYgKHBvcyAlIDEgPT09IDApIHtcbiAgICAgIHJldHVybiBhbGxWYWx1ZXNTb3J0ZWRbcG9zXTtcbiAgICB9XG5cbiAgICBwb3MgPSBNYXRoLmZsb29yKHBvcyk7XG4gICAgaWYgKGFsbFZhbHVlc1NvcnRlZFtwb3MgKyAxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKGFsbFZhbHVlc1NvcnRlZFtwb3NdICsgYWxsVmFsdWVzU29ydGVkW3BvcyArIDFdKSAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFZhbHVlc1NvcnRlZFtwb3NdO1xuICB9XG5cbiAgZ2V0UGVyY2VudGlsZShpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZywgcTogbnVtYmVyKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgYWxsVmFsdWVzU29ydGVkID0gYWxsVmFsdWVzLnNvcnQoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC0gYik7XG4gICAgcmV0dXJuIChcbiAgICAgICgxMDAgKiBhbGxWYWx1ZXNTb3J0ZWQucmVkdWNlKChhY2MsIHYpID0+IGFjYyArICh2IDwgcSA/IDEgOiAwKSArICh2ID09PSBxID8gMC41IDogMCksIDApKSAvXG4gICAgICBhbGxWYWx1ZXNTb3J0ZWQubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIGZvcm1hdEJ5TGltaXQoZGF0YTogeyBrZXk6IFZhbHVlVHlwZTsgdmFsdWU6IFZhbHVlVHlwZSB9W10sIGxpbWl0OiBBdExpbWl0IHwgVGltZUxpbWl0KSB7XG4gICAgaWYgKCFsaW1pdC5pc1RpbWVMaW1pdCkge1xuICAgICAgZGF0YVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gKGxpbWl0Lm9yZGVyID09PSAnYXNjJyA/IChhLnZhbHVlID4gYi52YWx1ZSA/IDEgOiAtMSkgOiBhLnZhbHVlIDwgYi52YWx1ZSA/IDEgOiAtMSkpXG4gICAgICAgIC5zcGxpY2UobGltaXQuYXQpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iXX0=