@almatar/smart-booking-dashboard 0.0.1 → 0.0.2-alpha.2

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 (90) hide show
  1. package/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
  2. package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
  3. package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
  4. package/esm2022/lib/components/almatar-aside/aside.component.mjs +123 -0
  5. package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
  6. package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
  7. package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
  8. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
  9. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
  10. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
  11. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
  12. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +242 -0
  13. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.mjs +48 -0
  14. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
  15. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
  16. package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
  17. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
  18. package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
  19. package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
  20. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +448 -0
  21. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
  22. package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
  23. package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
  24. package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
  25. package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
  26. package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
  27. package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
  28. package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
  29. package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
  30. package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
  31. package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
  32. package/esm2022/lib/models/booking.types.mjs +73 -2
  33. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +25 -7
  34. package/esm2022/lib/services/booking.service.mjs +6 -2
  35. package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
  36. package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
  37. package/esm2022/lib/shared/environments/environment.mjs +10 -0
  38. package/esm2022/lib/shared/models/index.mjs +6 -0
  39. package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
  40. package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
  41. package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
  42. package/esm2022/lib/shared/services/api.service.mjs +42 -0
  43. package/esm2022/lib/shared/services/shared.service.mjs +34 -0
  44. package/esm2022/lib/shared/services/translation.service.mjs +61 -0
  45. package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
  46. package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
  47. package/fesm2022/almatar-smart-booking-dashboard.mjs +3278 -180
  48. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  49. package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
  50. package/lib/components/almatar-aside/aside.component.d.ts +47 -0
  51. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
  52. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
  53. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
  54. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
  55. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
  56. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.d.ts +44 -0
  57. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.d.ts +19 -0
  58. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
  59. package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
  60. package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
  61. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
  62. package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
  63. package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
  64. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +82 -0
  65. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
  66. package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
  67. package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
  68. package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
  69. package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
  70. package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
  71. package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
  72. package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
  73. package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
  74. package/lib/models/booking.types.d.ts +28 -0
  75. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +1 -0
  76. package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
  77. package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
  78. package/lib/shared/environments/environment.d.ts +7 -0
  79. package/lib/shared/models/index.d.ts +11 -0
  80. package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
  81. package/lib/shared/modules/loader/loader.module.d.ts +13 -0
  82. package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
  83. package/lib/shared/services/api.service.d.ts +43 -0
  84. package/lib/shared/services/shared.service.d.ts +12 -0
  85. package/lib/shared/services/translation.service.d.ts +17 -0
  86. package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
  87. package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
  88. package/package.json +2 -19
  89. package/LICENSE +0 -21
  90. package/README.md +0 -132
@@ -0,0 +1,544 @@
1
+ import { AsideComponent } from '../almatar-aside/aside.component';
2
+ import { Component, ChangeDetectionStrategy, DestroyRef, inject, signal, computed, output, input, effect } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { ManageBookingFailedModalComponent } from '../shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component';
5
+ import { LoaderModule } from '../../shared/modules/loader/loader.module';
6
+ import { HotelManageBookingService } from '../shared/services/hotel-manage-booking/hotel-manage-booking.service';
7
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
+ import { ActivatedRoute } from '@angular/router';
9
+ import { AlmatarHotelAutoCancellationStepEnum } from './enums/almatar-hotel-auto-cancellation-step.enum';
10
+ import { AlmatarHotelAutoCancellationService } from './services/almatar-hotel-auto-cancellation.service';
11
+ import { AlmatarHotelAutoCancellationEndpointsService } from './services/almatar-hotel-auto-cancellation-endpoints.service';
12
+ import { AlmatarHotelAutoCancellationSelectRoomsComponent } from './components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component';
13
+ import { AlmatarHotelAutoCancellationRefundSummaryComponent } from './components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component';
14
+ import { AlmatarHotelAutoCancellationRefundMethodComponent } from './components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component';
15
+ import { ResultOverlayComponent } from './components/result-overlay/result-overlay.component';
16
+ import { HotelManageBookingAsideTabEnum } from '../shared/enums/hotel-manage-booking-aside-tab.enum';
17
+ import { Store } from '@ngrx/store';
18
+ import { filter } from 'rxjs/operators';
19
+ import { getCurrentCurrency } from '../../shared/store/selectors/currency.selectors';
20
+ import { environments } from '../../shared/environments/environment';
21
+ import { AlmatarIconModule } from '../../shared/modules/almatar-icon/almatar-icon.module';
22
+ import { SharedService } from '../../shared/services/shared.service';
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "../../shared/modules/loader/loader.module";
25
+ export class AlmatarHotelAutoCancellationComponent {
26
+ constructor() {
27
+ this.hotelManageBookingService = inject(HotelManageBookingService);
28
+ this.autoCancellationService = inject(AlmatarHotelAutoCancellationService);
29
+ this.HotelManageBookingService = inject(HotelManageBookingService);
30
+ this.autoCancellationEndpointsService = inject(AlmatarHotelAutoCancellationEndpointsService);
31
+ this.activatedRoute = inject(ActivatedRoute);
32
+ this.destroyRef = inject(DestroyRef);
33
+ this.store = inject(Store);
34
+ this.sharedService = inject(SharedService);
35
+ this.selectedHotelBooking = input(null);
36
+ this.closed = output();
37
+ this.cancellationSuccess = output();
38
+ this.nonRefundableSubmitSuccess = output();
39
+ this.chatWithAgent = output();
40
+ this.showConfirmModal = signal(false);
41
+ this.showErrorModal = signal(false);
42
+ this.showAside = signal(true);
43
+ this.isLoading = signal(false);
44
+ this.isCancelling = signal(false);
45
+ this.hotelManageError = signal('');
46
+ this.isNusk = signal(false);
47
+ this.showResultOverlay = signal(false);
48
+ this.resultOverlayData = signal(null);
49
+ this.rooms = signal([]);
50
+ this.packages = signal([]);
51
+ this.hotelInfo = signal(null);
52
+ this.currentCurrency = signal(null);
53
+ this.refundDetailsData = signal(null);
54
+ this.selectedPackageIds = signal([]);
55
+ this.refundMethod = signal('wallet');
56
+ this.refundResponseData = signal(null);
57
+ this.stepEnum = AlmatarHotelAutoCancellationStepEnum;
58
+ this.currentStep = computed(() => this.autoCancellationService.currentStep());
59
+ this.isSingleRoom = computed(() => this.rooms().length === 1);
60
+ this.isSinglePackage = computed(() => this.packages().length === 1);
61
+ // Get supplier from booking or first package
62
+ this.bookingSuppliers = computed(() => {
63
+ const booking = this.selectedHotelBooking();
64
+ if (!booking)
65
+ return undefined;
66
+ // Try to get supplier from booking level first
67
+ if (booking.supplier) {
68
+ return booking.supplier;
69
+ }
70
+ // Otherwise get from first package
71
+ const packages = this.packages();
72
+ return packages.length > 0 ? packages[0].supplier : undefined;
73
+ });
74
+ // Computed totals for adults, children, infants from booking packages
75
+ this.totalAdults = computed(() => {
76
+ const booking = this.selectedHotelBooking();
77
+ if (!booking?.packages) {
78
+ return 0;
79
+ }
80
+ return booking.packages.reduce((total, pkg) => {
81
+ const rooms = pkg.rooms || [];
82
+ return (total +
83
+ rooms.reduce((sum, room) => sum + (room.adultsNum || 0), 0));
84
+ }, 0);
85
+ });
86
+ this.totalChildren = computed(() => {
87
+ const booking = this.selectedHotelBooking();
88
+ if (!booking?.packages) {
89
+ return 0;
90
+ }
91
+ return booking.packages.reduce((total, pkg) => {
92
+ const rooms = pkg.rooms || [];
93
+ return (total +
94
+ rooms.reduce((sum, room) => sum + (room.childrenNum || 0), 0));
95
+ }, 0);
96
+ });
97
+ this.totalInfants = computed(() => {
98
+ const booking = this.selectedHotelBooking();
99
+ if (!booking?.packages) {
100
+ return 0;
101
+ }
102
+ return booking.packages.reduce((total, pkg) => {
103
+ const rooms = pkg.rooms || [];
104
+ return (total +
105
+ rooms.reduce((sum, room) => sum + (room.infantsNum || 0), 0));
106
+ }, 0);
107
+ });
108
+ this.asideTitle = computed(() => {
109
+ const step = this.currentStep();
110
+ switch (step) {
111
+ case AlmatarHotelAutoCancellationStepEnum.selectRooms:
112
+ return this.isSinglePackage() ? 'Confirm Cancellation' : 'Select Rooms';
113
+ case AlmatarHotelAutoCancellationStepEnum.refundSummary:
114
+ return 'Cancel Booking Request';
115
+ case AlmatarHotelAutoCancellationStepEnum.refundMethod:
116
+ return 'Select Refund Method';
117
+ default:
118
+ return 'Cancel Booking';
119
+ }
120
+ });
121
+ effect(() => {
122
+ this.HotelManageBookingService.selectedHotelBooking.next(this.selectedHotelBooking());
123
+ // console.log('selectedHotelBooking', this.selectedHotelBooking());
124
+ // console.log('refundDetailsData', this.refundDetailsData());
125
+ });
126
+ }
127
+ get closeIconName() {
128
+ const lang = this.sharedService.getAppLanguage();
129
+ return lang === 'ar' ? 'arrow-left' : 'arrow-right';
130
+ }
131
+ ngOnInit() {
132
+ this.initializeQueryParams();
133
+ this.loadBookingDataFromPackages();
134
+ this.initCurrency();
135
+ }
136
+ initCurrency() {
137
+ this.store
138
+ .select(getCurrentCurrency)
139
+ .pipe(filter((currency) => !!currency), takeUntilDestroyed(this.destroyRef))
140
+ .subscribe((currency) => {
141
+ this.currentCurrency.set(currency);
142
+ });
143
+ }
144
+ ngOnDestroy() {
145
+ this.autoCancellationService.reset();
146
+ this.autoCancellationEndpointsService.clearSelectedPackageIds();
147
+ }
148
+ initializeQueryParams() {
149
+ this.activatedRoute.queryParams
150
+ .pipe(takeUntilDestroyed(this.destroyRef))
151
+ .subscribe((params) => {
152
+ if (params['skipCheck']) {
153
+ this.isNusk.set(true);
154
+ }
155
+ });
156
+ }
157
+ loadBookingDataFromPackages() {
158
+ this.isLoading.set(true);
159
+ const booking = this.selectedHotelBooking();
160
+ if (booking) {
161
+ this.processBookingData(booking);
162
+ }
163
+ else {
164
+ this.hotelManageBookingService.selectedHotelBooking
165
+ .pipe(takeUntilDestroyed(this.destroyRef))
166
+ .subscribe((serviceBooking) => {
167
+ if (serviceBooking) {
168
+ this.processBookingData(serviceBooking);
169
+ }
170
+ this.isLoading.set(false);
171
+ });
172
+ }
173
+ }
174
+ processBookingData(booking) {
175
+ const hotelInfoData = {
176
+ hotelName: booking.hotelName || '',
177
+ hotelImage: booking.coverImage || '',
178
+ checkIn: booking.dateFrom || booking?.from?._i,
179
+ checkOut: booking.dateTo || booking?.to?._i,
180
+ totalRooms: booking.packages?.length || booking.rooms || 1,
181
+ nights: booking.numberOfNights ||
182
+ booking.nightNumber ||
183
+ this.calculateNights(booking.dateFrom, booking.dateTo),
184
+ checkInTime: booking.checkInTime?.split(' ')[0],
185
+ checkOutTime: booking.checkOutTime?.split(' ')[0]
186
+ };
187
+ this.hotelInfo.set(hotelInfoData);
188
+ this.autoCancellationService.setHotelInfo(hotelInfoData);
189
+ // Map to both rooms (for backward compatibility) and packages (new structure)
190
+ const mappedRooms = this.mapPackagesToRooms(booking);
191
+ this.rooms.set(mappedRooms);
192
+ const mappedPackages = this.mapBookingToPackages(booking);
193
+ this.packages.set(mappedPackages);
194
+ this.autoCancellationService.setSelectedRooms(mappedRooms);
195
+ this.isLoading.set(false);
196
+ }
197
+ mapPackagesToRooms(booking) {
198
+ const nights = booking.numberOfNights ||
199
+ booking.nightNumber ||
200
+ this.calculateNights(booking.from, booking.to);
201
+ const packages = booking.packages || [];
202
+ return packages.flatMap((pkg, pkgIndex) => {
203
+ const rooms = pkg.rooms || [];
204
+ return rooms.map((room, roomIndex) => ({
205
+ packageId: pkg.id || String(pkgIndex + 1),
206
+ roomId: room?.roomId || `${pkg.id}-${roomIndex}`,
207
+ roomName: room?.roomName || `Room ${roomIndex + 1}`,
208
+ roomType: room?.roomType || 'Standard Room',
209
+ mealPlan: room?.roomBasis || '',
210
+ isRefundable: pkg.isRefundable !== false,
211
+ isCancelled: pkg.isCancelled,
212
+ manualRefundRequest: !pkg.isRefundable,
213
+ isSelected: false,
214
+ nights: this.hotelInfo()?.nights || nights,
215
+ roomAmount: 0,
216
+ cancellationFee: 0,
217
+ refundAmount: 0,
218
+ bedType: room?.bedType || '',
219
+ roomView: room?.roomView || '',
220
+ roomBasis: room?.roomBasis || '',
221
+ refundability: pkg.isRefundable,
222
+ refundableUntil: pkg.refundableUntil || '',
223
+ adultsNum: room?.adultsNum || 0,
224
+ childrenNum: room?.childrenNum || 0,
225
+ passengerName: room?.passengers?.name || ''
226
+ }));
227
+ });
228
+ }
229
+ mapBookingToPackages(booking) {
230
+ const bookingPackages = booking.packages || [];
231
+ return bookingPackages.map((pkg, pkgIndex) => {
232
+ const rooms = pkg.rooms || [];
233
+ const firstRoom = rooms[0];
234
+ return {
235
+ packageId: pkg.id || String(pkgIndex + 1),
236
+ packageName: firstRoom?.roomName || `Package ${pkgIndex + 1}`,
237
+ boardBasis: firstRoom?.roomBasis || '',
238
+ isRefundable: pkg.isRefundable !== false,
239
+ isSelected: false,
240
+ isCancelled: pkg.isCancelled,
241
+ refundability: pkg.isRefundable,
242
+ refundableUntil: pkg.refundableUntil || '',
243
+ rooms: rooms.map((room, roomIndex) => ({
244
+ roomId: room?.roomId || `${pkg.id}-${roomIndex}`,
245
+ roomName: room?.roomName || `Room ${roomIndex + 1}`,
246
+ roomType: room?.roomType || 'Standard Room',
247
+ bedType: room?.bedType || '',
248
+ roomBasis: room?.roomBasis || ''
249
+ })),
250
+ roomAmount: 0,
251
+ cancellationFee: 0,
252
+ refundAmount: 0,
253
+ manualRefundRequest: !pkg.isRefundable,
254
+ cancelledBefore: false,
255
+ cancellationPolicies: pkg.cancellationPolicies || [],
256
+ CancellationPoliciesRemarks: pkg.cancellationPoliciesRemarks,
257
+ supplier: pkg.supplier
258
+ };
259
+ });
260
+ }
261
+ calculateNights(from, to) {
262
+ if (!from || !to) {
263
+ return 1;
264
+ }
265
+ if (from.diff && typeof from.diff === 'function') {
266
+ return to.diff(from, 'days') || 1;
267
+ }
268
+ const fromDate = new Date(from);
269
+ const toDate = new Date(to);
270
+ const diffTime = Math.abs(toDate.getTime() - fromDate.getTime());
271
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
272
+ return diffDays || 1;
273
+ }
274
+ onContinueToCancel(selectedPackages) {
275
+ // Convert packages to rooms format for backward compatibility with the service
276
+ const selectedRooms = selectedPackages.flatMap((pkg) => pkg.rooms.map((room) => ({
277
+ packageId: pkg.packageId,
278
+ roomId: room.roomId,
279
+ roomName: room.roomName,
280
+ roomType: room.roomType,
281
+ mealPlan: room.roomBasis,
282
+ isRefundable: pkg.isRefundable,
283
+ isCancelled: pkg.isCancelled,
284
+ isSelected: pkg.isSelected,
285
+ nights: 0,
286
+ roomAmount: pkg.roomAmount,
287
+ cancellationFee: pkg.cancellationFee,
288
+ refundAmount: pkg.refundAmount,
289
+ bedType: room.bedType,
290
+ roomBasis: room.roomBasis,
291
+ refundability: pkg.refundability,
292
+ refundableUntil: pkg.refundableUntil,
293
+ cancelledBefore: pkg.cancelledBefore,
294
+ manualRefundRequest: pkg.manualRefundRequest
295
+ })));
296
+ this.autoCancellationService.setSelectedRooms(selectedRooms);
297
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
298
+ }
299
+ onKeepRoom() {
300
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.selectRooms);
301
+ }
302
+ onSelectRefundOption(data) {
303
+ // Check if tenant - redirect to WhatsApp for tenant bookings
304
+ if (environments.isTenant) {
305
+ this.hotelManageBookingService.setActiveAsideTab(HotelManageBookingAsideTabEnum.whatsAppAgent);
306
+ this.showAside.set(false);
307
+ return;
308
+ }
309
+ // console.log('Refund option selected:', data);
310
+ this.selectedPackageIds.set(data.packageIds);
311
+ this.refundResponseData.set(data.responseData);
312
+ const response = data?.responseData;
313
+ const payout = response?.payout || data.payout;
314
+ const totals = response?.totals;
315
+ // const walletRefund = payout?.wallet || payout?.loyaltyToWallet;
316
+ const walletRefund = payout?.wallet;
317
+ const cardRefund = payout?.card ?? 0;
318
+ const tabbyRefund = payout?.tabby ?? payout?.tabby ?? 0;
319
+ const tamaraRefund = payout?.tamara ?? payout?.tamara ?? 0;
320
+ // Check if full wallet refund is allowed based on payout breakdown
321
+ // Wallet refund is allowed if there's no card/tabby/tamara portion
322
+ const hasNonWalletRefund = tabbyRefund > 0 || tamaraRefund > 0;
323
+ const totalRefundAmount = payout?.current ?? data.totalRefund;
324
+ const isFullWalletAllowed = (!hasNonWalletRefund && walletRefund > 0) || cardRefund > 0;
325
+ const loyaltyPointsValue = payout?.loyaltyToWallet ||
326
+ totals?.wala ||
327
+ totals?.qitaf ||
328
+ totals?.mokafa ||
329
+ totals?.hassad ||
330
+ totals?.ygg;
331
+ // Build refund details data for the method selector
332
+ this.refundDetailsData.set({
333
+ totalRefundAmount,
334
+ walletRefundAmount: payout?.wallet,
335
+ totalCardRefundAmount: cardRefund + tabbyRefund + tamaraRefund,
336
+ isFullWalletRefundAllowed: isFullWalletAllowed,
337
+ currency: response?.currency,
338
+ isRefundable: response?.flags?.refundable,
339
+ totalLoyaltyPointsRefundAmount: loyaltyPointsValue,
340
+ // Pass payment method info for proper labeling
341
+ paymentMethodCustomerUsed: this.determinePaymentMethod(totals, payout),
342
+ // Additional fields for proper loyalty program labeling and split refund display
343
+ loyaltyPaymentType: this.determineLoyaltyType(totals, payout),
344
+ totalLoyaltyPoints: loyaltyPointsValue,
345
+ bookingId: this.selectedHotelBooking()?.bookingId
346
+ });
347
+ // Default to wallet if allowed, otherwise originalPaymentMethod
348
+ if (isFullWalletAllowed && walletRefund > 0) {
349
+ this.refundMethod.set('wallet');
350
+ }
351
+ else {
352
+ this.refundMethod.set('originalPaymentMethod');
353
+ }
354
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundMethod);
355
+ }
356
+ /**
357
+ * Determines the payment method label based on totals/payout breakdown.
358
+ * Returns the appropriate gateway code for proper labeling.
359
+ */
360
+ /**
361
+ * Determines the card/installment payment method for the card row label.
362
+ * Loyalty programs are handled separately by determineLoyaltyType().
363
+ */
364
+ determinePaymentMethod(totals, payout) {
365
+ if ((payout?.tabby ?? totals?.tabby ?? 0) > 0) {
366
+ return 'TB'; // Tabby
367
+ }
368
+ if ((payout?.tamara ?? totals?.tamara ?? 0) > 0) {
369
+ return 'TM'; // Tamara
370
+ }
371
+ if ((payout?.card ?? totals?.card ?? 0) > 0) {
372
+ return 'CH'; // Card
373
+ }
374
+ return '';
375
+ }
376
+ /**
377
+ * Determines the loyalty payment type for proper labeling in split refund rows.
378
+ * Returns the loyalty program code (e.g., 'QITAF', 'RAJHI') if applicable.
379
+ */
380
+ determineLoyaltyType(totals, payout) {
381
+ if ((totals?.mokafa ?? 0) > 0) {
382
+ return 'AlRajhiMokafaa';
383
+ }
384
+ if ((totals?.qitaf ?? 0) > 0) {
385
+ return 'Qitaf';
386
+ }
387
+ if ((totals?.wala ?? 0) > 0) {
388
+ return 'Wala';
389
+ }
390
+ if ((payout?.loyaltyToWallet ?? 0) > 0 ||
391
+ (payout?.loyaltyPoints ?? 0) > 0) {
392
+ // Check if we have a specific loyalty type from the response
393
+ const loyaltyType = totals?.loyaltyType;
394
+ if (loyaltyType &&
395
+ [
396
+ 'AlRajhiMokafaa',
397
+ 'Qitaf',
398
+ 'Wala',
399
+ 'ALFURSAN',
400
+ 'ALMATAR_POINTS'
401
+ ].includes(loyaltyType)) {
402
+ return loyaltyType;
403
+ }
404
+ }
405
+ return undefined;
406
+ }
407
+ onMethodSelected(method) {
408
+ this.refundMethod.set(method);
409
+ }
410
+ onBackFromRefundMethod() {
411
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
412
+ }
413
+ onGoBack() {
414
+ const step = this.currentStep();
415
+ switch (step) {
416
+ case AlmatarHotelAutoCancellationStepEnum.refundSummary:
417
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.selectRooms);
418
+ break;
419
+ case AlmatarHotelAutoCancellationStepEnum.refundMethod:
420
+ this.autoCancellationService.setCurrentStep(AlmatarHotelAutoCancellationStepEnum.refundSummary);
421
+ break;
422
+ default:
423
+ // For selectRooms or other steps, do nothing (close modal)
424
+ break;
425
+ }
426
+ }
427
+ canGoBack() {
428
+ const step = this.currentStep();
429
+ return (step === AlmatarHotelAutoCancellationStepEnum.refundSummary ||
430
+ step === AlmatarHotelAutoCancellationStepEnum.refundMethod);
431
+ }
432
+ confirmCancellation() {
433
+ this.isCancelling.set(true);
434
+ this.autoCancellationEndpointsService
435
+ .processAutoCancellation(this.selectedPackageIds(), this.refundMethod())
436
+ .pipe(takeUntilDestroyed(this.destroyRef))
437
+ .subscribe({
438
+ next: (response) => {
439
+ this.isCancelling.set(false);
440
+ this.showAside.set(false);
441
+ // Check if tenant - redirect to WhatsApp
442
+ if (environments.isTenant || response?.data?.isWhatsApp) {
443
+ this.hotelManageBookingService.setActiveAsideTab(HotelManageBookingAsideTabEnum.whatsAppAgent);
444
+ return;
445
+ }
446
+ // Show success overlay
447
+ this.resultOverlayData.set({
448
+ type: 'success',
449
+ title: 'Cancellation Successful!',
450
+ message: 'Your booking has been cancelled successfully. The refund will be processed according to your selected method.',
451
+ confirmText: 'Done'
452
+ });
453
+ this.showResultOverlay.set(true);
454
+ // Also emit for parent component if needed
455
+ this.cancellationSuccess.emit(response);
456
+ },
457
+ error: (error) => {
458
+ this.isCancelling.set(false);
459
+ this.showAside.set(false);
460
+ // Extract error message from various possible structures
461
+ let errorMessage = 'We encountered an issue processing your cancellation. Please try again or contact support.';
462
+ console.error('Cancellation error:', error);
463
+ if (error?.error?.message) {
464
+ errorMessage = error.error.message;
465
+ }
466
+ else if (error?.error?.errors && Array.isArray(error.error.errors) && error.error.errors.length > 0) {
467
+ errorMessage = error.error.errors[0];
468
+ }
469
+ else if (error?.message) {
470
+ errorMessage = error.message;
471
+ }
472
+ else if (typeof error === 'string') {
473
+ errorMessage = error;
474
+ }
475
+ // Show error overlay
476
+ this.resultOverlayData.set({
477
+ type: 'error',
478
+ title: 'Cancellation Failed',
479
+ message: errorMessage,
480
+ confirmText: 'Close'
481
+ });
482
+ this.showResultOverlay.set(true);
483
+ }
484
+ });
485
+ }
486
+ onCloseModal() {
487
+ this.closed.emit();
488
+ }
489
+ onNonRefundableSubmitSuccess(packageName) {
490
+ this.showAside.set(false);
491
+ // Show success overlay for non-refundable request
492
+ this.resultOverlayData.set({
493
+ type: 'success',
494
+ title: 'Request Submitted!',
495
+ message: `Your cancellation request for ${packageName} has been submitted successfully. Our team will review your request and contact you shortly.`,
496
+ confirmText: 'Done'
497
+ });
498
+ this.showResultOverlay.set(true);
499
+ // Also emit for parent component if needed
500
+ this.nonRefundableSubmitSuccess.emit(packageName);
501
+ }
502
+ onChatWithAgent() {
503
+ this.showAside.set(false);
504
+ this.chatWithAgent.emit();
505
+ }
506
+ closeAllModals() {
507
+ this.showConfirmModal.set(false);
508
+ this.showErrorModal.set(false);
509
+ this.showAside.set(false);
510
+ this.closed.emit();
511
+ }
512
+ onResultOverlayConfirm() {
513
+ this.showResultOverlay.set(false);
514
+ this.resultOverlayData.set(null);
515
+ this.closed.emit();
516
+ }
517
+ onResultOverlayCancel() {
518
+ this.showResultOverlay.set(false);
519
+ this.resultOverlayData.set(null);
520
+ }
521
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
522
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation", inputs: { selectedHotelBooking: { classPropertyName: "selectedHotelBooking", publicName: "selectedHotelBooking", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", cancellationSuccess: "cancellationSuccess", nonRefundableSubmitSuccess: "nonRefundableSubmitSuccess", chatWithAgent: "chatWithAgent" }, providers: [
523
+ AlmatarHotelAutoCancellationService,
524
+ AlmatarHotelAutoCancellationEndpointsService
525
+ ], ngImport: i0, template: "@if (showAside()) {\n <almatar-aside\n\n class=\"auto_cancellation_wrapper\"\n [asideTitle]=\"asideTitle()\"\n [showAside]=\"showAside()\"\n [whiteHeader]=\"true\"\n [showHeader]=\"false\"\n (onClose)=\"onCloseModal()\"\n >\n <!-- Custom Header with 60px height -->\n <div class=\"auto_cancellation__header\">\n @if (canGoBack()) {\n <button class=\"auto_cancellation__header-back\" (click)=\"onGoBack()\" type=\"button\">\n <i class=\"pi pi-arrow-left\"></i>\n </button>\n }\n <div class=\"auto_cancellation__header-content\">\n @if (currentStep() === stepEnum.selectRooms) {\n <h2 class=\"auto_cancellation__header-title\">\n @if (isSinglePackage()) {\n Cancel Rooms\n } @else {\n Select Rooms\n }\n </h2>\n <p class=\"auto_cancellation__header-subtitle\">\n @if (isSinglePackage()) {\n Review and confirm your cancellation\n } @else {\n Choose which room(s) you'd like to cancel\n }\n </p>\n } @else if (currentStep() === stepEnum.refundSummary) {\n <h2 class=\"auto_cancellation__header-title\">Cancel Booking Request</h2>\n <p class=\"auto_cancellation__header-subtitle\">Review your refund summary and proceed</p>\n } @else if (currentStep() === stepEnum.refundMethod) {\n <h2 class=\"auto_cancellation__header-title\">Select Refund Method</h2>\n <p class=\"auto_cancellation__header-subtitle\">Choose how you'd like to receive your refund</p>\n } @else {\n <h2 class=\"auto_cancellation__header-title\">{{ asideTitle() }}</h2>\n <p class=\"auto_cancellation__header-subtitle\">Complete your booking cancellation</p>\n }\n </div>\n <button class=\"auto_cancellation__header-close\" (click)=\"onCloseModal()\" type=\"button\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n\n <div class=\"auto_cancellation__component\" [class.isNusk]=\"isNusk()\">\n @if (isLoading()) {\n <div class=\"auto_cancellation__loading\">\n <app-loader></app-loader>\n </div>\n }\n\n @if (currentStep() === stepEnum.selectRooms && !isLoading()) {\n <almatar-hotel-auto-cancellation-select-rooms\n [packages]=\"packages()\"\n [hotelInfo]=\"hotelInfo()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.hotelId\"\n [currencyCode]=\"selectedHotelBooking()?.currencyCode || 'SAR'\"\n (continueToCancel)=\"onContinueToCancel($event)\"\n (closeModal)=\"onCloseModal()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n (chatWithAgent)=\"onChatWithAgent()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundSummary && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-summary\n [selectedRooms]=\"autoCancellationService.selectedRooms()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.id || selectedHotelBooking()?.hpk\"\n [hotelInfo]=\"hotelInfo()\"\n [selectionSkipped]=\"packages().length <= 1\"\n (keepRoom)=\"onKeepRoom()\"\n (selectRefundOption)=\"onSelectRefundOption($event)\"\n (closeModal)=\"onCloseModal()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundMethod && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-method\n [refundDetailsData]=\"refundDetailsData()\"\n [currencyObj]=\"currentCurrency()\"\n [refundMethod]=\"refundMethod()\"\n [isCancelling]=\"isCancelling()\"\n (methodSelected)=\"onMethodSelected($event)\"\n (backRequested)=\"onBackFromRefundMethod()\"\n (confirmRequested)=\"confirmCancellation()\"\n (closeModal)=\"onCloseModal()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n />\n }\n </div>\n </almatar-aside>\n}\n\n@if (showErrorModal()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n@if (showResultOverlay() && resultOverlayData()) {\n <app-result-overlay\n [data]=\"resultOverlayData()!\"\n [show]=\"showResultOverlay()\"\n (confirm)=\"onResultOverlayConfirm()\"\n (cancel)=\"onResultOverlayCancel()\"\n />\n}\n", styles: [".auto_cancellation__header{height:60px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background:#fff;border-bottom:1px solid #e2e8f0;flex-shrink:0;gap:16px}.auto_cancellation__header-content{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.auto_cancellation__header-title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:700;color:#1e293b;margin:0;line-height:1.3}.auto_cancellation__header-subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;color:#64748b;margin:0;line-height:1.4}.auto_cancellation__header-back{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease;margin-right:8px}.auto_cancellation__header-back i{font-size:18px;color:#64748b}.auto_cancellation__header-back:hover{background:#f1f5f9}.auto_cancellation__header-back:hover i{color:#1e293b}.auto_cancellation__header-back:active{background:#e2e8f0}.auto_cancellation__header-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease}.auto_cancellation__header-close i{font-size:18px;color:#64748b}.auto_cancellation__header-close:hover{background:#f1f5f9}.auto_cancellation__header-close:hover i{color:#1e293b}.auto_cancellation__header-close:active{background:#e2e8f0}.auto_cancellation__component{height:calc(100% - 60px)}.auto_cancellation__loading{display:flex;align-items:center;justify-content:center;height:100%;min-height:200px}.auto_cancellation_wrapper ::ng-deep almatar-hotel-auto-cancellation{display:block;height:100%}.auto_cancellation_wrapper ::ng-deep .p-sidebar-header{display:none!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-content{padding-top:0!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-close{display:none!important}.auto_cancellation_wrapper ::ng-deep .almatar_aside .p-dialog-content{background:var(--almatar-neutral-surface-screen-bg)}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn{min-height:48px;padding:12px 24px;border-radius:10px;font-size:15px;font-weight:600;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;position:relative;overflow:hidden}.auto_cancellation_wrapper ::ng-deep .main_btn:disabled,.auto_cancellation_wrapper ::ng-deep .btn:disabled{opacity:.5;cursor:not-allowed}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn--primary{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;box-shadow:0 2px 8px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .main_btn:hover:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:0 4px 12px #3b82f666;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .main_btn:active:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .btn--secondary{background:#f1f5f9;color:#1e293b;border:1px solid #e2e8f0}.auto_cancellation_wrapper ::ng-deep .btn--secondary:hover:not(:disabled){background:#e2e8f0;border-color:#cbd5e1;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--secondary:active:not(:disabled){background:#cbd5e1;transform:translateY(0)}.auto_cancellation_wrapper ::ng-deep .btn--danger{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;box-shadow:0 2px 8px #ef44444d}.auto_cancellation_wrapper ::ng-deep .btn--danger:hover:not(:disabled){background:linear-gradient(135deg,#dc2626,#b91c1c);box-shadow:0 4px 12px #ef444466;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--danger:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #ef44444d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us{background:linear-gradient(135deg,#10b981,#059669);box-shadow:0 2px 8px #10b9814d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us:hover:not(:disabled){background:linear-gradient(135deg,#059669,#047857);box-shadow:0 4px 12px #10b98166;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn__spinner{width:18px;height:18px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.auto_cancellation_wrapper ::ng-deep .isNusk .main_btn,.auto_cancellation_wrapper ::ng-deep .isNusk .btn--primary{background:linear-gradient(135deg,var(--almatar-nusuk-primary),var(--almatar-nusuk-primary))!important;border-radius:33px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "component", type: i1.LoaderComponent, selector: "app-loader", inputs: ["loading", "message"] }, { kind: "component", type: AsideComponent, selector: "almatar-aside", inputs: ["asideTitle", "showHeader", "headerTemplate", "whiteHeader", "showAside", "width", "modal", "closable", "transitionOptions", "closeIconTemplate", "interceptClose"], outputs: ["onClose", "closeRequested"] }, { kind: "component", type: AlmatarHotelAutoCancellationSelectRoomsComponent, selector: "almatar-hotel-auto-cancellation-select-rooms", inputs: ["packages", "hotelInfo", "bookingId", "hotelId", "currencyCode"], outputs: ["continueToCancel", "closeModal", "nonRefundableSubmitSuccess", "chatWithAgent"] }, { kind: "component", type: AlmatarHotelAutoCancellationRefundSummaryComponent, selector: "almatar-hotel-auto-cancellation-refund-summary", inputs: ["selectedRooms", "bookingId", "hotelId", "hotelInfo", "selectionSkipped"], outputs: ["keepRoom", "selectRefundOption", "closeModal"] }, { kind: "component", type: AlmatarHotelAutoCancellationRefundMethodComponent, selector: "almatar-hotel-auto-cancellation-refund-method", inputs: ["refundDetailsData", "currencyObj", "refundMethod", "bookingId", "isCancelling", "showBack"], outputs: ["methodSelected", "backRequested", "confirmRequested", "closeModal"] }, { kind: "ngmodule", type: AlmatarIconModule }, { kind: "component", type: ResultOverlayComponent, selector: "app-result-overlay", inputs: ["data", "show"], outputs: ["confirm", "cancel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
526
+ }
527
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationComponent, decorators: [{
528
+ type: Component,
529
+ args: [{ selector: 'almatar-hotel-auto-cancellation', standalone: true, imports: [
530
+ CommonModule,
531
+ LoaderModule,
532
+ AsideComponent,
533
+ ManageBookingFailedModalComponent,
534
+ AlmatarHotelAutoCancellationSelectRoomsComponent,
535
+ AlmatarHotelAutoCancellationRefundSummaryComponent,
536
+ AlmatarHotelAutoCancellationRefundMethodComponent,
537
+ AlmatarIconModule,
538
+ ResultOverlayComponent
539
+ ], providers: [
540
+ AlmatarHotelAutoCancellationService,
541
+ AlmatarHotelAutoCancellationEndpointsService
542
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showAside()) {\n <almatar-aside\n\n class=\"auto_cancellation_wrapper\"\n [asideTitle]=\"asideTitle()\"\n [showAside]=\"showAside()\"\n [whiteHeader]=\"true\"\n [showHeader]=\"false\"\n (onClose)=\"onCloseModal()\"\n >\n <!-- Custom Header with 60px height -->\n <div class=\"auto_cancellation__header\">\n @if (canGoBack()) {\n <button class=\"auto_cancellation__header-back\" (click)=\"onGoBack()\" type=\"button\">\n <i class=\"pi pi-arrow-left\"></i>\n </button>\n }\n <div class=\"auto_cancellation__header-content\">\n @if (currentStep() === stepEnum.selectRooms) {\n <h2 class=\"auto_cancellation__header-title\">\n @if (isSinglePackage()) {\n Cancel Rooms\n } @else {\n Select Rooms\n }\n </h2>\n <p class=\"auto_cancellation__header-subtitle\">\n @if (isSinglePackage()) {\n Review and confirm your cancellation\n } @else {\n Choose which room(s) you'd like to cancel\n }\n </p>\n } @else if (currentStep() === stepEnum.refundSummary) {\n <h2 class=\"auto_cancellation__header-title\">Cancel Booking Request</h2>\n <p class=\"auto_cancellation__header-subtitle\">Review your refund summary and proceed</p>\n } @else if (currentStep() === stepEnum.refundMethod) {\n <h2 class=\"auto_cancellation__header-title\">Select Refund Method</h2>\n <p class=\"auto_cancellation__header-subtitle\">Choose how you'd like to receive your refund</p>\n } @else {\n <h2 class=\"auto_cancellation__header-title\">{{ asideTitle() }}</h2>\n <p class=\"auto_cancellation__header-subtitle\">Complete your booking cancellation</p>\n }\n </div>\n <button class=\"auto_cancellation__header-close\" (click)=\"onCloseModal()\" type=\"button\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n\n <div class=\"auto_cancellation__component\" [class.isNusk]=\"isNusk()\">\n @if (isLoading()) {\n <div class=\"auto_cancellation__loading\">\n <app-loader></app-loader>\n </div>\n }\n\n @if (currentStep() === stepEnum.selectRooms && !isLoading()) {\n <almatar-hotel-auto-cancellation-select-rooms\n [packages]=\"packages()\"\n [hotelInfo]=\"hotelInfo()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.hotelId\"\n [currencyCode]=\"selectedHotelBooking()?.currencyCode || 'SAR'\"\n (continueToCancel)=\"onContinueToCancel($event)\"\n (closeModal)=\"onCloseModal()\"\n (nonRefundableSubmitSuccess)=\"onNonRefundableSubmitSuccess($event)\"\n (chatWithAgent)=\"onChatWithAgent()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundSummary && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-summary\n [selectedRooms]=\"autoCancellationService.selectedRooms()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n [hotelId]=\"selectedHotelBooking()?.id || selectedHotelBooking()?.hpk\"\n [hotelInfo]=\"hotelInfo()\"\n [selectionSkipped]=\"packages().length <= 1\"\n (keepRoom)=\"onKeepRoom()\"\n (selectRefundOption)=\"onSelectRefundOption($event)\"\n (closeModal)=\"onCloseModal()\"\n />\n }\n\n @if (currentStep() === stepEnum.refundMethod && !isLoading()) {\n <almatar-hotel-auto-cancellation-refund-method\n [refundDetailsData]=\"refundDetailsData()\"\n [currencyObj]=\"currentCurrency()\"\n [refundMethod]=\"refundMethod()\"\n [isCancelling]=\"isCancelling()\"\n (methodSelected)=\"onMethodSelected($event)\"\n (backRequested)=\"onBackFromRefundMethod()\"\n (confirmRequested)=\"confirmCancellation()\"\n (closeModal)=\"onCloseModal()\"\n [bookingId]=\"selectedHotelBooking()?.bookingId\"\n />\n }\n </div>\n </almatar-aside>\n}\n\n@if (showErrorModal()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n@if (showResultOverlay() && resultOverlayData()) {\n <app-result-overlay\n [data]=\"resultOverlayData()!\"\n [show]=\"showResultOverlay()\"\n (confirm)=\"onResultOverlayConfirm()\"\n (cancel)=\"onResultOverlayCancel()\"\n />\n}\n", styles: [".auto_cancellation__header{height:60px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background:#fff;border-bottom:1px solid #e2e8f0;flex-shrink:0;gap:16px}.auto_cancellation__header-content{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.auto_cancellation__header-title{font-size:calc(18 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:700;color:#1e293b;margin:0;line-height:1.3}.auto_cancellation__header-subtitle{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;color:#64748b;margin:0;line-height:1.4}.auto_cancellation__header-back{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease;margin-right:8px}.auto_cancellation__header-back i{font-size:18px;color:#64748b}.auto_cancellation__header-back:hover{background:#f1f5f9}.auto_cancellation__header-back:hover i{color:#1e293b}.auto_cancellation__header-back:active{background:#e2e8f0}.auto_cancellation__header-close{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:all .2s ease}.auto_cancellation__header-close i{font-size:18px;color:#64748b}.auto_cancellation__header-close:hover{background:#f1f5f9}.auto_cancellation__header-close:hover i{color:#1e293b}.auto_cancellation__header-close:active{background:#e2e8f0}.auto_cancellation__component{height:calc(100% - 60px)}.auto_cancellation__loading{display:flex;align-items:center;justify-content:center;height:100%;min-height:200px}.auto_cancellation_wrapper ::ng-deep almatar-hotel-auto-cancellation{display:block;height:100%}.auto_cancellation_wrapper ::ng-deep .p-sidebar-header{display:none!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-content{padding-top:0!important}.auto_cancellation_wrapper ::ng-deep .p-sidebar-close{display:none!important}.auto_cancellation_wrapper ::ng-deep .almatar_aside .p-dialog-content{background:var(--almatar-neutral-surface-screen-bg)}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn{min-height:48px;padding:12px 24px;border-radius:10px;font-size:15px;font-weight:600;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;position:relative;overflow:hidden}.auto_cancellation_wrapper ::ng-deep .main_btn:disabled,.auto_cancellation_wrapper ::ng-deep .btn:disabled{opacity:.5;cursor:not-allowed}.auto_cancellation_wrapper ::ng-deep .main_btn,.auto_cancellation_wrapper ::ng-deep .btn--primary{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;box-shadow:0 2px 8px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .main_btn:hover:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:0 4px 12px #3b82f666;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .main_btn:active:not(:disabled),.auto_cancellation_wrapper ::ng-deep .btn--primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #3b82f64d}.auto_cancellation_wrapper ::ng-deep .btn--secondary{background:#f1f5f9;color:#1e293b;border:1px solid #e2e8f0}.auto_cancellation_wrapper ::ng-deep .btn--secondary:hover:not(:disabled){background:#e2e8f0;border-color:#cbd5e1;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--secondary:active:not(:disabled){background:#cbd5e1;transform:translateY(0)}.auto_cancellation_wrapper ::ng-deep .btn--danger{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;box-shadow:0 2px 8px #ef44444d}.auto_cancellation_wrapper ::ng-deep .btn--danger:hover:not(:disabled){background:linear-gradient(135deg,#dc2626,#b91c1c);box-shadow:0 4px 12px #ef444466;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn--danger:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px #ef44444d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us{background:linear-gradient(135deg,#10b981,#059669);box-shadow:0 2px 8px #10b9814d}.auto_cancellation_wrapper ::ng-deep .main_btn--chat-with-us:hover:not(:disabled){background:linear-gradient(135deg,#059669,#047857);box-shadow:0 4px 12px #10b98166;transform:translateY(-1px)}.auto_cancellation_wrapper ::ng-deep .btn__spinner{width:18px;height:18px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.auto_cancellation_wrapper ::ng-deep .isNusk .main_btn,.auto_cancellation_wrapper ::ng-deep .isNusk .btn--primary{background:linear-gradient(135deg,var(--almatar-nusuk-primary),var(--almatar-nusuk-primary))!important;border-radius:33px!important}\n"] }]
543
+ }], ctorParameters: () => [] });
544
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2hvdGVsLWNhbmNlbC9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixVQUFVLEVBR1YsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdGQUF3RixDQUFDO0FBQzNJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDekcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7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QkFDakMsZ0RBQWdEO3dCQUNoRCxrREFBa0Q7d0JBQ2xELGlEQUFpRDt3QkFDakQsaUJBQWlCO3dCQUNqQixzQkFBc0I7cUJBQ3ZCLGFBQ1U7d0JBQ1QsbUNBQW1DO3dCQUNuQyw0Q0FBNEM7cUJBQzdDLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpZGVDb21wb25lbnQgfSBmcm9tICcuLi9hbG1hdGFyLWFzaWRlL2FzaWRlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBEZXN0cm95UmVmLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBvdXRwdXQsXG4gIGlucHV0LFxuICBlZmZlY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWFuYWdlQm9va2luZ0ZhaWxlZE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vc2hhcmVkL2NvbXBvbmVudHMvbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsL21hbmFnZS1ib29raW5nLWZhaWxlZC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZGVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZHVsZXMvbG9hZGVyL2xvYWRlci5tb2R1bGUnO1xuaW1wb3J0IHsgSG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9ob3RlbC1tYW5hZ2UtYm9va2luZy9ob3RlbC1tYW5hZ2UtYm9va2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bSB9IGZyb20gJy4vZW51bXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1zdGVwLmVudW0nO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZSxcbiAgSUF1dG9DYW5jZWxsYXRpb25Qcm9jZXNzUmVzcG9uc2Vcbn0gZnJvbSAnLi9zZXJ2aWNlcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbSxcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Ib3RlbEluZm8sXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZSxcbiAgSUJvb2tpbmdQYWNrYWdlXG59IGZyb20gJy4vaW50ZXJmYWNlcy9pLWFsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIElSZWZ1bmREZXRhaWxzRGF0YSBhcyBJRmxpZ2h0UmVmdW5kRGV0YWlsc0RhdGEsXG4gIFJlZnVuZFByZWZlcnJlZE1ldGhvZCxcbiAgTG95YWx0eVBheW1lbnRUeXBlXG59IGZyb20gJy4uL3NoYXJlZC9pbnRlcmZhY2VzL2ktZmxpZ2h0LXJlZnVuZC1kZXRhaWxzJztcbmltcG9ydCB7IElIb3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlbGVjdFJvb21zQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tc2VsZWN0LXJvb21zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5L2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLXN1bW1hcnkuY29tcG9uZW50JztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRNZXRob2RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmQtbWV0aG9kL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLW1ldGhvZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVzdWx0T3ZlcmxheUNvbXBvbmVudCwgUmVzdWx0T3ZlcmxheURhdGEgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVzdWx0LW92ZXJsYXkvcmVzdWx0LW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IEhvdGVsTWFuYWdlQm9va2luZ0FzaWRlVGFiRW51bSB9IGZyb20gJy4uL3NoYXJlZC9lbnVtcy9ob3RlbC1tYW5hZ2UtYm9va2luZy1hc2lkZS10YWIuZW51bSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdldEN1cnJlbnRDdXJyZW5jeSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zdG9yZS9zZWxlY3RvcnMvY3VycmVuY3kuc2VsZWN0b3JzJztcbmltcG9ydCB7IGVudmlyb25tZW50cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQWxtYXRhckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kdWxlcy9hbG1hdGFyLWljb24vYWxtYXRhci1pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IGxveWFsdHlQb2ludHNNZXRob2RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIExvYWRlck1vZHVsZSxcbiAgICBBc2lkZUNvbXBvbmVudCxcbiAgICBNYW5hZ2VCb29raW5nRmFpbGVkTW9kYWxDb21wb25lbnQsXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlbGVjdFJvb21zQ29tcG9uZW50LFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRTdW1tYXJ5Q29tcG9uZW50LFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25SZWZ1bmRNZXRob2RDb21wb25lbnQsXG4gICAgQWxtYXRhckljb25Nb2R1bGUsXG4gICAgUmVzdWx0T3ZlcmxheUNvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU2VydmljZSxcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSA9IGluamVjdChcbiAgICBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlXG4gICk7XG5cbiAgcmVhZG9ubHkgYXV0b0NhbmNlbGxhdGlvblNlcnZpY2UgPSBpbmplY3QoXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblNlcnZpY2VcbiAgKTtcblxuICBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KEhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UgPSBpbmplY3QoXG4gICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2VcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFN0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzaGFyZWRTZXJ2aWNlID0gaW5qZWN0KFNoYXJlZFNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSG90ZWxCb29raW5nID0gaW5wdXQ8SUhvdGVsQm9va2luZ0RhdGEgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgY2FuY2VsbGF0aW9uU3VjY2VzcyA9IG91dHB1dDxJQXV0b0NhbmNlbGxhdGlvblByb2Nlc3NSZXNwb25zZT4oKTtcbiAgcmVhZG9ubHkgbm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjaGF0V2l0aEFnZW50ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgc2hvd0NvbmZpcm1Nb2RhbCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dFcnJvck1vZGFsID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0FzaWRlID0gc2lnbmFsKHRydWUpO1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBpc0NhbmNlbGxpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBob3RlbE1hbmFnZUVycm9yID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc051c2sgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzaG93UmVzdWx0T3ZlcmxheSA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHJlc3VsdE92ZXJsYXlEYXRhID0gc2lnbmFsPFJlc3VsdE92ZXJsYXlEYXRhIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJvb21zID0gc2lnbmFsPElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdPihbXSk7XG4gIHJlYWRvbmx5IHBhY2thZ2VzID0gc2lnbmFsPElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdPihbXSk7XG4gIHJlYWRvbmx5IGhvdGVsSW5mbyA9IHNpZ25hbDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkhvdGVsSW5mbyB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50Q3VycmVuY3kgPSBzaWduYWw8YW55PihudWxsKTtcbiAgcmVhZG9ubHkgcmVmdW5kRGV0YWlsc0RhdGEgPSBzaWduYWw8SUZsaWdodFJlZnVuZERldGFpbHNEYXRhIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkUGFja2FnZUlkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICByZWFkb25seSByZWZ1bmRNZXRob2QgPSBzaWduYWw8UmVmdW5kUHJlZmVycmVkTWV0aG9kPignd2FsbGV0Jyk7XG4gIHJlYWRvbmx5IHJlZnVuZFJlc3BvbnNlRGF0YSA9IHNpZ25hbDxhbnk+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHN0ZXBFbnVtID0gQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtO1xuICByZWFkb25seSBjdXJyZW50U3RlcCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5jdXJyZW50U3RlcCgpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTaW5nbGVSb29tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yb29tcygpLmxlbmd0aCA9PT0gMSk7XG4gIHJlYWRvbmx5IGlzU2luZ2xlUGFja2FnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFja2FnZXMoKS5sZW5ndGggPT09IDEpO1xuXG4gIC8vIEdldCBzdXBwbGllciBmcm9tIGJvb2tpbmcgb3IgZmlyc3QgcGFja2FnZVxuICByZWFkb25seSBib29raW5nU3VwcGxpZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvb2tpbmcgPSB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk7XG4gICAgaWYgKCFib29raW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gVHJ5IHRvIGdldCBzdXBwbGllciBmcm9tIGJvb2tpbmcgbGV2ZWwgZmlyc3RcbiAgICBpZiAoKGJvb2tpbmcgYXMgYW55KS5zdXBwbGllcikge1xuICAgICAgcmV0dXJuIChib29raW5nIGFzIGFueSkuc3VwcGxpZXI7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGdldCBmcm9tIGZpcnN0IHBhY2thZ2VcbiAgICBjb25zdCBwYWNrYWdlcyA9IHRoaXMucGFja2FnZXMoKTtcbiAgICByZXR1cm4gcGFja2FnZXMubGVuZ3RoID4gMCA/IHBhY2thZ2VzWzBdLnN1cHBsaWVyIDogdW5kZWZpbmVkO1xuICB9KTtcblxuICAvLyBDb21wdXRlZCB0b3RhbHMgZm9yIGFkdWx0cywgY2hpbGRyZW4sIGluZmFudHMgZnJvbSBib29raW5nIHBhY2thZ2VzXG4gIHJlYWRvbmx5IHRvdGFsQWR1bHRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvb2tpbmcgPSB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk7XG4gICAgaWYgKCFib29raW5nPy5wYWNrYWdlcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBib29raW5nLnBhY2thZ2VzLnJlZHVjZSgodG90YWw6IG51bWJlciwgcGtnOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJvb21zID0gcGtnLnJvb21zIHx8IFtdO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdG90YWwgK1xuICAgICAgICByb29tcy5yZWR1Y2UoKHN1bTogbnVtYmVyLCByb29tOiBhbnkpID0+IHN1bSArIChyb29tLmFkdWx0c051bSB8fCAwKSwgMClcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRvdGFsQ2hpbGRyZW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcbiAgICBpZiAoIWJvb2tpbmc/LnBhY2thZ2VzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGJvb2tpbmcucGFja2FnZXMucmVkdWNlKCh0b3RhbDogbnVtYmVyLCBwa2c6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0b3RhbCArXG4gICAgICAgIHJvb21zLnJlZHVjZShcbiAgICAgICAgICAoc3VtOiBudW1iZXIsIHJvb206IGFueSkgPT4gc3VtICsgKHJvb20uY2hpbGRyZW5OdW0gfHwgMCksXG4gICAgICAgICAgMFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICByZWFkb25seSB0b3RhbEluZmFudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcbiAgICBpZiAoIWJvb2tpbmc/LnBhY2thZ2VzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGJvb2tpbmcucGFja2FnZXMucmVkdWNlKCh0b3RhbDogbnVtYmVyLCBwa2c6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0b3RhbCArXG4gICAgICAgIHJvb21zLnJlZHVjZShcbiAgICAgICAgICAoc3VtOiBudW1iZXIsIHJvb206IGFueSkgPT4gc3VtICsgKHJvb20uaW5mYW50c051bSB8fCAwKSxcbiAgICAgICAgICAwXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFzaWRlVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICBzd2l0Y2ggKHN0ZXApIHtcbiAgICAgIGNhc2UgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnNlbGVjdFJvb21zOlxuICAgICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZVBhY2thZ2UoKSA/ICdDb25maXJtIENhbmNlbGxhdGlvbicgOiAnU2VsZWN0IFJvb21zJztcbiAgICAgIGNhc2UgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnk6XG4gICAgICAgIHJldHVybiAnQ2FuY2VsIEJvb2tpbmcgUmVxdWVzdCc7XG4gICAgICBjYXNlIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2Q6XG4gICAgICAgIHJldHVybiAnU2VsZWN0IFJlZnVuZCBNZXRob2QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdDYW5jZWwgQm9va2luZyc7XG4gICAgfVxuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5Ib3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nLm5leHQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKVxuICAgICAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZEhvdGVsQm9va2luZycsIHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVmdW5kRGV0YWlsc0RhdGEnLCB0aGlzLnJlZnVuZERldGFpbHNEYXRhKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGNsb3NlSWNvbk5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldEFwcExhbmd1YWdlKCk7XG4gICAgcmV0dXJuIGxhbmcgPT09ICdhcicgPyAnYXJyb3ctbGVmdCcgOiAnYXJyb3ctcmlnaHQnO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLmxvYWRCb29raW5nRGF0YUZyb21QYWNrYWdlcygpO1xuICAgIHRoaXMuaW5pdEN1cnJlbmN5KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDdXJyZW5jeSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KGdldEN1cnJlbnRDdXJyZW5jeSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGN1cnJlbmN5KSA9PiAhIWN1cnJlbmN5KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGN1cnJlbmN5KSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudEN1cnJlbmN5LnNldChjdXJyZW5jeSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNTZXJ2aWNlLmNsZWFyU2VsZWN0ZWRQYWNrYWdlSWRzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHBhcmFtcykgPT4ge1xuICAgICAgICBpZiAocGFyYW1zWydza2lwQ2hlY2snXSkge1xuICAgICAgICAgIHRoaXMuaXNOdXNrLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCb29raW5nRGF0YUZyb21QYWNrYWdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgY29uc3QgYm9va2luZyA9IHRoaXMuc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKTtcblxuICAgIGlmIChib29raW5nKSB7XG4gICAgICB0aGlzLnByb2Nlc3NCb29raW5nRGF0YShib29raW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNlbGVjdGVkSG90ZWxCb29raW5nXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKChzZXJ2aWNlQm9va2luZykgPT4ge1xuICAgICAgICAgIGlmIChzZXJ2aWNlQm9va2luZykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQm9va2luZ0RhdGEoc2VydmljZUJvb2tpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NCb29raW5nRGF0YShib29raW5nOiBJSG90ZWxCb29raW5nRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGhvdGVsSW5mb0RhdGE6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvID0ge1xuICAgICAgaG90ZWxOYW1lOiBib29raW5nLmhvdGVsTmFtZSB8fCAnJyxcbiAgICAgIGhvdGVsSW1hZ2U6IGJvb2tpbmcuY292ZXJJbWFnZSB8fCAnJyxcbiAgICAgIGNoZWNrSW46IGJvb2tpbmcuZGF0ZUZyb20gfHwgYm9va2luZz8uZnJvbT8uX2ksXG4gICAgICBjaGVja091dDogYm9va2luZy5kYXRlVG8gfHwgYm9va2luZz8udG8/Ll9pLFxuICAgICAgdG90YWxSb29tczogYm9va2luZy5wYWNrYWdlcz8ubGVuZ3RoIHx8IGJvb2tpbmcucm9vbXMgfHwgMSxcbiAgICAgIG5pZ2h0czpcbiAgICAgICAgYm9va2luZy5udW1iZXJPZk5pZ2h0cyB8fFxuICAgICAgICBib29raW5nLm5pZ2h0TnVtYmVyIHx8XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTmlnaHRzKGJvb2tpbmcuZGF0ZUZyb20sIGJvb2tpbmcuZGF0ZVRvKSxcbiAgICAgIGNoZWNrSW5UaW1lOiBib29raW5nLmNoZWNrSW5UaW1lPy5zcGxpdCgnICcpWzBdLFxuICAgICAgY2hlY2tPdXRUaW1lOiBib29raW5nLmNoZWNrT3V0VGltZT8uc3BsaXQoJyAnKVswXVxuICAgIH07XG4gICAgdGhpcy5ob3RlbEluZm8uc2V0KGhvdGVsSW5mb0RhdGEpO1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0SG90ZWxJbmZvKGhvdGVsSW5mb0RhdGEpO1xuXG4gICAgLy8gTWFwIHRvIGJvdGggcm9vbXMgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSBhbmQgcGFja2FnZXMgKG5ldyBzdHJ1Y3R1cmUpXG4gICAgY29uc3QgbWFwcGVkUm9vbXMgPSB0aGlzLm1hcFBhY2thZ2VzVG9Sb29tcyhib29raW5nKTtcbiAgICB0aGlzLnJvb21zLnNldChtYXBwZWRSb29tcyk7XG5cbiAgICBjb25zdCBtYXBwZWRQYWNrYWdlcyA9IHRoaXMubWFwQm9va2luZ1RvUGFja2FnZXMoYm9va2luZyk7XG4gICAgdGhpcy5wYWNrYWdlcy5zZXQobWFwcGVkUGFja2FnZXMpO1xuXG4gICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5zZXRTZWxlY3RlZFJvb21zKG1hcHBlZFJvb21zKTtcblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG1hcFBhY2thZ2VzVG9Sb29tcyhcbiAgICBib29raW5nOiBhbnlcbiAgKTogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Sb29tW10ge1xuICAgIGNvbnN0IG5pZ2h0cyA9XG4gICAgICBib29raW5nLm51bWJlck9mTmlnaHRzIHx8XG4gICAgICBib29raW5nLm5pZ2h0TnVtYmVyIHx8XG4gICAgICB0aGlzLmNhbGN1bGF0ZU5pZ2h0cyhib29raW5nLmZyb20sIGJvb2tpbmcudG8pO1xuICAgIGNvbnN0IHBhY2thZ2VzOiBJQm9va2luZ1BhY2thZ2VbXSA9IGJvb2tpbmcucGFja2FnZXMgfHwgW107XG5cbiAgICByZXR1cm4gcGFja2FnZXMuZmxhdE1hcCgocGtnOiBJQm9va2luZ1BhY2thZ2UsIHBrZ0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHJvb21zID0gcGtnLnJvb21zIHx8IFtdO1xuICAgICAgcmV0dXJuIHJvb21zLm1hcCgocm9vbTogYW55LCByb29tSW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgcGFja2FnZUlkOiBwa2cuaWQgfHwgU3RyaW5nKHBrZ0luZGV4ICsgMSksXG4gICAgICAgIHJvb21JZDogcm9vbT8ucm9vbUlkIHx8IGAke3BrZy5pZH0tJHtyb29tSW5kZXh9YCxcbiAgICAgICAgcm9vbU5hbWU6IHJvb20/LnJvb21OYW1lIHx8IGBSb29tICR7cm9vbUluZGV4ICsgMX1gLFxuICAgICAgICByb29tVHlwZTogcm9vbT8ucm9vbVR5cGUgfHwgJ1N0YW5kYXJkIFJvb20nLFxuICAgICAgICBtZWFsUGxhbjogcm9vbT8ucm9vbUJhc2lzIHx8ICcnLFxuICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUgIT09IGZhbHNlLFxuICAgICAgICBpc0NhbmNlbGxlZDogcGtnLmlzQ2FuY2VsbGVkLFxuICAgICAgICBtYW51YWxSZWZ1bmRSZXF1ZXN0OiAhcGtnLmlzUmVmdW5kYWJsZSxcbiAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5pZ2h0czogdGhpcy5ob3RlbEluZm8oKT8ubmlnaHRzIHx8IG5pZ2h0cyxcbiAgICAgICAgcm9vbUFtb3VudDogMCxcbiAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiAwLFxuICAgICAgICByZWZ1bmRBbW91bnQ6IDAsXG4gICAgICAgIGJlZFR5cGU6IHJvb20/LmJlZFR5cGUgfHwgJycsXG4gICAgICAgIHJvb21WaWV3OiByb29tPy5yb29tVmlldyB8fCAnJyxcbiAgICAgICAgcm9vbUJhc2lzOiByb29tPy5yb29tQmFzaXMgfHwgJycsXG4gICAgICAgIHJlZnVuZGFiaWxpdHk6IHBrZy5pc1JlZnVuZGFibGUsXG4gICAgICAgIHJlZnVuZGFibGVVbnRpbDogcGtnLnJlZnVuZGFibGVVbnRpbCB8fCAnJyxcbiAgICAgICAgYWR1bHRzTnVtOiByb29tPy5hZHVsdHNOdW0gfHwgMCxcbiAgICAgICAgY2hpbGRyZW5OdW06IHJvb20/LmNoaWxkcmVuTnVtIHx8IDAsXG4gICAgICAgIHBhc3Nlbmdlck5hbWU6IHJvb20/LnBhc3NlbmdlcnM/Lm5hbWUgfHwgJydcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQm9va2luZ1RvUGFja2FnZXMoXG4gICAgYm9va2luZzogYW55XG4gICk6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUGFja2FnZVtdIHtcbiAgICBjb25zdCBib29raW5nUGFja2FnZXM6IElCb29raW5nUGFja2FnZVtdID0gYm9va2luZy5wYWNrYWdlcyB8fCBbXTtcblxuICAgIHJldHVybiBib29raW5nUGFja2FnZXMubWFwKChwa2c6IElCb29raW5nUGFja2FnZSwgcGtnSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgcm9vbXMgPSBwa2cucm9vbXMgfHwgW107XG4gICAgICBjb25zdCBmaXJzdFJvb20gPSByb29tc1swXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFja2FnZUlkOiBwa2cuaWQgfHwgU3RyaW5nKHBrZ0luZGV4ICsgMSksXG4gICAgICAgIHBhY2thZ2VOYW1lOiBmaXJzdFJvb20/LnJvb21OYW1lIHx8IGBQYWNrYWdlICR7cGtnSW5kZXggKyAxfWAsXG4gICAgICAgIGJvYXJkQmFzaXM6IGZpcnN0Um9vbT8ucm9vbUJhc2lzIHx8ICcnLFxuICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUgIT09IGZhbHNlLFxuICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgaXNDYW5jZWxsZWQ6IHBrZy5pc0NhbmNlbGxlZCxcbiAgICAgICAgcmVmdW5kYWJpbGl0eTogcGtnLmlzUmVmdW5kYWJsZSxcbiAgICAgICAgcmVmdW5kYWJsZVVudGlsOiBwa2cucmVmdW5kYWJsZVVudGlsIHx8ICcnLFxuICAgICAgICByb29tczogcm9vbXMubWFwKChyb29tOiBhbnksIHJvb21JbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgIHJvb21JZDogcm9vbT8ucm9vbUlkIHx8IGAke3BrZy5pZH0tJHtyb29tSW5kZXh9YCxcbiAgICAgICAgICByb29tTmFtZTogcm9vbT8ucm9vbU5hbWUgfHwgYFJvb20gJHtyb29tSW5kZXggKyAxfWAsXG4gICAgICAgICAgcm9vbVR5cGU6IHJvb20/LnJvb21UeXBlIHx8ICdTdGFuZGFyZCBSb29tJyxcbiAgICAgICAgICBiZWRUeXBlOiByb29tPy5iZWRUeXBlIHx8ICcnLFxuICAgICAgICAgIHJvb21CYXNpczogcm9vbT8ucm9vbUJhc2lzIHx8ICcnXG4gICAgICAgIH0pKSxcbiAgICAgICAgcm9vbUFtb3VudDogMCxcbiAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiAwLFxuICAgICAgICByZWZ1bmRBbW91bnQ6IDAsXG4gICAgICAgIG1hbnVhbFJlZnVuZFJlcXVlc3Q6ICFwa2cuaXNSZWZ1bmRhYmxlLFxuICAgICAgICBjYW5jZWxsZWRCZWZvcmU6IGZhbHNlLFxuICAgICAgICBjYW5jZWxsYXRpb25Qb2xpY2llczogcGtnLmNhbmNlbGxhdGlvblBvbGljaWVzIHx8IFtdLFxuICAgICAgICBDYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3M6IHBrZy5jYW5jZWxsYXRpb25Qb2xpY2llc1JlbWFya3MsXG4gICAgICAgIHN1cHBsaWVyOiBwa2cuc3VwcGxpZXJcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZU5pZ2h0cyhmcm9tOiBhbnksIHRvOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICghZnJvbSB8fCAhdG8pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoZnJvbS5kaWZmICYmIHR5cGVvZiBmcm9tLmRpZmYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0by5kaWZmKGZyb20sICdkYXlzJykgfHwgMTtcbiAgICB9XG4gICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tKTtcbiAgICBjb25zdCB0b0RhdGUgPSBuZXcgRGF0ZSh0byk7XG4gICAgY29uc3QgZGlmZlRpbWUgPSBNYXRoLmFicyh0b0RhdGUuZ2V0VGltZSgpIC0gZnJvbURhdGUuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGguY2VpbChkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XG4gICAgcmV0dXJuIGRpZmZEYXlzIHx8IDE7XG4gIH1cblxuICBvbkNvbnRpbnVlVG9DYW5jZWwoXG4gICAgc2VsZWN0ZWRQYWNrYWdlczogSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25QYWNrYWdlW11cbiAgKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBwYWNrYWdlcyB0byByb29tcyBmb3JtYXQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc2VydmljZVxuICAgIGNvbnN0IHNlbGVjdGVkUm9vbXM6IElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUm9vbVtdID1cbiAgICAgIHNlbGVjdGVkUGFja2FnZXMuZmxhdE1hcCgocGtnKSA9PlxuICAgICAgICBwa2cucm9vbXMubWFwKChyb29tKSA9PiAoe1xuICAgICAgICAgIHBhY2thZ2VJZDogcGtnLnBhY2thZ2VJZCxcbiAgICAgICAgICByb29tSWQ6IHJvb20ucm9vbUlkLFxuICAgICAgICAgIHJvb21OYW1lOiByb29tLnJvb21OYW1lLFxuICAgICAgICAgIHJvb21UeXBlOiByb29tLnJvb21UeXBlLFxuICAgICAgICAgIG1lYWxQbGFuOiByb29tLnJvb21CYXNpcyxcbiAgICAgICAgICBpc1JlZnVuZGFibGU6IHBrZy5pc1JlZnVuZGFibGUsXG4gICAgICAgICAgaXNDYW5jZWxsZWQ6IHBrZy5pc0NhbmNlbGxlZCxcbiAgICAgICAgICBpc1NlbGVjdGVkOiBwa2cuaXNTZWxlY3RlZCxcbiAgICAgICAgICBuaWdodHM6IDAsXG4gICAgICAgICAgcm9vbUFtb3VudDogcGtnLnJvb21BbW91bnQsXG4gICAgICAgICAgY2FuY2VsbGF0aW9uRmVlOiBwa2cuY2FuY2VsbGF0aW9uRmVlLFxuICAgICAgICAgIHJlZnVuZEFtb3VudDogcGtnLnJlZnVuZEFtb3VudCxcbiAgICAgICAgICBiZWRUeXBlOiByb29tLmJlZFR5cGUsXG4gICAgICAgICAgcm9vbUJhc2lzOiByb29tLnJvb21CYXNpcyxcbiAgICAgICAgICByZWZ1bmRhYmlsaXR5OiBwa2cucmVmdW5kYWJpbGl0eSxcbiAgICAgICAgICByZWZ1bmRhYmxlVW50aWw6IHBrZy5yZWZ1bmRhYmxlVW50aWwsXG4gICAgICAgICAgY2FuY2VsbGVkQmVmb3JlOiBwa2cuY2FuY2VsbGVkQmVmb3JlLFxuICAgICAgICAgIG1hbnVhbFJlZnVuZFJlcXVlc3Q6IHBrZy5tYW51YWxSZWZ1bmRSZXF1ZXN0XG4gICAgICAgIH0pKVxuICAgICAgKTtcblxuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0U2VsZWN0ZWRSb29tcyhzZWxlY3RlZFJvb21zKTtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLnNldEN1cnJlbnRTdGVwKFxuICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnlcbiAgICApO1xuICB9XG5cbiAgb25LZWVwUm9vbSgpOiB2b2lkIHtcbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLnNldEN1cnJlbnRTdGVwKFxuICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnNlbGVjdFJvb21zXG4gICAgKTtcbiAgfVxuXG4gIG9uU2VsZWN0UmVmdW5kT3B0aW9uKGRhdGE6IHtcbiAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgICBwYXlvdXQ6IGFueTtcbiAgICB0b3RhbFJlZnVuZDogbnVtYmVyO1xuICAgIHJlc3BvbnNlRGF0YTogYW55O1xuICB9KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGVuYW50IC0gcmVkaXJlY3QgdG8gV2hhdHNBcHAgZm9yIHRlbmFudCBib29raW5nc1xuICAgIGlmIChlbnZpcm9ubWVudHMuaXNUZW5hbnQpIHtcbiAgICAgIHRoaXMuaG90ZWxNYW5hZ2VCb29raW5nU2VydmljZS5zZXRBY3RpdmVBc2lkZVRhYihcbiAgICAgICAgSG90ZWxNYW5hZ2VCb29raW5nQXNpZGVUYWJFbnVtLndoYXRzQXBwQWdlbnRcbiAgICAgICk7XG4gICAgICB0aGlzLnNob3dBc2lkZS5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdSZWZ1bmQgb3B0aW9uIHNlbGVjdGVkOicsIGRhdGEpO1xuXG4gICAgdGhpcy5zZWxlY3RlZFBhY2thZ2VJZHMuc2V0KGRhdGEucGFja2FnZUlkcyk7XG4gICAgdGhpcy5yZWZ1bmRSZXNwb25zZURhdGEuc2V0KGRhdGEucmVzcG9uc2VEYXRhKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZGF0YT8ucmVzcG9uc2VEYXRhO1xuICAgIGNvbnN0IHBheW91dCA9IHJlc3BvbnNlPy5wYXlvdXQgfHwgZGF0YS5wYXlvdXQ7XG4gICAgY29uc3QgdG90YWxzID0gcmVzcG9uc2U/LnRvdGFscztcblxuICAgIC8vIGNvbnN0IHdhbGxldFJlZnVuZCA9IHBheW91dD8ud2FsbGV0IHx8IHBheW91dD8ubG95YWx0eVRvV2FsbGV0O1xuICAgIGNvbnN0IHdhbGxldFJlZnVuZCA9IHBheW91dD8ud2FsbGV0O1xuXG4gICAgY29uc3QgY2FyZFJlZnVuZCA9IHBheW91dD8uY2FyZCA/PyAwO1xuICAgIGNvbnN0IHRhYmJ5UmVmdW5kID0gcGF5b3V0Py50YWJieSA/PyBwYXlvdXQ/LnRhYmJ5ID8/IDA7XG4gICAgY29uc3QgdGFtYXJhUmVmdW5kID0gcGF5b3V0Py50YW1hcmEgPz8gcGF5b3V0Py50YW1hcmEgPz8gMDtcblxuICAgIC8vIENoZWNrIGlmIGZ1bGwgd2FsbGV0IHJlZnVuZCBpcyBhbGxvd2VkIGJhc2VkIG9uIHBheW91dCBicmVha2Rvd25cbiAgICAvLyBXYWxsZXQgcmVmdW5kIGlzIGFsbG93ZWQgaWYgdGhlcmUncyBubyBjYXJkL3RhYmJ5L3RhbWFyYSBwb3J0aW9uXG4gICAgY29uc3QgaGFzTm9uV2FsbGV0UmVmdW5kID0gdGFiYnlSZWZ1bmQgPiAwIHx8IHRhbWFyYVJlZnVuZCA+IDA7XG4gICAgY29uc3QgdG90YWxSZWZ1bmRBbW91bnQgPSBwYXlvdXQ/LmN1cnJlbnQgPz8gZGF0YS50b3RhbFJlZnVuZDtcbiAgICBjb25zdCBpc0Z1bGxXYWxsZXRBbGxvd2VkID1cbiAgICAgICghaGFzTm9uV2FsbGV0UmVmdW5kICYmIHdhbGxldFJlZnVuZCA+IDApIHx8IGNhcmRSZWZ1bmQgPiAwO1xuXG4gICAgY29uc3QgbG95YWx0eVBvaW50c1ZhbHVlID1cbiAgICAgIHBheW91dD8ubG95YWx0eVRvV2FsbGV0IHx8XG4gICAgICB0b3RhbHM/LndhbGEgfHxcbiAgICAgIHRvdGFscz8ucWl0YWYgfHxcbiAgICAgIHRvdGFscz8ubW9rYWZhIHx8XG4gICAgICB0b3RhbHM/Lmhhc3NhZCB8fFxuICAgICAgdG90YWxzPy55Z2c7XG5cbiAgICAvLyBCdWlsZCByZWZ1bmQgZGV0YWlscyBkYXRhIGZvciB0aGUgbWV0aG9kIHNlbGVjdG9yXG4gICAgdGhpcy5yZWZ1bmREZXRhaWxzRGF0YS5zZXQoe1xuICAgICAgdG90YWxSZWZ1bmRBbW91bnQsXG4gICAgICB3YWxsZXRSZWZ1bmRBbW91bnQ6IHBheW91dD8ud2FsbGV0LFxuICAgICAgdG90YWxDYXJkUmVmdW5kQW1vdW50OiBjYXJkUmVmdW5kICsgdGFiYnlSZWZ1bmQgKyB0YW1hcmFSZWZ1bmQsXG4gICAgICBpc0Z1bGxXYWxsZXRSZWZ1bmRBbGxvd2VkOiBpc0Z1bGxXYWxsZXRBbGxvd2VkLFxuICAgICAgY3VycmVuY3k6IHJlc3BvbnNlPy5jdXJyZW5jeSxcbiAgICAgIGlzUmVmdW5kYWJsZTogcmVzcG9uc2U/LmZsYWdzPy5yZWZ1bmRhYmxlLFxuICAgICAgdG90YWxMb3lhbHR5UG9pbnRzUmVmdW5kQW1vdW50OiBsb3lhbHR5UG9pbnRzVmFsdWUsXG4gICAgICAvLyBQYXNzIHBheW1lbnQgbWV0aG9kIGluZm8gZm9yIHByb3BlciBsYWJlbGluZ1xuICAgICAgcGF5bWVudE1ldGhvZEN1c3RvbWVyVXNlZDogdGhpcy5kZXRlcm1pbmVQYXltZW50TWV0aG9kKHRvdGFscywgcGF5b3V0KSxcbiAgICAgIC8vIEFkZGl0aW9uYWwgZmllbGRzIGZvciBwcm9wZXIgbG95YWx0eSBwcm9ncmFtIGxhYmVsaW5nIGFuZCBzcGxpdCByZWZ1bmQgZGlzcGxheVxuICAgICAgbG95YWx0eVBheW1lbnRUeXBlOiB0aGlzLmRldGVybWluZUxveWFsdHlUeXBlKHRvdGFscywgcGF5b3V0KSxcbiAgICAgIHRvdGFsTG95YWx0eVBvaW50czogbG95YWx0eVBvaW50c1ZhbHVlLFxuICAgICAgYm9va2luZ0lkOiB0aGlzLnNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFxuICAgIH0pO1xuXG4gICAgLy8gRGVmYXVsdCB0byB3YWxsZXQgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIG9yaWdpbmFsUGF5bWVudE1ldGhvZFxuICAgIGlmIChpc0Z1bGxXYWxsZXRBbGxvd2VkICYmIHdhbGxldFJlZnVuZCA+IDApIHtcbiAgICAgIHRoaXMucmVmdW5kTWV0aG9kLnNldCgnd2FsbGV0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmdW5kTWV0aG9kLnNldCgnb3JpZ2luYWxQYXltZW50TWV0aG9kJyk7XG4gICAgfVxuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kTWV0aG9kXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBwYXltZW50IG1ldGhvZCBsYWJlbCBiYXNlZCBvbiB0b3RhbHMvcGF5b3V0IGJyZWFrZG93bi5cbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZ2F0ZXdheSBjb2RlIGZvciBwcm9wZXIgbGFiZWxpbmcuXG4gICAqL1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgY2FyZC9pbnN0YWxsbWVudCBwYXltZW50IG1ldGhvZCBmb3IgdGhlIGNhcmQgcm93IGxhYmVsLlxuICAgKiBMb3lhbHR5IHByb2dyYW1zIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgZGV0ZXJtaW5lTG95YWx0eVR5cGUoKS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lUGF5bWVudE1ldGhvZCh0b3RhbHM6IGFueSwgcGF5b3V0OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICgocGF5b3V0Py50YWJieSA/PyB0b3RhbHM/LnRhYmJ5ID8/IDApID4gMCkge1xuICAgICAgcmV0dXJuICdUQic7IC8vIFRhYmJ5XG4gICAgfVxuICAgIGlmICgocGF5b3V0Py50YW1hcmEgPz8gdG90YWxzPy50YW1hcmEgPz8gMCkgPiAwKSB7XG4gICAgICByZXR1cm4gJ1RNJzsgLy8gVGFtYXJhXG4gICAgfVxuICAgIGlmICgocGF5b3V0Py5jYXJkID8/IHRvdGFscz8uY2FyZCA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnQ0gnOyAvLyBDYXJkXG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBsb3lhbHR5IHBheW1lbnQgdHlwZSBmb3IgcHJvcGVyIGxhYmVsaW5nIGluIHNwbGl0IHJlZnVuZCByb3dzLlxuICAgKiBSZXR1cm5zIHRoZSBsb3lhbHR5IHByb2dyYW0gY29kZSAoZS5nLiwgJ1FJVEFGJywgJ1JBSkhJJykgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lTG95YWx0eVR5cGUoXG4gICAgdG90YWxzOiBhbnksXG4gICAgcGF5b3V0OiBhbnlcbiAgKTogTG95YWx0eVBheW1lbnRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoKHRvdGFscz8ubW9rYWZhID8/IDApID4gMCkge1xuICAgICAgcmV0dXJuICdBbFJhamhpTW9rYWZhYSc7XG4gICAgfVxuICAgIGlmICgodG90YWxzPy5xaXRhZiA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnUWl0YWYnO1xuICAgIH1cbiAgICBpZiAoKHRvdGFscz8ud2FsYSA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnV2FsYSc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIChwYXlvdXQ/LmxveWFsdHlUb1dhbGxldCA/PyAwKSA+IDAgfHxcbiAgICAgIChwYXlvdXQ/LmxveWFsdHlQb2ludHMgPz8gMCkgPiAwXG4gICAgKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgc3BlY2lmaWMgbG95YWx0eSB0eXBlIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCBsb3lhbHR5VHlwZSA9IHRvdGFscz8ubG95YWx0eVR5cGUgYXMgTG95YWx0eVBheW1lbnRUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBsb3lhbHR5VHlwZSAmJlxuICAgICAgICBbXG4gICAgICAgICAgJ0FsUmFqaGlNb2thZmFhJyxcbiAgICAgICAgICAnUWl0YWYnLFxuICAgICAgICAgICdXYWxhJyxcbiAgICAgICAgICAnQUxGVVJTQU4nLFxuICAgICAgICAgICdBTE1BVEFSX1BPSU5UUydcbiAgICAgICAgXS5pbmNsdWRlcyhsb3lhbHR5VHlwZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbG95YWx0eVR5cGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBvbk1ldGhvZFNlbGVjdGVkKG1ldGhvZDogUmVmdW5kUHJlZmVycmVkTWV0aG9kKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1bmRNZXRob2Quc2V0KG1ldGhvZCk7XG4gIH1cblxuICBvbkJhY2tGcm9tUmVmdW5kTWV0aG9kKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kU3VtbWFyeVxuICAgICk7XG4gIH1cblxuICBvbkdvQmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgY2FzZSBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0ucmVmdW5kU3VtbWFyeTpcbiAgICAgICAgdGhpcy5hdXRvQ2FuY2VsbGF0aW9uU2VydmljZS5zZXRDdXJyZW50U3RlcChcbiAgICAgICAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uU3RlcEVudW0uc2VsZWN0Um9vbXNcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2Q6XG4gICAgICAgIHRoaXMuYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2V0Q3VycmVudFN0ZXAoXG4gICAgICAgICAgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGb3Igc2VsZWN0Um9vbXMgb3Igb3RoZXIgc3RlcHMsIGRvIG5vdGhpbmcgKGNsb3NlIG1vZGFsKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjYW5Hb0JhY2soKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RlcCA9PT0gQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblN0ZXBFbnVtLnJlZnVuZFN1bW1hcnkgfHxcbiAgICAgIHN0ZXAgPT09IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TdGVwRW51bS5yZWZ1bmRNZXRob2RcbiAgICApO1xuICB9XG5cbiAgY29uZmlybUNhbmNlbGxhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2FuY2VsbGluZy5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLmF1dG9DYW5jZWxsYXRpb25FbmRwb2ludHNTZXJ2aWNlXG4gICAgICAucHJvY2Vzc0F1dG9DYW5jZWxsYXRpb24odGhpcy5zZWxlY3RlZFBhY2thZ2VJZHMoKSwgdGhpcy5yZWZ1bmRNZXRob2QoKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNDYW5jZWxsaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zaG93QXNpZGUuc2V0KGZhbHNlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRlbmFudCAtIHJlZGlyZWN0IHRvIFdoYXRzQXBwXG4gICAgICAgICAgaWYgKGVudmlyb25tZW50cy5pc1RlbmFudCB8fCByZXNwb25zZT8uZGF0YT8uaXNXaGF0c0FwcCkge1xuICAgICAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNldEFjdGl2ZUFzaWRlVGFiKFxuICAgICAgICAgICAgICBIb3RlbE1hbmFnZUJvb2tpbmdBc2lkZVRhYkVudW0ud2hhdHNBcHBBZ2VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgb3ZlcmxheVxuICAgICAgICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KHtcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIHRpdGxlOiAnQ2FuY2VsbGF0aW9uIFN1Y2Nlc3NmdWwhJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICdZb3VyIGJvb2tpbmcgaGFzIGJlZW4gY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseS4gVGhlIHJlZnVuZCB3aWxsIGJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8geW91ciBzZWxlY3RlZCBtZXRob2QuJyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnRG9uZSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldCh0cnVlKTtcblxuICAgICAgICAgIC8vIEFsc28gZW1pdCBmb3IgcGFyZW50IGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICAgICAgICB0aGlzLmNhbmNlbGxhdGlvblN1Y2Nlc3MuZW1pdChyZXNwb25zZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmlzQ2FuY2VsbGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSB2YXJpb3VzIHBvc3NpYmxlIHN0cnVjdHVyZXNcbiAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ1dlIGVuY291bnRlcmVkIGFuIGlzc3VlIHByb2Nlc3NpbmcgeW91ciBjYW5jZWxsYXRpb24uIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0Lic7XG5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5jZWxsYXRpb24gZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgICAgaWYgKGVycm9yPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3JzICYmIEFycmF5LmlzQXJyYXkoZXJyb3IuZXJyb3IuZXJyb3JzKSAmJiBlcnJvci5lcnJvci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3IuZXJyb3IuZXJyb3JzWzBdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IGVycm9yIG92ZXJsYXlcbiAgICAgICAgICB0aGlzLnJlc3VsdE92ZXJsYXlEYXRhLnNldCh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdDYW5jZWxsYXRpb24gRmFpbGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnQ2xvc2UnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93UmVzdWx0T3ZlcmxheS5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25DbG9zZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uTm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgb3ZlcmxheSBmb3Igbm9uLXJlZnVuZGFibGUgcmVxdWVzdFxuICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KHtcbiAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgIHRpdGxlOiAnUmVxdWVzdCBTdWJtaXR0ZWQhJyxcbiAgICAgIG1lc3NhZ2U6IGBZb3VyIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciAke3BhY2thZ2VOYW1lfSBoYXMgYmVlbiBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LiBPdXIgdGVhbSB3aWxsIHJldmlldyB5b3VyIHJlcXVlc3QgYW5kIGNvbnRhY3QgeW91IHNob3J0bHkuYCxcbiAgICAgIGNvbmZpcm1UZXh0OiAnRG9uZSdcbiAgICB9KTtcbiAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldCh0cnVlKTtcblxuICAgIC8vIEFsc28gZW1pdCBmb3IgcGFyZW50IGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICB0aGlzLm5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzLmVtaXQocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgb25DaGF0V2l0aEFnZW50KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FzaWRlLnNldChmYWxzZSk7XG4gICAgdGhpcy5jaGF0V2l0aEFnZW50LmVtaXQoKTtcbiAgfVxuXG4gIGNsb3NlQWxsTW9kYWxzKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2hvd0Vycm9yTW9kYWwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnNob3dBc2lkZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVzdWx0T3ZlcmxheUNvbmZpcm0oKTogdm9pZCB7XG4gICAgdGhpcy5zaG93UmVzdWx0T3ZlcmxheS5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzdWx0T3ZlcmxheURhdGEuc2V0KG51bGwpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVzdWx0T3ZlcmxheUNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dSZXN1bHRPdmVybGF5LnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXN1bHRPdmVybGF5RGF0YS5zZXQobnVsbCk7XG4gIH1cbn1cbiIsIkBpZiAoc2hvd0FzaWRlKCkpIHtcbiAgPGFsbWF0YXItYXNpZGVcblxuICAgIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fd3JhcHBlclwiXG4gICAgW2FzaWRlVGl0bGVdPVwiYXNpZGVUaXRsZSgpXCJcbiAgICBbc2hvd0FzaWRlXT1cInNob3dBc2lkZSgpXCJcbiAgICBbd2hpdGVIZWFkZXJdPVwidHJ1ZVwiXG4gICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgIChvbkNsb3NlKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgPlxuICAgIDwhLS0gQ3VzdG9tIEhlYWRlciB3aXRoIDYwcHggaGVpZ2h0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyXCI+XG4gICAgICBAaWYgKGNhbkdvQmFjaygpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyLWJhY2tcIiAoY2xpY2spPVwib25Hb0JhY2soKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWFycm93LWxlZnRcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItY29udGVudFwiPlxuICAgICAgICBAaWYgKGN1cnJlbnRTdGVwKCkgPT09IHN0ZXBFbnVtLnNlbGVjdFJvb21zKSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPlxuICAgICAgICAgICAgQGlmIChpc1NpbmdsZVBhY2thZ2UoKSkge1xuICAgICAgICAgICAgICBDYW5jZWwgUm9vbXNcbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBTZWxlY3QgUm9vbXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci1zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgQGlmIChpc1NpbmdsZVBhY2thZ2UoKSkge1xuICAgICAgICAgICAgICBSZXZpZXcgYW5kIGNvbmZpcm0geW91ciBjYW5jZWxsYXRpb25cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBDaG9vc2Ugd2hpY2ggcm9vbShzKSB5b3UnZCBsaWtlIHRvIGNhbmNlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0ucmVmdW5kU3VtbWFyeSkge1xuICAgICAgICAgIDxoMiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItdGl0bGVcIj5DYW5jZWwgQm9va2luZyBSZXF1ZXN0PC9oMj5cbiAgICAgICAgICA8cCBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItc3VidGl0bGVcIj5SZXZpZXcgeW91ciByZWZ1bmQgc3VtbWFyeSBhbmQgcHJvY2VlZDwvcD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0ucmVmdW5kTWV0aG9kKSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPlNlbGVjdCBSZWZ1bmQgTWV0aG9kPC9oMj5cbiAgICAgICAgICA8cCBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19oZWFkZXItc3VidGl0bGVcIj5DaG9vc2UgaG93IHlvdSdkIGxpa2UgdG8gcmVjZWl2ZSB5b3VyIHJlZnVuZDwvcD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGgyIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci10aXRsZVwiPnt7IGFzaWRlVGl0bGUoKSB9fTwvaDI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9faGVhZGVyLXN1YnRpdGxlXCI+Q29tcGxldGUgeW91ciBib29raW5nIGNhbmNlbGxhdGlvbjwvcD5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYXV0b19jYW5jZWxsYXRpb25fX2hlYWRlci1jbG9zZVwiIChjbGljayk9XCJvbkNsb3NlTW9kYWwoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS10aW1lc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImF1dG9fY2FuY2VsbGF0aW9uX19jb21wb25lbnRcIiBbY2xhc3MuaXNOdXNrXT1cImlzTnVzaygpXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdXRvX2NhbmNlbGxhdGlvbl9fbG9hZGluZ1wiPlxuICAgICAgICAgIDxhcHAtbG9hZGVyPjwvYXBwLWxvYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoY3VycmVudFN0ZXAoKSA9PT0gc3RlcEVudW0uc2VsZWN0Um9vbXMgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXNlbGVjdC1yb29tc1xuICAgICAgICAgIFtwYWNrYWdlc109XCJwYWNrYWdlcygpXCJcbiAgICAgICAgICBbaG90ZWxJbmZvXT1cImhvdGVsSW5mbygpXCJcbiAgICAgICAgICBbYm9va2luZ0lkXT1cInNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFwiXG4gICAgICAgICAgW2hvdGVsSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaG90ZWxJZFwiXG4gICAgICAgICAgW2N1cnJlbmN5Q29kZV09XCJzZWxlY3RlZEhvdGVsQm9va2luZygpPy5jdXJyZW5jeUNvZGUgfHwgJ1NBUidcIlxuICAgICAgICAgIChjb250aW51ZVRvQ2FuY2VsKT1cIm9uQ29udGludWVUb0NhbmNlbCgkZXZlbnQpXCJcbiAgICAgICAgICAoY2xvc2VNb2RhbCk9XCJvbkNsb3NlTW9kYWwoKVwiXG4gICAgICAgICAgKG5vblJlZnVuZGFibGVTdWJtaXRTdWNjZXNzKT1cIm9uTm9uUmVmdW5kYWJsZVN1Ym1pdFN1Y2Nlc3MoJGV2ZW50KVwiXG4gICAgICAgICAgKGNoYXRXaXRoQWdlbnQpPVwib25DaGF0V2l0aEFnZW50KClcIlxuICAgICAgICAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGN1cnJlbnRTdGVwKCkgPT09IHN0ZXBFbnVtLnJlZnVuZFN1bW1hcnkgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5XG4gICAgICAgICAgW3NlbGVjdGVkUm9vbXNdPVwiYXV0b0NhbmNlbGxhdGlvblNlcnZpY2Uuc2VsZWN0ZWRSb29tcygpXCJcbiAgICAgICAgICBbYm9va2luZ0lkXT1cInNlbGVjdGVkSG90ZWxCb29raW5nKCk/LmJvb2tpbmdJZFwiXG4gICAgICAgICAgW2hvdGVsSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaWQgfHwgc2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uaHBrXCJcbiAgICAgICAgICBbaG90ZWxJbmZvXT1cImhvdGVsSW5mbygpXCJcbiAgICAgICAgICBbc2VsZWN0aW9uU2tpcHBlZF09XCJwYWNrYWdlcygpLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgICAoa2VlcFJvb20pPVwib25LZWVwUm9vbSgpXCJcbiAgICAgICAgICAoc2VsZWN0UmVmdW5kT3B0aW9uKT1cIm9uU2VsZWN0UmVmdW5kT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgIChjbG9zZU1vZGFsKT1cIm9uQ2xvc2VNb2RhbCgpXCJcbiAgICAgICAgLz5cbiAgICAgIH1cblxuICAgICAgQGlmIChjdXJyZW50U3RlcCgpID09PSBzdGVwRW51bS5yZWZ1bmRNZXRob2QgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgIDxhbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1tZXRob2RcbiAgICAgICAgICBbcmVmdW5kRGV0YWlsc0RhdGFdPVwicmVmdW5kRGV0YWlsc0RhdGEoKVwiXG4gICAgICAgICAgW2N1cnJlbmN5T2JqXT1cImN1cnJlbnRDdXJyZW5jeSgpXCJcbiAgICAgICAgICBbcmVmdW5kTWV0aG9kXT1cInJlZnVuZE1ldGhvZCgpXCJcbiAgICAgICAgICBbaXNDYW5jZWxsaW5nXT1cImlzQ2FuY2VsbGluZygpXCJcbiAgICAgICAgICAobWV0aG9kU2VsZWN0ZWQpPVwib25NZXRob2RTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoYmFja1JlcXVlc3RlZCk9XCJvbkJhY2tGcm9tUmVmdW5kTWV0aG9kKClcIlxuICAgICAgICAgIChjb25maXJtUmVxdWVzdGVkKT1cImNvbmZpcm1DYW5jZWxsYXRpb24oKVwiXG4gICAgICAgICAgKGNsb3NlTW9kYWwpPVwib25DbG9zZU1vZGFsKClcIlxuICAgICAgICAgIFtib29raW5nSWRdPVwic2VsZWN0ZWRIb3RlbEJvb2tpbmcoKT8uYm9va2luZ0lkXCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9hbG1hdGFyLWFzaWRlPlxufVxuXG5AaWYgKHNob3dFcnJvck1vZGFsKCkpIHtcbiAgPGRpdlxuICAgIGFsbWF0YXItbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsXG4gICAgW2Vycm9yTWVzc2FnZV09XCJob3RlbE1hbmFnZUVycm9yKClcIlxuICAgIChjYW5jZWxFdmVudCk9XCJjbG9zZUFsbE1vZGFscygpXCJcbiAgICAoY29uZmlybUV2ZW50KT1cImNsb3NlQWxsTW9kYWxzKClcIlxuICA+PC9kaXY+XG59XG5cbkBpZiAoc2hvd1Jlc3VsdE92ZXJsYXkoKSAmJiByZXN1bHRPdmVybGF5RGF0YSgpKSB7XG4gIDxhcHAtcmVzdWx0LW92ZXJsYXlcbiAgICBbZGF0YV09XCJyZXN1bHRPdmVybGF5RGF0YSgpIVwiXG4gICAgW3Nob3ddPVwic2hvd1Jlc3VsdE92ZXJsYXkoKVwiXG4gICAgKGNvbmZpcm0pPVwib25SZXN1bHRPdmVybGF5Q29uZmlybSgpXCJcbiAgICAoY2FuY2VsKT1cIm9uUmVzdWx0T3ZlcmxheUNhbmNlbCgpXCJcbiAgLz5cbn1cbiJdfQ==