@kando-env/kando-ui 1.2.122-alpha.7 → 1.2.122

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 (37) hide show
  1. package/lib/Widgets/Map/Map.js +161 -38
  2. package/lib/Widgets/Map/areas/AreaPolygon.js +2 -2
  3. package/lib/Widgets/Map/events/EventIndicator.js +46 -21
  4. package/lib/Widgets/Map/events/EventIndicatorHover.js +252 -0
  5. package/lib/Widgets/Map/events/EventPath.js +37 -16
  6. package/lib/Widgets/Map/events/EventPathHover.js +81 -0
  7. package/lib/Widgets/Map/events/NetworkForSpecificEvent.js +117 -3
  8. package/lib/Widgets/Map/points/PointMarker.js +472 -10
  9. package/lib/Widgets/Map/points/PointMarkers.js +17 -24
  10. package/lib/components/Header/Toolbar/Toolbar.js +2 -2
  11. package/lib/components/SevereEvent/SevereEvent.js +2 -2
  12. package/lib/hooks/useInitializeHeaders.js +3 -2
  13. package/lib/i18n/en.json +2 -1
  14. package/lib/i18n/he.json +1 -0
  15. package/lib/macros/getVersion.js +2 -2
  16. package/lib/pages/EventsPage/EventsMapContainer/EventsMapContainer.js +4 -1
  17. package/lib/pages/EventsPage/events/EventsStyle.scss +0 -1
  18. package/lib/pages/EventsPage/events/event_info/EventDetails.js +2 -2
  19. package/lib/pages/EventsPage/events/events_list/EventUtils.js +1 -1
  20. package/lib/pages/EventsPage/events/events_list/EventsList.js +8 -25
  21. package/lib/pages/EventsPage/events/events_list/Filter/FilterContainer.js +2 -2
  22. package/lib/pages/SamplingsPage/ActionsDropDown/SamplingActionContainer.js +1 -4
  23. package/lib/pages/SamplingsPage/DesktopActions/DesktopActions.js +49 -2
  24. package/lib/pages/SamplingsPage/DesktopActions/DownloadCSV.js +8 -25
  25. package/lib/pages/SamplingsPage/SamplingProperties/ImagePreviewModal.js +2 -2
  26. package/lib/pages/SamplingsPage/SamplingProperties/SamplingProperties.js +4 -4
  27. package/lib/store/permissions/permissionsSlice.js +3 -2
  28. package/lib/ui-kit/KandoTable/KandoTable.js +5 -5
  29. package/lib/utilities/urls.js +5 -2
  30. package/package.json +1 -1
  31. package/lib/Widgets/Map/MapUtils.js +0 -103
  32. package/lib/Widgets/Map/events/Event.js +0 -69
  33. package/lib/Widgets/Map/events/EventUtils.js +0 -245
  34. package/lib/Widgets/Map/events/PointOfEvent.js +0 -131
  35. package/lib/Widgets/Map/events/PointsForSpecificEvent.js +0 -55
  36. package/lib/Widgets/Map/events/Snail.js +0 -60
  37. package/lib/Widgets/Map/points/PointUtils.js +0 -368
@@ -1,368 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.popupContent = exports.createSamplingIcons = exports.createObservationIconPoint = exports.createSamplingIconPoint = exports.markerBelongsToSource = exports.markerBelongsToSelectedSource = exports.belongsToSourceBackground = exports.selectedBackground = exports.combinedWWTPIcon = exports.combinedCollectorsIcon = exports.combinedPumpStationIcon = exports.combinedFactoryIcon = exports.standardBackground = exports.matchIconToPoint = exports.createManholePoint = exports.createBubblePoint = exports.isCollectorFocused = void 0;
9
-
10
- var _lineChart = _interopRequireDefault(require("../../../assets/line-chart.svg"));
11
-
12
- var _leaflet = _interopRequireDefault(require("leaflet"));
13
-
14
- var _i18n = _interopRequireDefault(require("../../../utilities/i18n"));
15
-
16
- var _blueCircle = _interopRequireDefault(require("../../../assets/point_icons/blue-circle.svg"));
17
-
18
- var _samplingIcon = _interopRequireDefault(require("../../../assets/point_icons/sampling-icon.svg"));
19
-
20
- var _pinkCircle = _interopRequireDefault(require("../../../assets/point_icons/pink-circle.svg"));
21
-
22
- var _observationIcon = _interopRequireDefault(require("../../../assets/point_icons/observation-icon.svg"));
23
-
24
- var _redPinRedShadow = _interopRequireDefault(require("../../../assets/point_icons/red-pin-red-shadow.png"));
25
-
26
- var _whitePinRedShadow = _interopRequireDefault(require("../../../assets/point_icons/white-pin-red-shadow.png"));
27
-
28
- var _whitePinBlackShadow = _interopRequireDefault(require("../../../assets/point_icons/white-pin-black-shadow.png"));
29
-
30
- var _yellowCircle = _interopRequireDefault(require("../../../assets/point_icons/yellow-circle.svg"));
31
-
32
- var _factoryIcon = _interopRequireDefault(require("../../../assets/point_icons/factory-icon.svg"));
33
-
34
- var _greenCircle = _interopRequireDefault(require("../../../assets/point_icons/green-circle.svg"));
35
-
36
- var _pumpStationIcon = _interopRequireDefault(require("../../../assets/point_icons/pump-station-icon.svg"));
37
-
38
- var _pinWater = _interopRequireDefault(require("../../../assets/map/pin-water.svg"));
39
-
40
- var _brightBlueCircle = _interopRequireDefault(require("../../../assets/point_icons/bright-blue-circle.svg"));
41
-
42
- var _WWTPIcon = _interopRequireDefault(require("../../../assets/point_icons/WWTP-icon.svg"));
43
-
44
- var _waterNoBackground = _interopRequireDefault(require("../../../assets/point_icons/water-no-background.svg"));
45
-
46
- var _whitePoint = _interopRequireDefault(require("../../../assets/white-point.png"));
47
-
48
- var isCollectorFocused = function isCollectorFocused(point, event) {
49
- var _event$observations;
50
-
51
- return (event === null || event === void 0 ? void 0 : (_event$observations = event.observations) === null || _event$observations === void 0 ? void 0 : _event$observations.length) === 1 && point.id === event.observations[0].point_id;
52
- }; // iconSize: [width, height],
53
- // IconAnchor: [(-right)(+left), (-down)(+up)]
54
-
55
-
56
- exports.isCollectorFocused = isCollectorFocused;
57
-
58
- var createBubblePoint = function createBubblePoint(markerLocation, point, map) {
59
- // @ts-ignore
60
- matchIconToPoint(point) !== null && // @ts-ignore
61
- matchIconToPoint(point).forEach(function (icon) {
62
- var pointCustomIcon = _leaflet.default.marker(markerLocation, {
63
- icon: icon,
64
- riseOnHover: false
65
- }).addTo(map);
66
-
67
- pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.group.sector_name, ")"));
68
- pointCustomIcon['kando_object_id'] = point.id;
69
- pointCustomIcon['kando_object'] = 'Point';
70
- });
71
-
72
- if (point.relatedEventsAmount) {
73
- var pointCustomIcon = _leaflet.default.marker(markerLocation, {
74
- icon: _leaflet.default.divIcon({
75
- className: "\n ".concat(point.relatedEventsAmount >= 100 ? 'circle-events-amount circle-events-amount--tridigit' : 'circle-events-amount', " \n ").concat(point.relatedEventsAmount > 2 ? 'alert-color' : '', "\n "),
76
- html: "<p>".concat(point.relatedEventsAmount, "</p>"),
77
- iconAnchor: [-5, 42]
78
- }),
79
- riseOnHover: false
80
- }).addTo(map);
81
-
82
- pointCustomIcon['kando_object_id'] = point.id;
83
- pointCustomIcon['kando_object'] = 'IconNumber';
84
- }
85
- };
86
-
87
- exports.createBubblePoint = createBubblePoint;
88
-
89
- var createManholePoint = function createManholePoint(markerLocation, point, map) {
90
- var pointIcon = _leaflet.default.icon({
91
- iconUrl: _whitePoint.default,
92
- iconSize: [9, 9],
93
- iconAnchor: [4.5, 4.5]
94
- });
95
-
96
- var manholeIcon = _leaflet.default.marker(markerLocation, {
97
- icon: pointIcon,
98
- riseOnHover: true
99
- }).addTo(map);
100
-
101
- manholeIcon.bindTooltip("".concat(point.group.name, " (").concat(point.group.sector_name, ")"));
102
- manholeIcon['kando_object_id'] = point.id;
103
- manholeIcon['kando_object'] = 'Point';
104
- };
105
-
106
- exports.createManholePoint = createManholePoint;
107
-
108
- var matchIconToPoint = function matchIconToPoint(point, event) {
109
- switch (point.group.type) {
110
- case 'Groups::Factory':
111
- if (combinedFactoryIcon.length === 2) {
112
- if (markerBelongsToSelectedSource(event, point)) {
113
- combinedFactoryIcon.unshift(selectedBackground());
114
- } else if (markerBelongsToSource(event, point)) {
115
- combinedFactoryIcon.unshift(belongsToSourceBackground());
116
- } else {
117
- combinedFactoryIcon.unshift(standardBackground());
118
- }
119
- }
120
-
121
- return combinedFactoryIcon;
122
-
123
- case 'Groups::PumpStation':
124
- if (combinedPumpStationIcon.length === 2) {
125
- if (markerBelongsToSelectedSource(event, point)) {
126
- combinedPumpStationIcon.unshift(selectedBackground());
127
- } else if (markerBelongsToSource(event, point)) {
128
- combinedPumpStationIcon.unshift(belongsToSourceBackground());
129
- } else {
130
- combinedPumpStationIcon.unshift(standardBackground());
131
- }
132
- }
133
-
134
- return combinedPumpStationIcon;
135
-
136
- case 'Groups::WastewaterTreatmentPlant':
137
- if (combinedWWTPIcon.length === 2) {
138
- if (markerBelongsToSelectedSource(event, point)) {
139
- combinedWWTPIcon.unshift(selectedBackground());
140
- } else if (markerBelongsToSource(event, point)) {
141
- combinedWWTPIcon.unshift(belongsToSourceBackground());
142
- } else {
143
- combinedWWTPIcon.unshift(standardBackground());
144
- }
145
- }
146
-
147
- return combinedWWTPIcon;
148
-
149
- case 'Groups::Collectors':
150
- if (isCollectorFocused(point, event)) {
151
- return [_leaflet.default.icon({
152
- iconUrl: _redPinRedShadow.default,
153
- iconSize: [62, 62],
154
- iconAnchor: [30, 52]
155
- }), _leaflet.default.icon({
156
- iconUrl: _waterNoBackground.default,
157
- iconSize: [46, 46],
158
- iconAnchor: [22, 44],
159
- popupAnchor: [0, -30]
160
- })];
161
- }
162
-
163
- return combinedCollectorsIcon;
164
-
165
- default:
166
- return null;
167
- }
168
- };
169
-
170
- exports.matchIconToPoint = matchIconToPoint;
171
-
172
- var standardBackground = function standardBackground() {
173
- var secondary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
174
- var third = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
175
- return _leaflet.default.icon({
176
- iconUrl: _whitePinBlackShadow.default,
177
- iconSize: secondary ? [20, 20] : [43, 46],
178
- iconAnchor: secondary && third ? [-2, 19] : secondary ? [-2, 44] : [20, 42],
179
- popupAnchor: [0, -30]
180
- });
181
- };
182
-
183
- exports.standardBackground = standardBackground;
184
- var combinedFactoryIcon = [_leaflet.default.icon({
185
- iconUrl: _yellowCircle.default,
186
- iconSize: [25, 24],
187
- iconAnchor: [10.7, 33.7],
188
- popupAnchor: [0, -30]
189
- }), _leaflet.default.icon({
190
- iconUrl: _factoryIcon.default,
191
- iconSize: [15, 15],
192
- iconAnchor: [5, 30],
193
- popupAnchor: [0, -30]
194
- })];
195
- exports.combinedFactoryIcon = combinedFactoryIcon;
196
- var combinedPumpStationIcon = [_leaflet.default.icon({
197
- iconUrl: _greenCircle.default,
198
- iconSize: [25, 24],
199
- iconAnchor: [10.7, 33.7],
200
- popupAnchor: [0, -30]
201
- }), _leaflet.default.icon({
202
- iconUrl: _pumpStationIcon.default,
203
- iconSize: [20, 20],
204
- iconAnchor: [7, 32],
205
- popupAnchor: [0, -30]
206
- })];
207
- exports.combinedPumpStationIcon = combinedPumpStationIcon;
208
- var combinedCollectorsIcon = [_leaflet.default.icon({
209
- iconUrl: _pinWater.default,
210
- iconSize: [45, 45],
211
- iconAnchor: [25, 50],
212
- popupAnchor: [0, -30]
213
- })];
214
- exports.combinedCollectorsIcon = combinedCollectorsIcon;
215
- var combinedWWTPIcon = [_leaflet.default.icon({
216
- iconUrl: _brightBlueCircle.default,
217
- iconSize: [25, 25],
218
- iconAnchor: [10.7, 33.7],
219
- popupAnchor: [0, -30]
220
- }), _leaflet.default.icon({
221
- iconUrl: _WWTPIcon.default,
222
- iconSize: [20, 20],
223
- iconAnchor: [8, 31],
224
- popupAnchor: [0, -30]
225
- })];
226
- exports.combinedWWTPIcon = combinedWWTPIcon;
227
-
228
- var selectedBackground = function selectedBackground() {
229
- return _leaflet.default.icon({
230
- iconUrl: _redPinRedShadow.default,
231
- iconSize: [67, 70],
232
- iconAnchor: [32, 54],
233
- popupAnchor: [0, -30]
234
- });
235
- };
236
-
237
- exports.selectedBackground = selectedBackground;
238
-
239
- var belongsToSourceBackground = function belongsToSourceBackground() {
240
- return _leaflet.default.icon({
241
- iconUrl: _whitePinRedShadow.default,
242
- iconSize: [67, 70],
243
- iconAnchor: [32, 54],
244
- popupAnchor: [0, -30]
245
- });
246
- };
247
-
248
- exports.belongsToSourceBackground = belongsToSourceBackground;
249
-
250
- var markerBelongsToSelectedSource = function markerBelongsToSelectedSource(event, point) {
251
- var source;
252
-
253
- if (event !== null && event !== undefined) {
254
- source = event.sources.filter(function (source) {
255
- return source.point_id === point.id;
256
- })[0];
257
- }
258
-
259
- return event !== null && source && event.selected_source === source.point_id;
260
- };
261
-
262
- exports.markerBelongsToSelectedSource = markerBelongsToSelectedSource;
263
-
264
- var markerBelongsToSource = function markerBelongsToSource(event, point) {
265
- if (event === undefined) return;
266
- return event !== null && event.sources.filter(function (source) {
267
- return source.point_id === point.id;
268
- })[0];
269
- };
270
-
271
- exports.markerBelongsToSource = markerBelongsToSource;
272
-
273
- var createSamplingIconPoint = function createSamplingIconPoint(markerLocation, secondaryIcon, map, point, event) {
274
- // iconSize: [width, height],
275
- // Icon Anchor: [(-right)(+left), (-down)(+up)]
276
- var samplingIcon = [_leaflet.default.icon({
277
- iconUrl: _blueCircle.default,
278
- iconSize: secondaryIcon ? [10, 10] : [25, 24],
279
- iconAnchor: secondaryIcon ? [-7, 15] : [10.7, 33.7],
280
- popupAnchor: [0, -30]
281
- }), _leaflet.default.icon({
282
- iconUrl: _samplingIcon.default,
283
- iconSize: secondaryIcon ? [7, 7] : [13, 15],
284
- iconAnchor: secondaryIcon ? [-8, 13] : [5, 30],
285
- popupAnchor: [0, -30]
286
- })];
287
-
288
- if (markerBelongsToSelectedSource(event, point) && !secondaryIcon) {
289
- samplingIcon.unshift(selectedBackground());
290
- } else if (markerBelongsToSource(event, point) && !secondaryIcon) {
291
- samplingIcon.unshift(belongsToSourceBackground());
292
- } else {
293
- samplingIcon.unshift(standardBackground(secondaryIcon, true));
294
- }
295
-
296
- samplingIcon.forEach(function (icon) {
297
- var pointCustomIcon = _leaflet.default.marker(markerLocation, {
298
- icon: icon,
299
- riseOnHover: false
300
- }).addTo(map);
301
-
302
- pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.group.sector_name, ")"));
303
- pointCustomIcon['kando_object_id'] = point.id;
304
- pointCustomIcon['kando_object'] = 'Sampling';
305
- });
306
- };
307
-
308
- exports.createSamplingIconPoint = createSamplingIconPoint;
309
-
310
- var createObservationIconPoint = function createObservationIconPoint(markerLocation, secondaryIcon, map, point, event) {
311
- // iconSize: [width, height],
312
- // Icon Anchor: [(-right)(+left), (-down)(+up)]
313
- var observationIcon = [_leaflet.default.icon({
314
- iconUrl: _pinkCircle.default,
315
- iconSize: secondaryIcon ? [10, 10] : [25, 24],
316
- iconAnchor: secondaryIcon ? [-7, 40] : [10.7, 33.7],
317
- popupAnchor: [0, -30]
318
- }), _leaflet.default.icon({
319
- iconUrl: _observationIcon.default,
320
- iconSize: secondaryIcon ? [7, 7] : [13, 15],
321
- iconAnchor: secondaryIcon ? [-8, 38] : [5, 30],
322
- popupAnchor: [0, -30]
323
- })];
324
-
325
- if (markerBelongsToSelectedSource(event, point) && !secondaryIcon) {
326
- observationIcon.unshift(selectedBackground());
327
- } else if (markerBelongsToSource(event, point) && !secondaryIcon) {
328
- observationIcon.unshift(belongsToSourceBackground());
329
- } else {
330
- observationIcon.unshift(standardBackground(secondaryIcon));
331
- }
332
-
333
- observationIcon.forEach(function (icon) {
334
- var pointCustomIcon = _leaflet.default.marker(markerLocation, {
335
- icon: icon,
336
- riseOnHover: false
337
- }).addTo(map);
338
-
339
- pointCustomIcon.bindTooltip("".concat(point.group.name, " (").concat(point.group.sector_name, ")"));
340
- pointCustomIcon['kando_object_id'] = point.id;
341
- pointCustomIcon['kando_object'] = 'Observation';
342
- });
343
- };
344
-
345
- exports.createObservationIconPoint = createObservationIconPoint;
346
-
347
- var createSamplingIcons = function createSamplingIcons(markerLocation, event, point, map) {
348
- var sampledPointIds = event.samplings.map(function (s) {
349
- return s.point_id;
350
- });
351
-
352
- if (event !== null && event.samplings.length !== 0 && sampledPointIds.includes(point.id)) {
353
- createSamplingIconPoint(markerLocation, matchIconToPoint(point, event) !== null, map, point, event);
354
- }
355
- };
356
-
357
- exports.createSamplingIcons = createSamplingIcons;
358
-
359
- var popupContent = function popupContent(obs, point) {
360
- if (obs === null) {
361
- return "\n <div class=\"event-popup\">\n <div class=\"popup-graph-icon popup-graph-icon-".concat(point.id, "\">\n <img src=\"").concat(_lineChart.default, "\"/>\n </div>\n <div class=\"popup-content\">\n <h5 class=\"popup-content__site-name\"><b>").concat(point.group.name, "</b></h5>\n <hr/>\n \n <div id=\"sector\"></div>\n </div>\n </div>\n ");
362
- } else {
363
- return "\n <div class=\"event-popup\">\n <div class=\"popup-graph-icon popup-graph-icon-".concat(obs.id, "\">\n <img src=\"").concat(_lineChart.default, "\"/>\n </div>\n <div class=\"popup-content\">\n <h5 class=\"popup-content__site-name\"><b>").concat(point.group.name, "</b></h5>\n <div class=\"popup-content__severity\">\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.severity"), "</p>\n <span class=\"").concat('popup-content__severity--' + obs.severity, "\">\n <b class=\"popup-content__severity-b\">\n ").concat(_i18n.default.t("events_overview.severities.".concat(obs.severity)), "\n </b>\n </span>\n </div>\n \n <hr class=\"popup-content__hr\" />\n\n <div class=\"popup-content__discharge-time\">\n <div>\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.first_seen"), ":</p>\n <span><b id=\"first-seen-popup\"></b></span>\n </div>\n <div>\n <p class=\"popup-content__severity-p\">").concat(_i18n.default.t("events_overview.last_seen"), ":</p>\n <span><b id=\"last-seen-popup\"></b></span>\n </div> \n </div>\n </div>\n </div>\n ");
364
- }
365
- };
366
-
367
- exports.popupContent = popupContent;
368
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9XaWRnZXRzL01hcC9wb2ludHMvUG9pbnRVdGlscy50cyJdLCJuYW1lcyI6WyJpc0NvbGxlY3RvckZvY3VzZWQiLCJwb2ludCIsImV2ZW50Iiwib2JzZXJ2YXRpb25zIiwibGVuZ3RoIiwiaWQiLCJwb2ludF9pZCIsImNyZWF0ZUJ1YmJsZVBvaW50IiwibWFya2VyTG9jYXRpb24iLCJtYXAiLCJtYXRjaEljb25Ub1BvaW50IiwiZm9yRWFjaCIsImljb24iLCJwb2ludEN1c3RvbUljb24iLCJMIiwibWFya2VyIiwicmlzZU9uSG92ZXIiLCJhZGRUbyIsImJpbmRUb29sdGlwIiwiZ3JvdXAiLCJuYW1lIiwic2VjdG9yX25hbWUiLCJyZWxhdGVkRXZlbnRzQW1vdW50IiwiZGl2SWNvbiIsImNsYXNzTmFtZSIsImh0bWwiLCJpY29uQW5jaG9yIiwiY3JlYXRlTWFuaG9sZVBvaW50IiwicG9pbnRJY29uIiwiaWNvblVybCIsIndoaXRlUG9pbnQiLCJpY29uU2l6ZSIsIm1hbmhvbGVJY29uIiwidHlwZSIsImNvbWJpbmVkRmFjdG9yeUljb24iLCJtYXJrZXJCZWxvbmdzVG9TZWxlY3RlZFNvdXJjZSIsInVuc2hpZnQiLCJzZWxlY3RlZEJhY2tncm91bmQiLCJtYXJrZXJCZWxvbmdzVG9Tb3VyY2UiLCJiZWxvbmdzVG9Tb3VyY2VCYWNrZ3JvdW5kIiwic3RhbmRhcmRCYWNrZ3JvdW5kIiwiY29tYmluZWRQdW1wU3RhdGlvbkljb24iLCJjb21iaW5lZFdXVFBJY29uIiwicmVkUGluUmVkU2hhZG93Iiwid2F0ZXJJY29uTm9CYWNrZ3JvdW5kIiwicG9wdXBBbmNob3IiLCJjb21iaW5lZENvbGxlY3RvcnNJY29uIiwic2Vjb25kYXJ5IiwidGhpcmQiLCJ3aGl0ZVBpbkJsYWNrU2hhZG93IiwieWVsbG93Q2lyY2xlVVJMIiwicGxhbnRJY29uVVJMIiwiZ3JlZW5DaXJjbGVVUkwiLCJwdW1wU3RhdGlvbkljb25VUkwiLCJjb2xsZWN0b3JJY29uIiwiYnJpZ2h0Qmx1ZUNpcmNsZVVSTCIsIldXVFBJY29uVVJMIiwid2hpdGVQaW5SZWRTaGFkb3ciLCJzb3VyY2UiLCJ1bmRlZmluZWQiLCJzb3VyY2VzIiwiZmlsdGVyIiwic2VsZWN0ZWRfc291cmNlIiwiY3JlYXRlU2FtcGxpbmdJY29uUG9pbnQiLCJzZWNvbmRhcnlJY29uIiwic2FtcGxpbmdJY29uIiwiYmx1ZUNpcmNsZVVSTCIsInNhbXBsaW5nSWNvblVSTCIsImNyZWF0ZU9ic2VydmF0aW9uSWNvblBvaW50Iiwib2JzZXJ2YXRpb25JY29uIiwicGlua0NpcmNsZVVSTCIsIm9ic2VydmF0aW9uSWNvblVSTCIsImNyZWF0ZVNhbXBsaW5nSWNvbnMiLCJzYW1wbGVkUG9pbnRJZHMiLCJzYW1wbGluZ3MiLCJzIiwiaW5jbHVkZXMiLCJwb3B1cENvbnRlbnQiLCJvYnMiLCJHcmFwaEljb24iLCJpMThuIiwidCIsInNldmVyaXR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOzs7Ozs7Ozs7O0FBT0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUVPLElBQU1BLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBcUIsQ0FBQ0MsS0FBRCxFQUFnQkMsS0FBaEIsRUFBa0M7QUFBQTs7QUFDbEUsU0FDRSxDQUFBQSxLQUFLLFNBQUwsSUFBQUEsS0FBSyxXQUFMLG1DQUFBQSxLQUFLLENBQUVDLFlBQVAsNEVBQXFCQyxNQUFyQixNQUFnQyxDQUFoQyxJQUNBSCxLQUFLLENBQUNJLEVBQU4sS0FBYUgsS0FBSyxDQUFDQyxZQUFOLENBQW1CLENBQW5CLEVBQXNCRyxRQUZyQztBQUlELENBTE0sQyxDQU9QO0FBQ0E7Ozs7O0FBQ08sSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUMvQkMsY0FEK0IsRUFFL0JQLEtBRitCLEVBRy9CUSxHQUgrQixFQUk1QjtBQUNIO0FBQ0FDLEVBQUFBLGdCQUFnQixDQUFDVCxLQUFELENBQWhCLEtBQTRCLElBQTVCLElBQ0U7QUFD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TSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHcmFwaEljb24gZnJvbSAnLi4vLi4vLi4vYXNzZXRzL2xpbmUtY2hhcnQuc3ZnJztcbmltcG9ydCBMLCB7IExhdExuZ1R1cGxlIH0gZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgaTE4biBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMvaTE4bic7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9wb2ludHMvbW9kZWxzL0lQb2ludCc7XG5pbXBvcnQgYmx1ZUNpcmNsZVVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvYmx1ZS1jaXJjbGUuc3ZnJztcbmltcG9ydCBzYW1wbGluZ0ljb25VUkwgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL3BvaW50X2ljb25zL3NhbXBsaW5nLWljb24uc3ZnJztcbmltcG9ydCBwaW5rQ2lyY2xlVVJMIGZyb20gJy4uLy4uLy4uL2Fzc2V0cy9wb2ludF9pY29ucy9waW5rLWNpcmNsZS5zdmcnO1xuaW1wb3J0IG9ic2VydmF0aW9uSWNvblVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvb2JzZXJ2YXRpb24taWNvbi5zdmcnO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvZXZlbnRzL21vZGVscy9JRXZlbnQnO1xuaW1wb3J0IHJlZFBpblJlZFNoYWRvdyBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvcmVkLXBpbi1yZWQtc2hhZG93LnBuZyc7XG5pbXBvcnQgd2hpdGVQaW5SZWRTaGFkb3cgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL3BvaW50X2ljb25zL3doaXRlLXBpbi1yZWQtc2hhZG93LnBuZyc7XG5pbXBvcnQgd2hpdGVQaW5CbGFja1NoYWRvdyBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvd2hpdGUtcGluLWJsYWNrLXNoYWRvdy5wbmcnO1xuaW1wb3J0IHllbGxvd0NpcmNsZVVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMveWVsbG93LWNpcmNsZS5zdmcnO1xuaW1wb3J0IHBsYW50SWNvblVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvZmFjdG9yeS1pY29uLnN2Zyc7XG5pbXBvcnQgZ3JlZW5DaXJjbGVVUkwgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL3BvaW50X2ljb25zL2dyZWVuLWNpcmNsZS5zdmcnO1xuaW1wb3J0IHB1bXBTdGF0aW9uSWNvblVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvcHVtcC1zdGF0aW9uLWljb24uc3ZnJztcbmltcG9ydCBjb2xsZWN0b3JJY29uIGZyb20gJy4uLy4uLy4uL2Fzc2V0cy9tYXAvcGluLXdhdGVyLnN2Zyc7XG5pbXBvcnQgYnJpZ2h0Qmx1ZUNpcmNsZVVSTCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvYnJpZ2h0LWJsdWUtY2lyY2xlLnN2Zyc7XG5pbXBvcnQgV1dUUEljb25VUkwgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL3BvaW50X2ljb25zL1dXVFAtaWNvbi5zdmcnO1xuaW1wb3J0IHdhdGVySWNvbk5vQmFja2dyb3VuZCBmcm9tICcuLi8uLi8uLi9hc3NldHMvcG9pbnRfaWNvbnMvd2F0ZXItbm8tYmFja2dyb3VuZC5zdmcnO1xuaW1wb3J0IHdoaXRlUG9pbnQgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL3doaXRlLXBvaW50LnBuZyc7XG5cbmV4cG9ydCBjb25zdCBpc0NvbGxlY3RvckZvY3VzZWQgPSAocG9pbnQ6IElQb2ludCwgZXZlbnQ6IElFdmVudCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGV2ZW50Py5vYnNlcnZhdGlvbnM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgIHBvaW50LmlkID09PSBldmVudC5vYnNlcnZhdGlvbnNbMF0ucG9pbnRfaWRcbiAgKTtcbn07XG5cbi8vIGljb25TaXplOiBbd2lkdGgsIGhlaWdodF0sXG4vLyBJY29uQW5jaG9yOiBbKC1yaWdodCkoK2xlZnQpLCAoLWRvd24pKCt1cCldXG5leHBvcnQgY29uc3QgY3JlYXRlQnViYmxlUG9pbnQgPSAoXG4gIG1hcmtlckxvY2F0aW9uOiBMYXRMbmdUdXBsZSxcbiAgcG9pbnQ6IElQb2ludCxcbiAgbWFwLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgbWF0Y2hJY29uVG9Qb2ludChwb2ludCkgIT09IG51bGwgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbWF0Y2hJY29uVG9Qb2ludChwb2ludCkuZm9yRWFjaCgoaWNvbjogYW55KSA9PiB7XG4gICAgICBsZXQgcG9pbnRDdXN0b21JY29uOiBhbnkgPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICByaXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICB9KS5hZGRUbyhtYXApO1xuICAgICAgcG9pbnRDdXN0b21JY29uLmJpbmRUb29sdGlwKFxuICAgICAgICBgJHtwb2ludC5ncm91cC5uYW1lfSAoJHtwb2ludC5ncm91cC5zZWN0b3JfbmFtZX0pYCxcbiAgICAgICk7XG4gICAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdF9pZCddID0gcG9pbnQuaWQ7XG4gICAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdCddID0gJ1BvaW50JztcbiAgICB9KTtcblxuICBpZiAocG9pbnQucmVsYXRlZEV2ZW50c0Ftb3VudCkge1xuICAgIGxldCBwb2ludEN1c3RvbUljb24gPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgICAgaWNvbjogTC5kaXZJY29uKHtcbiAgICAgICAgY2xhc3NOYW1lOiBgXG4gICAgICAgICAgJHtcbiAgICAgICAgICAgIHBvaW50LnJlbGF0ZWRFdmVudHNBbW91bnQgPj0gMTAwXG4gICAgICAgICAgICAgID8gJ2NpcmNsZS1ldmVudHMtYW1vdW50IGNpcmNsZS1ldmVudHMtYW1vdW50LS10cmlkaWdpdCdcbiAgICAgICAgICAgICAgOiAnY2lyY2xlLWV2ZW50cy1hbW91bnQnXG4gICAgICAgICAgfSBcbiAgICAgICAgICAke3BvaW50LnJlbGF0ZWRFdmVudHNBbW91bnQgPiAyID8gJ2FsZXJ0LWNvbG9yJyA6ICcnfVxuICAgICAgICAgICAgYCxcbiAgICAgICAgaHRtbDogYDxwPiR7cG9pbnQucmVsYXRlZEV2ZW50c0Ftb3VudH08L3A+YCxcbiAgICAgICAgaWNvbkFuY2hvcjogWy01LCA0Ml0sXG4gICAgICB9KSxcbiAgICAgIHJpc2VPbkhvdmVyOiBmYWxzZSxcbiAgICB9KS5hZGRUbyhtYXApO1xuXG4gICAgcG9pbnRDdXN0b21JY29uWydrYW5kb19vYmplY3RfaWQnXSA9IHBvaW50LmlkO1xuICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0J10gPSAnSWNvbk51bWJlcic7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVNYW5ob2xlUG9pbnQgPSAoXG4gIG1hcmtlckxvY2F0aW9uOiBMYXRMbmdUdXBsZSxcbiAgcG9pbnQ6IElQb2ludCxcbiAgbWFwLFxuKSA9PiB7XG4gIGxldCBwb2ludEljb24gPSBMLmljb24oe1xuICAgIGljb25Vcmw6IHdoaXRlUG9pbnQsXG4gICAgaWNvblNpemU6IFs5LCA5XSxcbiAgICBpY29uQW5jaG9yOiBbNC41LCA0LjVdLFxuICB9KTtcbiAgbGV0IG1hbmhvbGVJY29uOiBhbnkgPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgIGljb246IHBvaW50SWNvbixcbiAgICByaXNlT25Ib3ZlcjogdHJ1ZSxcbiAgfSkuYWRkVG8obWFwKTtcbiAgbWFuaG9sZUljb24uYmluZFRvb2x0aXAoYCR7cG9pbnQuZ3JvdXAubmFtZX0gKCR7cG9pbnQuZ3JvdXAuc2VjdG9yX25hbWV9KWApO1xuICBtYW5ob2xlSWNvblsna2FuZG9fb2JqZWN0X2lkJ10gPSBwb2ludC5pZDtcbiAgbWFuaG9sZUljb25bJ2thbmRvX29iamVjdCddID0gJ1BvaW50Jztcbn07XG5cbmV4cG9ydCBjb25zdCBtYXRjaEljb25Ub1BvaW50ID0gKHBvaW50OiBJUG9pbnQsIGV2ZW50OiBJRXZlbnQpID0+IHtcbiAgc3dpdGNoIChwb2ludC5ncm91cC50eXBlKSB7XG4gICAgY2FzZSAnR3JvdXBzOjpGYWN0b3J5JzpcbiAgICAgIGlmIChjb21iaW5lZEZhY3RvcnlJY29uLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAobWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UoZXZlbnQsIHBvaW50KSkge1xuICAgICAgICAgIGNvbWJpbmVkRmFjdG9yeUljb24udW5zaGlmdChzZWxlY3RlZEJhY2tncm91bmQoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWFya2VyQmVsb25nc1RvU291cmNlKGV2ZW50LCBwb2ludCkpIHtcbiAgICAgICAgICBjb21iaW5lZEZhY3RvcnlJY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21iaW5lZEZhY3RvcnlJY29uLnVuc2hpZnQoc3RhbmRhcmRCYWNrZ3JvdW5kKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21iaW5lZEZhY3RvcnlJY29uO1xuICAgIGNhc2UgJ0dyb3Vwczo6UHVtcFN0YXRpb24nOlxuICAgICAgaWYgKGNvbWJpbmVkUHVtcFN0YXRpb25JY29uLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAobWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UoZXZlbnQsIHBvaW50KSkge1xuICAgICAgICAgIGNvbWJpbmVkUHVtcFN0YXRpb25JY29uLnVuc2hpZnQoc2VsZWN0ZWRCYWNrZ3JvdW5kKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZShldmVudCwgcG9pbnQpKSB7XG4gICAgICAgICAgY29tYmluZWRQdW1wU3RhdGlvbkljb24udW5zaGlmdChiZWxvbmdzVG9Tb3VyY2VCYWNrZ3JvdW5kKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbWJpbmVkUHVtcFN0YXRpb25JY29uLnVuc2hpZnQoc3RhbmRhcmRCYWNrZ3JvdW5kKCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21iaW5lZFB1bXBTdGF0aW9uSWNvbjtcbiAgICBjYXNlICdHcm91cHM6Oldhc3Rld2F0ZXJUcmVhdG1lbnRQbGFudCc6XG4gICAgICBpZiAoY29tYmluZWRXV1RQSWNvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKG1hcmtlckJlbG9uZ3NUb1NlbGVjdGVkU291cmNlKGV2ZW50LCBwb2ludCkpIHtcbiAgICAgICAgICBjb21iaW5lZFdXVFBJY29uLnVuc2hpZnQoc2VsZWN0ZWRCYWNrZ3JvdW5kKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZShldmVudCwgcG9pbnQpKSB7XG4gICAgICAgICAgY29tYmluZWRXV1RQSWNvbi51bnNoaWZ0KGJlbG9uZ3NUb1NvdXJjZUJhY2tncm91bmQoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tYmluZWRXV1RQSWNvbi51bnNoaWZ0KHN0YW5kYXJkQmFja2dyb3VuZCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tYmluZWRXV1RQSWNvbjtcblxuICAgIGNhc2UgJ0dyb3Vwczo6Q29sbGVjdG9ycyc6XG4gICAgICBpZiAoaXNDb2xsZWN0b3JGb2N1c2VkKHBvaW50LCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBMLmljb24oe1xuICAgICAgICAgICAgaWNvblVybDogcmVkUGluUmVkU2hhZG93LFxuICAgICAgICAgICAgaWNvblNpemU6IFs2MiwgNjJdLFxuICAgICAgICAgICAgaWNvbkFuY2hvcjogWzMwLCA1Ml0sXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICBMLmljb24oe1xuICAgICAgICAgICAgaWNvblVybDogd2F0ZXJJY29uTm9CYWNrZ3JvdW5kLFxuICAgICAgICAgICAgaWNvblNpemU6IFs0NiwgNDZdLFxuXG4gICAgICAgICAgICBpY29uQW5jaG9yOiBbMjIsIDQ0XSxcbiAgICAgICAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWJpbmVkQ29sbGVjdG9yc0ljb247XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzdGFuZGFyZEJhY2tncm91bmQgPSAoXG4gIHNlY29uZGFyeTogYm9vbGVhbiA9IGZhbHNlLFxuICB0aGlyZDogYm9vbGVhbiA9IGZhbHNlLFxuKSA9PiB7XG4gIHJldHVybiBMLmljb24oe1xuICAgIGljb25Vcmw6IHdoaXRlUGluQmxhY2tTaGFkb3csXG4gICAgaWNvblNpemU6IHNlY29uZGFyeSA/IFsyMCwgMjBdIDogWzQzLCA0Nl0sXG4gICAgaWNvbkFuY2hvcjogc2Vjb25kYXJ5ICYmIHRoaXJkID8gWy0yLCAxOV0gOiBzZWNvbmRhcnkgPyBbLTIsIDQ0XSA6IFsyMCwgNDJdLFxuICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29tYmluZWRGYWN0b3J5SWNvbiA9IFtcbiAgTC5pY29uKHtcbiAgICBpY29uVXJsOiB5ZWxsb3dDaXJjbGVVUkwsXG4gICAgaWNvblNpemU6IFsyNSwgMjRdLFxuICAgIGljb25BbmNob3I6IFsxMC43LCAzMy43XSxcbiAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gIH0pLFxuICBMLmljb24oe1xuICAgIGljb25Vcmw6IHBsYW50SWNvblVSTCxcbiAgICBpY29uU2l6ZTogWzE1LCAxNV0sXG4gICAgaWNvbkFuY2hvcjogWzUsIDMwXSxcbiAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gIH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVkUHVtcFN0YXRpb25JY29uID0gW1xuICBMLmljb24oe1xuICAgIGljb25Vcmw6IGdyZWVuQ2lyY2xlVVJMLFxuICAgIGljb25TaXplOiBbMjUsIDI0XSxcbiAgICBpY29uQW5jaG9yOiBbMTAuNywgMzMuN10sXG4gICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICB9KSxcbiAgTC5pY29uKHtcbiAgICBpY29uVXJsOiBwdW1wU3RhdGlvbkljb25VUkwsXG4gICAgaWNvblNpemU6IFsyMCwgMjBdLFxuICAgIGljb25BbmNob3I6IFs3LCAzMl0sXG4gICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICB9KSxcbl07XG5cbmV4cG9ydCBjb25zdCBjb21iaW5lZENvbGxlY3RvcnNJY29uID0gW1xuICBMLmljb24oe1xuICAgIGljb25Vcmw6IGNvbGxlY3Rvckljb24sXG4gICAgaWNvblNpemU6IFs0NSwgNDVdLFxuXG4gICAgaWNvbkFuY2hvcjogWzI1LCA1MF0sXG4gICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICB9KSxcbl07XG5cbmV4cG9ydCBjb25zdCBjb21iaW5lZFdXVFBJY29uID0gW1xuICBMLmljb24oe1xuICAgIGljb25Vcmw6IGJyaWdodEJsdWVDaXJjbGVVUkwsXG4gICAgaWNvblNpemU6IFsyNSwgMjVdLFxuICAgIGljb25BbmNob3I6IFsxMC43LCAzMy43XSxcbiAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gIH0pLFxuICBMLmljb24oe1xuICAgIGljb25Vcmw6IFdXVFBJY29uVVJMLFxuICAgIGljb25TaXplOiBbMjAsIDIwXSxcbiAgICBpY29uQW5jaG9yOiBbOCwgMzFdLFxuICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgfSksXG5dO1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRCYWNrZ3JvdW5kID0gKCkgPT4ge1xuICByZXR1cm4gTC5pY29uKHtcbiAgICBpY29uVXJsOiByZWRQaW5SZWRTaGFkb3csXG4gICAgaWNvblNpemU6IFs2NywgNzBdLFxuICAgIGljb25BbmNob3I6IFszMiwgNTRdLFxuICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCA9ICgpID0+IHtcbiAgcmV0dXJuIEwuaWNvbih7XG4gICAgaWNvblVybDogd2hpdGVQaW5SZWRTaGFkb3csXG4gICAgaWNvblNpemU6IFs2NywgNzBdLFxuICAgIGljb25BbmNob3I6IFszMiwgNTRdLFxuICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UgPSAoZXZlbnQ6IElFdmVudCwgcG9pbnQ6IElQb2ludCkgPT4ge1xuICBsZXQgc291cmNlO1xuXG4gIGlmIChldmVudCAhPT0gbnVsbCAmJiBldmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc291cmNlID0gZXZlbnQuc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLnBvaW50X2lkID09PSBwb2ludC5pZClbMF07XG4gIH1cblxuICByZXR1cm4gZXZlbnQgIT09IG51bGwgJiYgc291cmNlICYmIGV2ZW50LnNlbGVjdGVkX3NvdXJjZSA9PT0gc291cmNlLnBvaW50X2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IG1hcmtlckJlbG9uZ3NUb1NvdXJjZSA9IChldmVudDogSUV2ZW50LCBwb2ludDogSVBvaW50KSA9PiB7XG4gIGlmIChldmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIHJldHVybiAoXG4gICAgZXZlbnQgIT09IG51bGwgJiZcbiAgICBldmVudC5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UucG9pbnRfaWQgPT09IHBvaW50LmlkKVswXVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNhbXBsaW5nSWNvblBvaW50ID0gKFxuICBtYXJrZXJMb2NhdGlvbjogTGF0TG5nVHVwbGUsXG4gIHNlY29uZGFyeUljb246IGJvb2xlYW4sXG4gIG1hcCxcbiAgcG9pbnQ6IElQb2ludCxcbiAgZXZlbnQ6IElFdmVudCxcbikgPT4ge1xuICAvLyBpY29uU2l6ZTogW3dpZHRoLCBoZWlnaHRdLFxuICAvLyBJY29uIEFuY2hvcjogWygtcmlnaHQpKCtsZWZ0KSwgKC1kb3duKSgrdXApXVxuICBsZXQgc2FtcGxpbmdJY29uID0gW1xuICAgIEwuaWNvbih7XG4gICAgICBpY29uVXJsOiBibHVlQ2lyY2xlVVJMLFxuICAgICAgaWNvblNpemU6IHNlY29uZGFyeUljb24gPyBbMTAsIDEwXSA6IFsyNSwgMjRdLFxuICAgICAgaWNvbkFuY2hvcjogc2Vjb25kYXJ5SWNvbiA/IFstNywgMTVdIDogWzEwLjcsIDMzLjddLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pLFxuICAgIEwuaWNvbih7XG4gICAgICBpY29uVXJsOiBzYW1wbGluZ0ljb25VUkwsXG4gICAgICBpY29uU2l6ZTogc2Vjb25kYXJ5SWNvbiA/IFs3LCA3XSA6IFsxMywgMTVdLFxuICAgICAgaWNvbkFuY2hvcjogc2Vjb25kYXJ5SWNvbiA/IFstOCwgMTNdIDogWzUsIDMwXSxcbiAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLTMwXSxcbiAgICB9KSxcbiAgXTtcblxuICBpZiAobWFya2VyQmVsb25nc1RvU2VsZWN0ZWRTb3VyY2UoZXZlbnQsIHBvaW50KSAmJiAhc2Vjb25kYXJ5SWNvbikge1xuICAgIHNhbXBsaW5nSWNvbi51bnNoaWZ0KHNlbGVjdGVkQmFja2dyb3VuZCgpKTtcbiAgfSBlbHNlIGlmIChtYXJrZXJCZWxvbmdzVG9Tb3VyY2UoZXZlbnQsIHBvaW50KSAmJiAhc2Vjb25kYXJ5SWNvbikge1xuICAgIHNhbXBsaW5nSWNvbi51bnNoaWZ0KGJlbG9uZ3NUb1NvdXJjZUJhY2tncm91bmQoKSk7XG4gIH0gZWxzZSB7XG4gICAgc2FtcGxpbmdJY29uLnVuc2hpZnQoc3RhbmRhcmRCYWNrZ3JvdW5kKHNlY29uZGFyeUljb24sIHRydWUpKTtcbiAgfVxuXG4gIHNhbXBsaW5nSWNvbi5mb3JFYWNoKChpY29uKSA9PiB7XG4gICAgbGV0IHBvaW50Q3VzdG9tSWNvbjogYW55ID0gTC5tYXJrZXIobWFya2VyTG9jYXRpb24sIHtcbiAgICAgIGljb246IGljb24sXG4gICAgICByaXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcbiAgICBwb2ludEN1c3RvbUljb24uYmluZFRvb2x0aXAoXG4gICAgICBgJHtwb2ludC5ncm91cC5uYW1lfSAoJHtwb2ludC5ncm91cC5zZWN0b3JfbmFtZX0pYCxcbiAgICApO1xuICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0X2lkJ10gPSBwb2ludC5pZDtcbiAgICBwb2ludEN1c3RvbUljb25bJ2thbmRvX29iamVjdCddID0gJ1NhbXBsaW5nJztcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlT2JzZXJ2YXRpb25JY29uUG9pbnQgPSAoXG4gIG1hcmtlckxvY2F0aW9uOiBMYXRMbmdUdXBsZSxcbiAgc2Vjb25kYXJ5SWNvbjogYm9vbGVhbixcbiAgbWFwLFxuICBwb2ludDogSVBvaW50LFxuICBldmVudDogSUV2ZW50LFxuKSA9PiB7XG4gIC8vIGljb25TaXplOiBbd2lkdGgsIGhlaWdodF0sXG4gIC8vIEljb24gQW5jaG9yOiBbKC1yaWdodCkoK2xlZnQpLCAoLWRvd24pKCt1cCldXG4gIGxldCBvYnNlcnZhdGlvbkljb24gPSBbXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IHBpbmtDaXJjbGVVUkwsXG4gICAgICBpY29uU2l6ZTogc2Vjb25kYXJ5SWNvbiA/IFsxMCwgMTBdIDogWzI1LCAyNF0sXG4gICAgICBpY29uQW5jaG9yOiBzZWNvbmRhcnlJY29uID8gWy03LCA0MF0gOiBbMTAuNywgMzMuN10sXG4gICAgICBwb3B1cEFuY2hvcjogWzAsIC0zMF0sXG4gICAgfSksXG4gICAgTC5pY29uKHtcbiAgICAgIGljb25Vcmw6IG9ic2VydmF0aW9uSWNvblVSTCxcbiAgICAgIGljb25TaXplOiBzZWNvbmRhcnlJY29uID8gWzcsIDddIDogWzEzLCAxNV0sXG4gICAgICBpY29uQW5jaG9yOiBzZWNvbmRhcnlJY29uID8gWy04LCAzOF0gOiBbNSwgMzBdLFxuICAgICAgcG9wdXBBbmNob3I6IFswLCAtMzBdLFxuICAgIH0pLFxuICBdO1xuXG4gIGlmIChtYXJrZXJCZWxvbmdzVG9TZWxlY3RlZFNvdXJjZShldmVudCwgcG9pbnQpICYmICFzZWNvbmRhcnlJY29uKSB7XG4gICAgb2JzZXJ2YXRpb25JY29uLnVuc2hpZnQoc2VsZWN0ZWRCYWNrZ3JvdW5kKCkpO1xuICB9IGVsc2UgaWYgKG1hcmtlckJlbG9uZ3NUb1NvdXJjZShldmVudCwgcG9pbnQpICYmICFzZWNvbmRhcnlJY29uKSB7XG4gICAgb2JzZXJ2YXRpb25JY29uLnVuc2hpZnQoYmVsb25nc1RvU291cmNlQmFja2dyb3VuZCgpKTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZhdGlvbkljb24udW5zaGlmdChzdGFuZGFyZEJhY2tncm91bmQoc2Vjb25kYXJ5SWNvbikpO1xuICB9XG5cbiAgb2JzZXJ2YXRpb25JY29uLmZvckVhY2goKGljb24pID0+IHtcbiAgICBsZXQgcG9pbnRDdXN0b21JY29uOiBhbnkgPSBMLm1hcmtlcihtYXJrZXJMb2NhdGlvbiwge1xuICAgICAgaWNvbjogaWNvbixcbiAgICAgIHJpc2VPbkhvdmVyOiBmYWxzZSxcbiAgICB9KS5hZGRUbyhtYXApO1xuICAgIHBvaW50Q3VzdG9tSWNvbi5iaW5kVG9vbHRpcChcbiAgICAgIGAke3BvaW50Lmdyb3VwLm5hbWV9ICgke3BvaW50Lmdyb3VwLnNlY3Rvcl9uYW1lfSlgLFxuICAgICk7XG4gICAgcG9pbnRDdXN0b21JY29uWydrYW5kb19vYmplY3RfaWQnXSA9IHBvaW50LmlkO1xuICAgIHBvaW50Q3VzdG9tSWNvblsna2FuZG9fb2JqZWN0J10gPSAnT2JzZXJ2YXRpb24nO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTYW1wbGluZ0ljb25zID0gKFxuICBtYXJrZXJMb2NhdGlvbjogTGF0TG5nVHVwbGUsXG4gIGV2ZW50OiBJRXZlbnQsXG4gIHBvaW50OiBJUG9pbnQsXG4gIG1hcCxcbikgPT4ge1xuICBsZXQgc2FtcGxlZFBvaW50SWRzID0gZXZlbnQuc2FtcGxpbmdzLm1hcCgocykgPT4gcy5wb2ludF9pZCk7XG4gIGlmIChcbiAgICBldmVudCAhPT0gbnVsbCAmJlxuICAgIGV2ZW50LnNhbXBsaW5ncy5sZW5ndGggIT09IDAgJiZcbiAgICBzYW1wbGVkUG9pbnRJZHMuaW5jbHVkZXMocG9pbnQuaWQpXG4gICkge1xuICAgIGNyZWF0ZVNhbXBsaW5nSWNvblBvaW50KFxuICAgICAgbWFya2VyTG9jYXRpb24sXG4gICAgICBtYXRjaEljb25Ub1BvaW50KHBvaW50LCBldmVudCkgIT09IG51bGwsXG4gICAgICBtYXAsXG4gICAgICBwb2ludCxcbiAgICAgIGV2ZW50LFxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwb3B1cENvbnRlbnQgPSAob2JzOiBhbnksIHBvaW50OiBJUG9pbnQpID0+IHtcbiAgaWYgKG9icyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtcG9wdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtZ3JhcGgtaWNvbiBwb3B1cC1ncmFwaC1pY29uLSR7cG9pbnQuaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiJHtHcmFwaEljb259XCIvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NpdGUtbmFtZVwiPjxiPiR7cG9pbnQuZ3JvdXAubmFtZX08L2I+PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPGhyLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWN0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LXBvcHVwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWdyYXBoLWljb24gcG9wdXAtZ3JhcGgtaWNvbi0ke29icy5pZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIke0dyYXBoSWNvbn1cIi8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwicG9wdXAtY29udGVudF9fc2l0ZS1uYW1lXCI+PGI+JHtcbiAgICAgICAgICAgICAgICAgICAgICBwb2ludC5ncm91cC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH08L2I+PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NldmVyaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NldmVyaXR5LXBcIj4ke2kxOG4udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYGV2ZW50c19vdmVydmlldy5zZXZlcml0eWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcHVwLWNvbnRlbnRfX3NldmVyaXR5LS0nICsgb2JzLnNldmVyaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJwb3B1cC1jb250ZW50X19zZXZlcml0eS1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aTE4bi50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBldmVudHNfb3ZlcnZpZXcuc2V2ZXJpdGllcy4ke29icy5zZXZlcml0eX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJwb3B1cC1jb250ZW50X19oclwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX2Rpc2NoYXJnZS10aW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicG9wdXAtY29udGVudF9fc2V2ZXJpdHktcFwiPiR7aTE4bi50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGV2ZW50c19vdmVydmlldy5maXJzdF9zZWVuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGIgaWQ9XCJmaXJzdC1zZWVuLXBvcHVwXCI+PC9iPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInBvcHVwLWNvbnRlbnRfX3NldmVyaXR5LXBcIj4ke2kxOG4udChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBldmVudHNfb3ZlcnZpZXcubGFzdF9zZWVuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTo8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGIgaWQ9XCJsYXN0LXNlZW4tcG9wdXBcIj48L2I+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGA7XG4gIH1cbn07XG4iXX0=