@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.
- package/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
- package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
- package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
- package/esm2022/lib/components/almatar-aside/aside.component.mjs +123 -0
- package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
- package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
- package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
- package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
- 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
- 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
- package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
- package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
- package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
- package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +448 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
- package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
- package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
- package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
- package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
- package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
- package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
- package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
- package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
- package/esm2022/lib/models/booking.types.mjs +73 -2
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +25 -7
- package/esm2022/lib/services/booking.service.mjs +6 -2
- package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
- package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
- package/esm2022/lib/shared/environments/environment.mjs +10 -0
- package/esm2022/lib/shared/models/index.mjs +6 -0
- package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
- package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
- package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
- package/esm2022/lib/shared/services/api.service.mjs +42 -0
- package/esm2022/lib/shared/services/shared.service.mjs +34 -0
- package/esm2022/lib/shared/services/translation.service.mjs +61 -0
- package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
- package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
- package/fesm2022/almatar-smart-booking-dashboard.mjs +3278 -180
- package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
- package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
- package/lib/components/almatar-aside/aside.component.d.ts +47 -0
- package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
- package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
- 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
- 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
- package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
- package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
- package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
- package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +82 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
- package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
- package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
- package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
- package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
- package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
- package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
- package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
- package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
- package/lib/models/booking.types.d.ts +28 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +1 -0
- package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
- package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
- package/lib/shared/environments/environment.d.ts +7 -0
- package/lib/shared/models/index.d.ts +11 -0
- package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
- package/lib/shared/modules/loader/loader.module.d.ts +13 -0
- package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
- package/lib/shared/services/api.service.d.ts +43 -0
- package/lib/shared/services/shared.service.d.ts +12 -0
- package/lib/shared/services/translation.service.d.ts +17 -0
- package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
- package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
- package/package.json +2 -19
- package/LICENSE +0 -21
- package/README.md +0 -132
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, DestroyRef, inject, input, output, signal, computed, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { LoaderModule } from '../../../../shared/modules/loader/loader.module';
|
|
5
|
+
import { AlmatarHotelAutoCancellationEndpointsService } from '../../services/almatar-hotel-auto-cancellation-endpoints.service';
|
|
6
|
+
import { AlmatarHotelAutoCancellationService } from '../../services/almatar-hotel-auto-cancellation.service';
|
|
7
|
+
import { AlmatarIconModule } from '../../../../shared/modules/almatar-icon/almatar-icon.module';
|
|
8
|
+
import { Store } from '@ngrx/store';
|
|
9
|
+
import { filter } from 'rxjs/operators';
|
|
10
|
+
import { getCurrentCurrency } from '../../../../shared/store/selectors/currency.selectors';
|
|
11
|
+
import { ExchangePipeModule } from '../../../../shared/pipes/exchange.pipe';
|
|
12
|
+
import { CurrencyCodeIconComponent } from '../../../../shared/components/currency-code-icon/currency-code-icon.component';
|
|
13
|
+
import { SharedService } from '../../../../shared/services/shared.service';
|
|
14
|
+
import { TranslationService } from '../../../../shared/services/translation.service';
|
|
15
|
+
import moment from 'moment';
|
|
16
|
+
import { HotelManageBookingEndpointsService } from '../../../shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service';
|
|
17
|
+
import { HotelManageBookingService } from '../../../shared/services/hotel-manage-booking/hotel-manage-booking.service';
|
|
18
|
+
import { CancelHotelBookingPayload } from '../../../shared/models/cancel-hotel-booking.model';
|
|
19
|
+
import { HotelManageBookingAsideTabEnum } from '../../../shared/enums/hotel-manage-booking-aside-tab.enum';
|
|
20
|
+
import { environments } from '../../../../shared/environments/environment';
|
|
21
|
+
import { ConfirmModalComponent } from '../../../shared/components/confirm-modal/confirm-modal.component';
|
|
22
|
+
import { ManageBookingFailedModalComponent } from '../../../shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component';
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
import * as i1 from "../../../../shared/modules/almatar-icon/almatar-icon.module";
|
|
25
|
+
import * as i2 from "../../../../shared/pipes/exchange.pipe";
|
|
26
|
+
export class AlmatarHotelAutoCancellationRefundSummaryComponent {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.endpointsService = inject(AlmatarHotelAutoCancellationEndpointsService);
|
|
29
|
+
this.autoCancellationService = inject(AlmatarHotelAutoCancellationService);
|
|
30
|
+
this.store = inject(Store);
|
|
31
|
+
this.sharedService = inject(SharedService);
|
|
32
|
+
this.destroyRef = inject(DestroyRef);
|
|
33
|
+
this.translateService = inject(TranslationService);
|
|
34
|
+
this.hotelManageBookingsEndpointsService = inject(HotelManageBookingEndpointsService);
|
|
35
|
+
this.hotelManageBookingService = inject(HotelManageBookingService);
|
|
36
|
+
// Currency
|
|
37
|
+
this.baseCurrencyCode = signal('SAR');
|
|
38
|
+
this.currentCurrency = signal(null);
|
|
39
|
+
this.paymentMethod = signal(null);
|
|
40
|
+
// Language
|
|
41
|
+
this.currentLang = signal('en');
|
|
42
|
+
this.selectedRooms = input.required();
|
|
43
|
+
this.bookingId = input('');
|
|
44
|
+
this.hotelId = input('');
|
|
45
|
+
this.hotelInfo = input(null);
|
|
46
|
+
this.selectionSkipped = input(false);
|
|
47
|
+
this.keepRoom = output();
|
|
48
|
+
this.selectRefundOption = output();
|
|
49
|
+
this.closeModal = output();
|
|
50
|
+
this.isCancelLoading = signal(false);
|
|
51
|
+
// Modal state
|
|
52
|
+
this.showConfirmModalFlag = signal(false);
|
|
53
|
+
this.showErrorModalFlag = signal(false);
|
|
54
|
+
this.hotelManageError = signal('');
|
|
55
|
+
this.backArrow = computed(() => {
|
|
56
|
+
return 'arrow-left'; // Always LTR for English
|
|
57
|
+
});
|
|
58
|
+
this.expandedPackageIds = signal(new Set());
|
|
59
|
+
this.expandedAmountIds = signal(new Set());
|
|
60
|
+
this.isLoading = signal(true);
|
|
61
|
+
this.refundSummary = signal(null);
|
|
62
|
+
this.error = signal(null);
|
|
63
|
+
this.responseData = signal(null);
|
|
64
|
+
this.rooms = computed(() => this.refundSummary()?.rooms ?? []);
|
|
65
|
+
this.packages = computed(() => this.refundSummary()?.packages ?? []);
|
|
66
|
+
this.currentRefundRoomsNumber = computed(() => {
|
|
67
|
+
const packages = this.packages();
|
|
68
|
+
return packages
|
|
69
|
+
.filter((pkg) => !pkg.cancelledBefore)
|
|
70
|
+
.reduce((acc, pkg) => acc + (pkg.rooms?.length || 0), 0);
|
|
71
|
+
});
|
|
72
|
+
this.totalPaid = computed(() => this.refundSummary()?.totalPaid ?? 0);
|
|
73
|
+
this.totalRefund = computed(() => this.refundSummary()?.totalRefund ?? 0);
|
|
74
|
+
this.alreadyRefunded = computed(() => this.payout()?.alreadyRefunded ?? 0);
|
|
75
|
+
this.summaries = computed(() => this.refundSummary()?.summaries ?? []);
|
|
76
|
+
this.payout = computed(() => this.refundSummary()?.payout ?? null);
|
|
77
|
+
this.packageIds = computed(() => this.selectedRooms().map((room) => room.packageId));
|
|
78
|
+
this.totalPackagesCount = computed(() => this.packages().reduce((acc, pkg) => acc + (pkg.rooms?.length || 0), 0));
|
|
79
|
+
// Additional breakdown fields
|
|
80
|
+
this.couponAmount = computed(() => this.refundSummary()?.coupon ?? 0);
|
|
81
|
+
this.giftsTotal = computed(() => this.refundSummary()?.giftsTotal ?? 0);
|
|
82
|
+
this.giftsDetails = computed(() => this.refundSummary()?.giftsDetails ?? []);
|
|
83
|
+
this.giftsHasRefundableEntity = computed(() => this.giftsDetails().some((gift) => gift.refundable));
|
|
84
|
+
this.serviceFeeAmount = computed(() => this.refundSummary()?.serviceFee ?? 0);
|
|
85
|
+
this.surchargeAmount = computed(() => this.refundSummary()?.surcharge ?? 0);
|
|
86
|
+
this.isGoldenGift = computed(() => this.refundSummary()?.goldenGift ?? false);
|
|
87
|
+
this.payoutNote = computed(() => this.payout()?.note ?? null);
|
|
88
|
+
this.previousRooms = computed(() => this.refundSummary()?.previousRooms ?? []);
|
|
89
|
+
// Check if there are any deductions to show
|
|
90
|
+
this.hasDeductions = computed(() => this.couponAmount() > 0 ||
|
|
91
|
+
this.giftsTotal() > 0 ||
|
|
92
|
+
this.serviceFeeAmount() > 0 ||
|
|
93
|
+
this.surchargeAmount() > 0);
|
|
94
|
+
// effect(() => {
|
|
95
|
+
// console.log('Refund Summary Updated:', this.currentCurrency());
|
|
96
|
+
// })
|
|
97
|
+
}
|
|
98
|
+
groupRoomsByName(rooms) {
|
|
99
|
+
const grouped = new Map();
|
|
100
|
+
rooms.forEach((room) => {
|
|
101
|
+
const name = room.roomName || 'Room';
|
|
102
|
+
const adults = room.pax?.adults ?? room.adults;
|
|
103
|
+
const children = room.pax?.children ?? room.children;
|
|
104
|
+
if (grouped.has(name)) {
|
|
105
|
+
const existing = grouped.get(name);
|
|
106
|
+
existing.count++;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
grouped.set(name, {
|
|
110
|
+
count: 1,
|
|
111
|
+
nights: room.nights,
|
|
112
|
+
adults,
|
|
113
|
+
children,
|
|
114
|
+
basis: room.basis,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return Array.from(grouped.entries()).map(([roomName, data]) => ({
|
|
119
|
+
roomName,
|
|
120
|
+
...data,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
ngOnInit() {
|
|
124
|
+
this.loadRefundDetails();
|
|
125
|
+
this.initCurrency();
|
|
126
|
+
this.initLanguage();
|
|
127
|
+
}
|
|
128
|
+
initLanguage() {
|
|
129
|
+
// Language is fixed to English
|
|
130
|
+
this.currentLang.set('en');
|
|
131
|
+
}
|
|
132
|
+
initCurrency() {
|
|
133
|
+
this.store
|
|
134
|
+
.select(getCurrentCurrency)
|
|
135
|
+
.pipe(filter((currency) => !!currency), takeUntilDestroyed(this.destroyRef))
|
|
136
|
+
.subscribe((currency) => {
|
|
137
|
+
this.currentCurrency.set(currency);
|
|
138
|
+
});
|
|
139
|
+
this.sharedService
|
|
140
|
+
.getBaseCurrency()
|
|
141
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
142
|
+
.subscribe((currency) => {
|
|
143
|
+
this.baseCurrencyCode.set(currency.code);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
loadRefundDetails() {
|
|
147
|
+
const packageIds = this.packageIds();
|
|
148
|
+
this.isLoading.set(true);
|
|
149
|
+
this.error.set(null);
|
|
150
|
+
this.endpointsService
|
|
151
|
+
.getRefundDetails(packageIds)
|
|
152
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
153
|
+
.subscribe({
|
|
154
|
+
next: (response) => {
|
|
155
|
+
if (response?.data) {
|
|
156
|
+
const summary = this.endpointsService.mapApiResponseToRefundSummary(response.data);
|
|
157
|
+
this.responseData.set(response.data);
|
|
158
|
+
this.refundSummary.set(summary);
|
|
159
|
+
this.paymentMethod.set(this.determinePaymentMethod(this.refundSummary()?.payout, this.refundSummary()?.totals));
|
|
160
|
+
}
|
|
161
|
+
this.isLoading.set(false);
|
|
162
|
+
},
|
|
163
|
+
error: (err) => {
|
|
164
|
+
// this.calculateLocalRefundSummary();
|
|
165
|
+
this.error.set(err?.message || 'Failed to load refund details');
|
|
166
|
+
this.isLoading.set(false);
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
calculateLocalRefundSummary() {
|
|
171
|
+
const summary = this.endpointsService.calculateLocalRefundSummary(this.selectedRooms().map((room) => ({ ...room, isSelected: true })));
|
|
172
|
+
this.refundSummary.set(summary);
|
|
173
|
+
}
|
|
174
|
+
togglePackageExpand(packageId) {
|
|
175
|
+
this.expandedPackageIds.update((current) => {
|
|
176
|
+
const newSet = new Set(current);
|
|
177
|
+
if (newSet.has(packageId)) {
|
|
178
|
+
newSet.delete(packageId);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
newSet.add(packageId);
|
|
182
|
+
}
|
|
183
|
+
return newSet;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
toggleAmountExpand(packageId) {
|
|
187
|
+
this.expandedAmountIds.update((current) => {
|
|
188
|
+
const newSet = new Set(current);
|
|
189
|
+
if (newSet.has(packageId)) {
|
|
190
|
+
newSet.delete(packageId);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
newSet.add(packageId);
|
|
194
|
+
}
|
|
195
|
+
return newSet;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
isPackageExpanded(packageId) {
|
|
199
|
+
return this.expandedPackageIds().has(packageId);
|
|
200
|
+
}
|
|
201
|
+
isAmountExpanded(packageId) {
|
|
202
|
+
return this.expandedAmountIds().has(packageId);
|
|
203
|
+
}
|
|
204
|
+
onKeepRoom() {
|
|
205
|
+
this.keepRoom.emit();
|
|
206
|
+
}
|
|
207
|
+
onSelectRefundOption() {
|
|
208
|
+
this.selectRefundOption.emit({
|
|
209
|
+
packageIds: this.packageIds(),
|
|
210
|
+
payout: this.payout(),
|
|
211
|
+
totalRefund: this.totalRefund(),
|
|
212
|
+
responseData: this.responseData(),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
onClose() {
|
|
216
|
+
this.closeModal.emit();
|
|
217
|
+
}
|
|
218
|
+
submitData() {
|
|
219
|
+
this.onConfirmSend();
|
|
220
|
+
}
|
|
221
|
+
onConfirmSend() {
|
|
222
|
+
this.isCancelLoading.set(true);
|
|
223
|
+
this.hotelManageBookingsEndpointsService
|
|
224
|
+
.cancelBookingRequest(new CancelHotelBookingPayload())
|
|
225
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
226
|
+
.subscribe({
|
|
227
|
+
next: (res) => {
|
|
228
|
+
this.isCancelLoading.set(false);
|
|
229
|
+
if (environments.isTenant) {
|
|
230
|
+
this.onShowWhatsAppAgent();
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
if (res?.data?.isWhatsAppRedirect) {
|
|
234
|
+
this.onShowWhatsAppAgent();
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this.onShowConfirmModal();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
error: (error) => {
|
|
242
|
+
this.isCancelLoading.set(false);
|
|
243
|
+
this.hotelManageError.set(error?.error?.errors?.message || '');
|
|
244
|
+
this.showErrorModalFlag.set(true);
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
onShowWhatsAppAgent() {
|
|
249
|
+
this.hotelManageBookingService.setActiveAsideTab(HotelManageBookingAsideTabEnum.whatsAppAgent);
|
|
250
|
+
this.closeModal.emit();
|
|
251
|
+
}
|
|
252
|
+
onShowConfirmModal() {
|
|
253
|
+
this.showConfirmModalFlag.set(true);
|
|
254
|
+
}
|
|
255
|
+
closeAllModals() {
|
|
256
|
+
this.showConfirmModalFlag.set(false);
|
|
257
|
+
this.showErrorModalFlag.set(false);
|
|
258
|
+
this.closeModal.emit();
|
|
259
|
+
}
|
|
260
|
+
formatDate(date) {
|
|
261
|
+
if (!date) {
|
|
262
|
+
return '';
|
|
263
|
+
}
|
|
264
|
+
const day = moment(date).format('D');
|
|
265
|
+
const month = moment(date).locale('en').format('MMMM');
|
|
266
|
+
const year = moment(date).format('YYYY');
|
|
267
|
+
return `${day} ${month} ${year}`;
|
|
268
|
+
}
|
|
269
|
+
determinePaymentMethod(totals, payout) {
|
|
270
|
+
if ((payout?.tabby ?? totals?.tabby ?? 0) > 0) {
|
|
271
|
+
return 'TB'; // Tabby
|
|
272
|
+
}
|
|
273
|
+
if ((payout?.tamara ?? totals?.tamara ?? 0) > 0) {
|
|
274
|
+
return 'TM'; // Tamara
|
|
275
|
+
}
|
|
276
|
+
if ((payout?.card ?? totals?.card ?? 0) > 0) {
|
|
277
|
+
return 'CH'; // Card
|
|
278
|
+
}
|
|
279
|
+
return '';
|
|
280
|
+
}
|
|
281
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationRefundSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
282
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlmatarHotelAutoCancellationRefundSummaryComponent, isStandalone: true, selector: "almatar-hotel-auto-cancellation-refund-summary", inputs: { selectedRooms: { classPropertyName: "selectedRooms", publicName: "selectedRooms", isSignal: true, isRequired: true, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: false, transformFunction: null }, hotelId: { classPropertyName: "hotelId", publicName: "hotelId", isSignal: true, isRequired: false, transformFunction: null }, hotelInfo: { classPropertyName: "hotelInfo", publicName: "hotelInfo", isSignal: true, isRequired: false, transformFunction: null }, selectionSkipped: { classPropertyName: "selectionSkipped", publicName: "selectionSkipped", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keepRoom: "keepRoom", selectRefundOption: "selectRefundOption", closeModal: "closeModal" }, ngImport: i0, template: "<div class=\"refund-summary\">\n <!-- Header -->\n <!-- <div class=\"refund-summary__header\">\n <button\n type=\"button\"\n class=\"refund-summary__header-btn\"\n (click)=\"onKeepRoom()\"\n aria-label=\"Close\"\n >\n <almatar-icon [name]=\"backArrow()\"></almatar-icon>\n </button>\n\n <div class=\"refund-summary__header-text\">\n <h3 class=\"refund-summary__header-title\">\n Cancel Booking Request\n </h3>\n </div>\n <button\n type=\"button\"\n class=\"refund-summary__header-btn\"\n (click)=\"onClose()\"\n aria-label=\"Close\"\n >\n <almatar-icon [name]=\"'x-mark'\"></almatar-icon>\n </button>\n </div> -->\n\n @if (isLoading()) {\n <div class=\"refund-summary__loader\">\n <almatar-loader></almatar-loader>\n </div>\n } @else if (error()) {\n <div class=\"refund-summary__error\">\n <div class=\"refund-summary__error-card\">\n <div class=\"refund-summary__error-icon-wrapper\">\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 8V12M12 16H12.01M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <h4 class=\"refund-summary__error-title\">\n Failed to load refund details. Please try again.\n </h4>\n <button\n class=\"refund-summary__error-btn\"\n type=\"button\"\n (click)=\"loadRefundDetails()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M1 4V10H7M23 20V14H17M20.49 9C19.9828 7.56678 19.1209 6.2854 17.9845 5.27542C16.8482 4.26543 15.4745 3.55976 13.9917 3.22426C12.5089 2.88875 10.9652 2.93434 9.50481 3.35677C8.04437 3.77921 6.71475 4.56471 5.64 5.64L1 10M23 14L18.36 18.36C17.2853 19.4353 15.9556 20.2208 14.4952 20.6432C13.0348 21.0657 11.4911 21.1112 10.0083 20.7757C8.52547 20.4402 7.1518 19.7346 6.01547 18.7246C4.87913 17.7146 4.01717 16.4332 3.51 15\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n Try Again\n </button>\n </div>\n </div>\n } @else {\n <div class=\"refund-summary__content\">\n <h3 class=\"refund-summary__title\">\n Refund summary\n </h3>\n\n <div class=\"package-cards\">\n @for (pkg of packages(); track i; let i = $index) {\n <div\n class=\"package-card\"\n [class.package-card--expanded]=\"isPackageExpanded(pkg.packageId)\"\n [class.package-card--cancelled-before]=\"pkg.cancelledBefore\"\n >\n <div\n class=\"package-card__header\"\n (click)=\"togglePackageExpand(pkg.packageId)\"\n >\n <div class=\"package-card__info\">\n <div class=\"package-card__title-row\">\n <h4 class=\"package-card__name\">{{ pkg.packageName }}</h4>\n @if (!pkg.cancelledBefore) {\n <span class=\"package-card__badge\">\n CURRENT CANCELLATION\n </span>\n <!-- <span class=\"package-card__date\">\n Today on\n {{ formatDate(pkg.cancellationDate) }}\n </span> -->\n } @else {\n <span\n class=\"package-card__badge package-card__badge--cancelled\"\n >\n PREVIOUS CANCELLATION\n </span>\n <!-- <span class=\"package-card__date\">\n Cancellation date:\n {{ formatDate(pkg.cancellationDate) }}\n </span> -->\n }\n </div>\n </div>\n <div\n class=\"package-card__expand-icon\"\n [class.rotated]=\"isPackageExpanded(pkg.packageId)\"\n >\n <almatar-icon [name]=\"'chevron-down'\"></almatar-icon>\n </div>\n </div>\n\n <!-- Rooms display -->\n @if (pkg.rooms?.length) {\n <div class=\"package-card__rooms-container\">\n @for (\n group of groupRoomsByName(pkg.rooms);\n track i;\n let i = $index\n ) {\n <div class=\"package-card__room-summary\">\n @if (group.count > 1) {\n <!-- Multiple rooms -->\n {{ group.count }}x {{ group.roomName }}\n } @else {\n <!-- Single room -->\n Room\n\n {{ i + 1 }}\n <span class=\"package-card__separator\">•</span>\n {{ group.roomName }}\n }\n @if (group.nights) {\n <span class=\"package-card__separator\">•</span>\n {{ group.nights }}\n @if (group.nights === 1) {\n night\n } @else {\n nights\n }\n }\n @if (group.adults) {\n <span class=\"package-card__separator\">•</span>\n {{ group.adults }}\n @if (group.adults === 1) {\n Adult\n } @else {\n Adults\n }\n }\n @if (group.children) {\n <span class=\"package-card__separator\">•</span>\n {{ group.children }}\n @if (group.children === 1) {\n Child\n } @else {\n Children\n }\n }\n </div>\n }\n </div>\n }\n\n @if (!pkg.cancelledBefore) {\n <span class=\"package-card__date\">\n Today on\n {{ formatDate(pkg.cancellationDate) }}\n </span>\n } @else {\n <span class=\"package-card__date\">\n Cancellation date:\n {{ formatDate(pkg.cancellationDate) }}\n </span>\n }\n\n <!-- Room Amount Row with expand -->\n\n <!-- Expandable content: Rooms, Date, and Financial breakdown -->\n <div\n class=\"package-card__expandable-content\"\n [class.expanded]=\"isPackageExpanded(pkg.packageId)\"\n >\n <div\n class=\"package-card__row package-card__row--clickable\"\n (click)=\"\n toggleAmountExpand(pkg.packageId); $event.stopPropagation()\n \"\n >\n @if (pkg?.rooms?.length > 1) {\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >Rooms amount</span\n >\n } @else {\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >Room amount</span\n >\n }\n <span class=\"package-card__value package-card__value--regular\">\n @if (\n pkg.fee > 0 || pkg.serviceFee > 0 || surchargeAmount() > 0\n ) {\n <div\n class=\"package-card__expand-icon\"\n [class.rotated]=\"isAmountExpanded(pkg.packageId)\"\n >\n <almatar-icon [name]=\"'chevron-down'\"></almatar-icon>\n </div>\n }\n\n {{\n pkg.amount\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n\n <!-- Expanded content: Cancellation fee and Service fee -->\n <div\n class=\"package-card__expanded-content\"\n [class.expanded]=\"\n isAmountExpanded(pkg.packageId) &&\n (pkg.fee > 0 || pkg.serviceFee > 0)\n \"\n >\n @if (pkg.fee > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">Cancellation fee</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n pkg.fee\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n @if (pkg.serviceFee > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">Service Fee</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n pkg.serviceFee\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n @if (surchargeAmount() > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">\n Surcharge (2.5%)\n </span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n surchargeAmount()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n </div>\n <!-- Add-Ons Refund Section -->\n @if (giftsDetails().length > 0 && i === packages()?.length - 1) {\n <div class=\"addons-refund\">\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >\n Add-Ons Refund\n </span>\n <div class=\"addons-refund__list\">\n @for (gift of giftsDetails(); track $index) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">{{ gift.name }}</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n {{\n gift.toBeRefundedAmount\n | exchange_round\n : baseCurrencyCode()\n : currentCurrency()\n }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n <!-- @if (!gift.refundable) {\n <span> - </span>\n } -->\n </span>\n </div>\n }\n </div>\n\n <!-- @if (giftsHasRefundableEntity()) {\n <div class=\"addons-refund__notice\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M10 9V14\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <circle cx=\"10\" cy=\"6.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span class=\"addons-refund__notice-text\">\n Your add-on service/s refund will be processed separately by our Customer Service team shortly.\n </span>\n </div>\n } -->\n </div>\n }\n </div>\n <!-- End expandable content -->\n\n <!-- You will get back row - ALWAYS VISIBLE -->\n <div class=\"package-card__details\">\n @if (pkg.cancelledBefore) {\n <div class=\"package-card__row package-card__row--total\">\n <span class=\"package-card__label package-card__label--dark\">Refunded amount</span>\n <span\n class=\"package-card__value package-card__value--highlight\"\n >\n {{\n pkg.refund\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n } @else {\n <div class=\"package-card__row package-card__row--total\">\n <span class=\"package-card__label package-card__label--dark\">You will get back</span>\n <span\n class=\"package-card__value package-card__value--highlight package-card__value--regular\"\n >\n {{\n pkg.refund\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <hr class=\"seperator\" />\n\n <div class=\"total-summary\">\n <div class=\"total-summary__row\">\n <span class=\"total-summary__label\">Total paid</span>\n <span class=\"total-summary__value\">\n {{\n totalPaid()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n\n @if (alreadyRefunded()) {\n <div class=\"total-summary__row\">\n <span class=\"total-summary__label\">Rooms Refunded</span>\n <span class=\"total-summary__value\">\n {{\n alreadyRefunded()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n <div class=\"total-summary__row total-summary__row--highlight\">\n <div class=\"total-summary__label total-summary__label--highlight\">\n <span>\n You'll get back for\n {{ currentRefundRoomsNumber() }}\n {{\n currentLang() !== 'ar'\n ? currentRefundRoomsNumber() > 1\n ? ('Rooms')\n : ('Room')\n : ''\n }}\n </span>\n </div>\n <span class=\"total-summary__value total-summary__value--highlight\">\n {{\n totalRefund()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n </div>\n\n <div class=\"info-banner\">\n <div class=\"info-banner__icon\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L3 5V9C3 13.55 6.24 17.74 10 18.5C13.76 17.74 17 13.55 17 9V5L10 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7 10L9 12L13 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"info-banner__content\">\n @if (paymentMethod() === 'CH') {\n <p class=\"info-banner__text\">\n Your refund is instant from our side, your bank may take up to 15 business days to reflect it.\n </p>\n } @else if (paymentMethod() === 'TB') {\n <p class=\"info-banner__text\">\n Your refund will be processed to Tabby within 3-5 business days.\n </p>\n } @else if (paymentMethod() === 'TM') {\n <p class=\"info-banner__text\">\n Your refund will be processed to Tamara within 7-10 business days.\n </p>\n } @else {\n <p class=\"info-banner__text\">\n Your loyalty points will be refunded instantly to your account.\n </p>\n }\n\n <p class=\"info-banner__subtext\">\n You can select refund option in the next step\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"refund-summary__footer\">\n @if (totalRefund()) {\n <button class=\"btn btn--secondary\" type=\"button\" (click)=\"onKeepRoom()\">\n Keep Room\n </button>\n <button\n class=\"btn btn--primary\"\n type=\"button\"\n (click)=\"onSelectRefundOption()\"\n >\n Select refund option\n </button>\n } @else {\n <button\n class=\"btn btn--danger\"\n type=\"button\"\n [disabled]=\"isCancelLoading()\"\n (click)=\"submitData()\"\n >\n @if (isCancelLoading()) {\n <span class=\"btn__spinner\"></span>\n } @else {\n Cancel Booking\n }\n </button>\n }\n </div>\n }\n</div>\n\n<!-- Confirm Modal -->\n@if (showConfirmModalFlag()) {\n <div\n almatar-confirm-modal\n [Message]=\"'Your request has been submitted. Our customer service team will contact you shortly.'\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n<!-- Error Modal -->\n@if (showErrorModalFlag()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n", styles: [".refund-summary{display:flex;flex-direction:column;height:100%}.refund-summary__notice{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:8px;font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin-top:16px}.refund-summary__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.refund-summary__notice--info{background:var(--almatar-info-surface, #eaf2ff);border:1px solid var(--almatar-info-border, #b9d6ff);color:var(--almatar-info-text, #1a56db);border-radius:12px}.refund-summary__notice--info svg{color:var(--almatar-info-icon, #1a56db)}.refund-summary__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background:#fff;border-bottom:1px solid rgb(229,231,235)}.refund-summary__header-text{flex:1;text-align:center}.refund-summary__header-title{font-size:calc(24 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0}.refund-summary__header-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;cursor:pointer;color:#7c3aed;padding:0}.refund-summary__header-btn svg{width:20px;height:20px}.refund-summary__header-btn:hover{opacity:.7}.refund-summary__content{flex:1;overflow-y:auto;padding:16px;background-color:#fff}.refund-summary__title{font-size:calc(16 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:#1b1a1f;margin-bottom:16px}.refund-summary__error{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 20px;background:linear-gradient(180deg,#fef2f280,#fff)}.refund-summary__error-card{display:flex;flex-direction:column;align-items:center;text-align:center;padding:32px 24px;background:#fff;border-radius:16px;box-shadow:0 1px 3px #0000000a,0 4px 12px #0000000f;max-width:320px;width:100%;animation:fadeInUp .4s ease-out}.refund-summary__error-icon-wrapper{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#fee2e2,#fecaca);display:flex;align-items:center;justify-content:center;margin-bottom:20px;color:#dc2626;animation:pulse 2s ease-in-out infinite}.refund-summary__error-title{font-size:calc(15 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#374151;margin:0 0 24px;line-height:1.5}.refund-summary__error-btn{display:inline-flex;align-items:center;gap:8px;padding:12px 24px;background:linear-gradient(135deg,#7c3aed,#6d28d9);color:#fff;border:none;border-radius:10px;font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 8px #7c3aed40}.refund-summary__error-btn:hover{transform:translateY(-2px);box-shadow:0 4px 16px #7c3aed59}.refund-summary__error-btn:active{transform:translateY(0)}.refund-summary__error-btn svg{transition:transform .3s ease}.refund-summary__error-btn:hover svg{transform:rotate(180deg)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{transform:scale(1)}50%{transform:scale(1.05)}}.refund-summary__footer{display:flex;gap:12px;padding:16px 20px;background:#fff;border-top:1px solid rgb(229,231,235)}.package-cards{display:flex;flex-direction:column;gap:12px;margin-bottom:12px}.package-card{background:#fff;border:1px solid rgb(21,128,60);border-radius:12px;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);padding:16px}.package-card__header{display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.package-card__info{flex:1;min-width:0}.package-card__title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}.package-card__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#000;line-height:20px;margin:0}.package-card__badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-bold);color:#15803c;background:#f0fdf5;padding:6px 8px;border-radius:999px;text-transform:uppercase;flex-shrink:0}.package-card__badge--cancelled{color:#92939e;background:#fff;border:1px solid rgb(217,217,222)}.package-card__header-expand-icon{color:currentColor;transition:transform .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.package-card__header-expand-icon.rotated{transform:rotate(180deg)}.package-card__expandable-content{opacity:0;max-height:0;transform:translateY(-10px);transition:opacity .3s cubic-bezier(.4,0,.2,1),max-height .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1),margin-top .3s cubic-bezier(.4,0,.2,1);overflow:hidden;margin-top:0}.package-card__expandable-content.expanded{opacity:1;max-height:1000px;transform:translateY(0);margin-top:12px}.package-card__rooms-container{display:flex;flex-direction:column;gap:4px;margin:8px 0 4px}.package-card__rooms{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}.package-card__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222);background:#fff}.package-card__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;flex-wrap:wrap;gap:0;margin:0}.package-card__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#6b7280}.package-card__room-summary{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;display:flex;align-items:center;flex-wrap:wrap;gap:0}.package-card__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-card__date{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#6b7280;margin-bottom:12px}.package-card__details{cursor:pointer;overflow:hidden}.package-card__expanded-content{opacity:0;max-height:0;transform:translateY(-10px);transition:opacity .3s cubic-bezier(.4,0,.2,1),max-height .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden;margin-bottom:0}.package-card__expanded-content.expanded{opacity:1;max-height:500px;transform:translateY(0);margin-bottom:0}.package-card__row{display:flex;justify-content:space-between;align-items:center;transition:all .2s ease;margin-bottom:4px}.package-card__row--clickable{cursor:pointer}.package-card__row--total{margin-top:4px;font-weight:var(--almatar-font-weight-semibold);margin-bottom:0}.package-card__row:last-child{margin-bottom:0}.package-card__label{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;font-weight:var(--almatar-font-weight-regular)}.package-card__label--dark{color:#1b1a1f;font-weight:var(--almatar-font-weight-medium)}.package-card__label--dark-light{color:#1b1a1f}.package-card__value{font-size:calc(13 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center}:host-context(#ltr) .package-card__value{flex-direction:row-reverse}.package-card__value{gap:2px}.package-card__value--gray{color:#747583}.package-card__value--highlight{font-weight:var(--almatar-font-weight-medium);font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f}.package-card__value--regular{font-weight:var(--almatar-font-weight-regular)}.package-card__expand-icon{color:currentColor;transition:transform .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;width:16px;height:16px}.package-card__expand-icon.rotated{transform:rotate(180deg)}.package-card--cancelled-before{border:1px solid transparent;background-color:#f7f7f8}.package-card--cancelled-before .package-card__label.package-card__label--dark,.package-card--cancelled-before .package-card__value.package-card__value--highlight{color:#15803c}.package-card--expanded .package-card__header{margin-bottom:0}.addons-refund{margin-bottom:4px}.addons-refund__title{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:#1b1a1f;margin:0 0 12px}.addons-refund__list{display:flex;flex-direction:column}.addons-refund__item{display:flex;justify-content:space-between;align-items:center}.addons-refund__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#747583}.addons-refund__value{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#747583;display:flex;align-items:center}:host-context(#ltr) .addons-refund__value{flex-direction:row-reverse}.addons-refund__value{gap:2px}.addons-refund__notice{display:flex;align-items:center;gap:8px;padding:12px;border-radius:12px;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin-top:8px;background:#f7f7f8;border:1px solid rgb(217,217,222);color:#1b1a1f}.addons-refund__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px;color:#1b1a1f}.addons-refund__notice-text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0;line-height:1.5}.seperator{margin:12px 0;border:1px dashed rgb(217,217,222)}.total-summary{background:#f0f8ff;border-radius:12px;padding:16px;margin-bottom:16px;transition:all .3s cubic-bezier(.4,0,.2,1)}.total-summary__row{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.total-summary__label{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;font-weight:var(--almatar-font-weight-regular)}.total-summary__label--highlight{font-weight:var(--almatar-font-weight-medium)}.total-summary__value{font-size:calc(13 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#0b54c2;display:flex;align-items:center}:host-context(#ltr) .total-summary__value{flex-direction:row-reverse}.total-summary__value{gap:2px}.total-summary__value--highlight{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-bold);color:#0b54c2}.info-banner{display:flex;gap:8px;border:1px solid rgb(11,84,194);border-radius:12px;padding:14px;align-items:flex-start;transition:all .3s cubic-bezier(.4,0,.2,1)}.info-banner__icon{color:#0b54c2;flex-shrink:0;width:20px;height:20px}.info-banner__content{flex:1}.info-banner__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;margin:0 0 4px;font-weight:var(--almatar-font-weight-regular);line-height:16px}.info-banner__subtext{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;margin:0;line-height:1.4}.btn{flex:1;padding:12px 20px;border-radius:10px;font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);border:none;position:relative;overflow:hidden}.btn:before{content:\"\";position:absolute;top:50%;left:50%;width:0;height:0;border-radius:50%;background:#fff3;transform:translate(-50%,-50%);transition:width .6s,height .6s}.btn:active:before{width:300px;height:300px}.btn--primary{background:#7c3aed;color:#fff}.btn--primary:hover{background:#6d28d9;transform:translateY(-1px);color:#fff;box-shadow:0 4px 12px #7c3aed4d}.btn--primary:active{transform:translateY(0)}.btn--secondary{background:#fff;color:#1b1a1f;border:1.5px solid rgb(229,231,235)}.btn--secondary:hover{background:#f9fafb;border-color:#d1d5db}.btn--secondary:active{background:#f3f4f6}.btn--danger{background:#fae3de;color:#dc2626;width:100%}.btn--danger:hover{color:#dc2626}.btn--danger:disabled{opacity:.7;cursor:not-allowed}.btn__spinner{display:inline-block;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)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LoaderModule }, { kind: "ngmodule", type: AlmatarIconModule }, { kind: "component", type: i1.AlmatarIconComponent, selector: "almatar-icon", inputs: ["name", "size"] }, { kind: "ngmodule", type: ExchangePipeModule }, { kind: "pipe", type: i2.ExchangeRoundPipe, name: "exchange_round" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
283
|
+
}
|
|
284
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlmatarHotelAutoCancellationRefundSummaryComponent, decorators: [{
|
|
285
|
+
type: Component,
|
|
286
|
+
args: [{ selector: 'almatar-hotel-auto-cancellation-refund-summary', standalone: true, imports: [
|
|
287
|
+
CommonModule,
|
|
288
|
+
LoaderModule,
|
|
289
|
+
AlmatarIconModule,
|
|
290
|
+
ExchangePipeModule,
|
|
291
|
+
CurrencyCodeIconComponent,
|
|
292
|
+
ConfirmModalComponent,
|
|
293
|
+
ManageBookingFailedModalComponent,
|
|
294
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"refund-summary\">\n <!-- Header -->\n <!-- <div class=\"refund-summary__header\">\n <button\n type=\"button\"\n class=\"refund-summary__header-btn\"\n (click)=\"onKeepRoom()\"\n aria-label=\"Close\"\n >\n <almatar-icon [name]=\"backArrow()\"></almatar-icon>\n </button>\n\n <div class=\"refund-summary__header-text\">\n <h3 class=\"refund-summary__header-title\">\n Cancel Booking Request\n </h3>\n </div>\n <button\n type=\"button\"\n class=\"refund-summary__header-btn\"\n (click)=\"onClose()\"\n aria-label=\"Close\"\n >\n <almatar-icon [name]=\"'x-mark'\"></almatar-icon>\n </button>\n </div> -->\n\n @if (isLoading()) {\n <div class=\"refund-summary__loader\">\n <almatar-loader></almatar-loader>\n </div>\n } @else if (error()) {\n <div class=\"refund-summary__error\">\n <div class=\"refund-summary__error-card\">\n <div class=\"refund-summary__error-icon-wrapper\">\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 8V12M12 16H12.01M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <h4 class=\"refund-summary__error-title\">\n Failed to load refund details. Please try again.\n </h4>\n <button\n class=\"refund-summary__error-btn\"\n type=\"button\"\n (click)=\"loadRefundDetails()\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M1 4V10H7M23 20V14H17M20.49 9C19.9828 7.56678 19.1209 6.2854 17.9845 5.27542C16.8482 4.26543 15.4745 3.55976 13.9917 3.22426C12.5089 2.88875 10.9652 2.93434 9.50481 3.35677C8.04437 3.77921 6.71475 4.56471 5.64 5.64L1 10M23 14L18.36 18.36C17.2853 19.4353 15.9556 20.2208 14.4952 20.6432C13.0348 21.0657 11.4911 21.1112 10.0083 20.7757C8.52547 20.4402 7.1518 19.7346 6.01547 18.7246C4.87913 17.7146 4.01717 16.4332 3.51 15\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n Try Again\n </button>\n </div>\n </div>\n } @else {\n <div class=\"refund-summary__content\">\n <h3 class=\"refund-summary__title\">\n Refund summary\n </h3>\n\n <div class=\"package-cards\">\n @for (pkg of packages(); track i; let i = $index) {\n <div\n class=\"package-card\"\n [class.package-card--expanded]=\"isPackageExpanded(pkg.packageId)\"\n [class.package-card--cancelled-before]=\"pkg.cancelledBefore\"\n >\n <div\n class=\"package-card__header\"\n (click)=\"togglePackageExpand(pkg.packageId)\"\n >\n <div class=\"package-card__info\">\n <div class=\"package-card__title-row\">\n <h4 class=\"package-card__name\">{{ pkg.packageName }}</h4>\n @if (!pkg.cancelledBefore) {\n <span class=\"package-card__badge\">\n CURRENT CANCELLATION\n </span>\n <!-- <span class=\"package-card__date\">\n Today on\n {{ formatDate(pkg.cancellationDate) }}\n </span> -->\n } @else {\n <span\n class=\"package-card__badge package-card__badge--cancelled\"\n >\n PREVIOUS CANCELLATION\n </span>\n <!-- <span class=\"package-card__date\">\n Cancellation date:\n {{ formatDate(pkg.cancellationDate) }}\n </span> -->\n }\n </div>\n </div>\n <div\n class=\"package-card__expand-icon\"\n [class.rotated]=\"isPackageExpanded(pkg.packageId)\"\n >\n <almatar-icon [name]=\"'chevron-down'\"></almatar-icon>\n </div>\n </div>\n\n <!-- Rooms display -->\n @if (pkg.rooms?.length) {\n <div class=\"package-card__rooms-container\">\n @for (\n group of groupRoomsByName(pkg.rooms);\n track i;\n let i = $index\n ) {\n <div class=\"package-card__room-summary\">\n @if (group.count > 1) {\n <!-- Multiple rooms -->\n {{ group.count }}x {{ group.roomName }}\n } @else {\n <!-- Single room -->\n Room\n\n {{ i + 1 }}\n <span class=\"package-card__separator\">•</span>\n {{ group.roomName }}\n }\n @if (group.nights) {\n <span class=\"package-card__separator\">•</span>\n {{ group.nights }}\n @if (group.nights === 1) {\n night\n } @else {\n nights\n }\n }\n @if (group.adults) {\n <span class=\"package-card__separator\">•</span>\n {{ group.adults }}\n @if (group.adults === 1) {\n Adult\n } @else {\n Adults\n }\n }\n @if (group.children) {\n <span class=\"package-card__separator\">•</span>\n {{ group.children }}\n @if (group.children === 1) {\n Child\n } @else {\n Children\n }\n }\n </div>\n }\n </div>\n }\n\n @if (!pkg.cancelledBefore) {\n <span class=\"package-card__date\">\n Today on\n {{ formatDate(pkg.cancellationDate) }}\n </span>\n } @else {\n <span class=\"package-card__date\">\n Cancellation date:\n {{ formatDate(pkg.cancellationDate) }}\n </span>\n }\n\n <!-- Room Amount Row with expand -->\n\n <!-- Expandable content: Rooms, Date, and Financial breakdown -->\n <div\n class=\"package-card__expandable-content\"\n [class.expanded]=\"isPackageExpanded(pkg.packageId)\"\n >\n <div\n class=\"package-card__row package-card__row--clickable\"\n (click)=\"\n toggleAmountExpand(pkg.packageId); $event.stopPropagation()\n \"\n >\n @if (pkg?.rooms?.length > 1) {\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >Rooms amount</span\n >\n } @else {\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >Room amount</span\n >\n }\n <span class=\"package-card__value package-card__value--regular\">\n @if (\n pkg.fee > 0 || pkg.serviceFee > 0 || surchargeAmount() > 0\n ) {\n <div\n class=\"package-card__expand-icon\"\n [class.rotated]=\"isAmountExpanded(pkg.packageId)\"\n >\n <almatar-icon [name]=\"'chevron-down'\"></almatar-icon>\n </div>\n }\n\n {{\n pkg.amount\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n\n <!-- Expanded content: Cancellation fee and Service fee -->\n <div\n class=\"package-card__expanded-content\"\n [class.expanded]=\"\n isAmountExpanded(pkg.packageId) &&\n (pkg.fee > 0 || pkg.serviceFee > 0)\n \"\n >\n @if (pkg.fee > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">Cancellation fee</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n pkg.fee\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n @if (pkg.serviceFee > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">Service Fee</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n pkg.serviceFee\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n @if (surchargeAmount() > 0) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">\n Surcharge (2.5%)\n </span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n -\n {{\n surchargeAmount()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n </div>\n <!-- Add-Ons Refund Section -->\n @if (giftsDetails().length > 0 && i === packages()?.length - 1) {\n <div class=\"addons-refund\">\n <span\n class=\"package-card__label package-card__label--dark-light\"\n >\n Add-Ons Refund\n </span>\n <div class=\"addons-refund__list\">\n @for (gift of giftsDetails(); track $index) {\n <div class=\"package-card__row\">\n <span class=\"package-card__label\">{{ gift.name }}</span>\n <span\n class=\"package-card__value package-card__value--gray package-card__value--regular\"\n >\n {{\n gift.toBeRefundedAmount\n | exchange_round\n : baseCurrencyCode()\n : currentCurrency()\n }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n <!-- @if (!gift.refundable) {\n <span> - </span>\n } -->\n </span>\n </div>\n }\n </div>\n\n <!-- @if (giftsHasRefundableEntity()) {\n <div class=\"addons-refund__notice\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n />\n <path\n d=\"M10 9V14\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n <circle cx=\"10\" cy=\"6.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span class=\"addons-refund__notice-text\">\n Your add-on service/s refund will be processed separately by our Customer Service team shortly.\n </span>\n </div>\n } -->\n </div>\n }\n </div>\n <!-- End expandable content -->\n\n <!-- You will get back row - ALWAYS VISIBLE -->\n <div class=\"package-card__details\">\n @if (pkg.cancelledBefore) {\n <div class=\"package-card__row package-card__row--total\">\n <span class=\"package-card__label package-card__label--dark\">Refunded amount</span>\n <span\n class=\"package-card__value package-card__value--highlight\"\n >\n {{\n pkg.refund\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n } @else {\n <div class=\"package-card__row package-card__row--total\">\n <span class=\"package-card__label package-card__label--dark\">You will get back</span>\n <span\n class=\"package-card__value package-card__value--highlight package-card__value--regular\"\n >\n {{\n pkg.refund\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <hr class=\"seperator\" />\n\n <div class=\"total-summary\">\n <div class=\"total-summary__row\">\n <span class=\"total-summary__label\">Total paid</span>\n <span class=\"total-summary__value\">\n {{\n totalPaid()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n\n @if (alreadyRefunded()) {\n <div class=\"total-summary__row\">\n <span class=\"total-summary__label\">Rooms Refunded</span>\n <span class=\"total-summary__value\">\n {{\n alreadyRefunded()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n }\n\n <div class=\"total-summary__row total-summary__row--highlight\">\n <div class=\"total-summary__label total-summary__label--highlight\">\n <span>\n You'll get back for\n {{ currentRefundRoomsNumber() }}\n {{\n currentLang() !== 'ar'\n ? currentRefundRoomsNumber() > 1\n ? ('Rooms')\n : ('Room')\n : ''\n }}\n </span>\n </div>\n <span class=\"total-summary__value total-summary__value--highlight\">\n {{\n totalRefund()\n }}\n {{ currentCurrency()?.code }}\n @if (currentCurrency()) {\n <app-currency-code-icon\n [currency]=\"currentCurrency()\"\n ></app-currency-code-icon>\n }\n </span>\n </div>\n </div>\n\n <div class=\"info-banner\">\n <div class=\"info-banner__icon\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L3 5V9C3 13.55 6.24 17.74 10 18.5C13.76 17.74 17 13.55 17 9V5L10 2Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7 10L9 12L13 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"info-banner__content\">\n @if (paymentMethod() === 'CH') {\n <p class=\"info-banner__text\">\n Your refund is instant from our side, your bank may take up to 15 business days to reflect it.\n </p>\n } @else if (paymentMethod() === 'TB') {\n <p class=\"info-banner__text\">\n Your refund will be processed to Tabby within 3-5 business days.\n </p>\n } @else if (paymentMethod() === 'TM') {\n <p class=\"info-banner__text\">\n Your refund will be processed to Tamara within 7-10 business days.\n </p>\n } @else {\n <p class=\"info-banner__text\">\n Your loyalty points will be refunded instantly to your account.\n </p>\n }\n\n <p class=\"info-banner__subtext\">\n You can select refund option in the next step\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"refund-summary__footer\">\n @if (totalRefund()) {\n <button class=\"btn btn--secondary\" type=\"button\" (click)=\"onKeepRoom()\">\n Keep Room\n </button>\n <button\n class=\"btn btn--primary\"\n type=\"button\"\n (click)=\"onSelectRefundOption()\"\n >\n Select refund option\n </button>\n } @else {\n <button\n class=\"btn btn--danger\"\n type=\"button\"\n [disabled]=\"isCancelLoading()\"\n (click)=\"submitData()\"\n >\n @if (isCancelLoading()) {\n <span class=\"btn__spinner\"></span>\n } @else {\n Cancel Booking\n }\n </button>\n }\n </div>\n }\n</div>\n\n<!-- Confirm Modal -->\n@if (showConfirmModalFlag()) {\n <div\n almatar-confirm-modal\n [Message]=\"'Your request has been submitted. Our customer service team will contact you shortly.'\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n\n<!-- Error Modal -->\n@if (showErrorModalFlag()) {\n <div\n almatar-manage-booking-failed-modal\n [errorMessage]=\"hotelManageError()\"\n (cancelEvent)=\"closeAllModals()\"\n (confirmEvent)=\"closeAllModals()\"\n ></div>\n}\n", styles: [".refund-summary{display:flex;flex-direction:column;height:100%}.refund-summary__notice{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:8px;font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin-top:16px}.refund-summary__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px}.refund-summary__notice--info{background:var(--almatar-info-surface, #eaf2ff);border:1px solid var(--almatar-info-border, #b9d6ff);color:var(--almatar-info-text, #1a56db);border-radius:12px}.refund-summary__notice--info svg{color:var(--almatar-info-icon, #1a56db)}.refund-summary__header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background:#fff;border-bottom:1px solid rgb(229,231,235)}.refund-summary__header-text{flex:1;text-align:center}.refund-summary__header-title{font-size:calc(24 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0}.refund-summary__header-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;cursor:pointer;color:#7c3aed;padding:0}.refund-summary__header-btn svg{width:20px;height:20px}.refund-summary__header-btn:hover{opacity:.7}.refund-summary__content{flex:1;overflow-y:auto;padding:16px;background-color:#fff}.refund-summary__title{font-size:calc(16 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:#1b1a1f;margin-bottom:16px}.refund-summary__error{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 20px;background:linear-gradient(180deg,#fef2f280,#fff)}.refund-summary__error-card{display:flex;flex-direction:column;align-items:center;text-align:center;padding:32px 24px;background:#fff;border-radius:16px;box-shadow:0 1px 3px #0000000a,0 4px 12px #0000000f;max-width:320px;width:100%;animation:fadeInUp .4s ease-out}.refund-summary__error-icon-wrapper{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#fee2e2,#fecaca);display:flex;align-items:center;justify-content:center;margin-bottom:20px;color:#dc2626;animation:pulse 2s ease-in-out infinite}.refund-summary__error-title{font-size:calc(15 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#374151;margin:0 0 24px;line-height:1.5}.refund-summary__error-btn{display:inline-flex;align-items:center;gap:8px;padding:12px 24px;background:linear-gradient(135deg,#7c3aed,#6d28d9);color:#fff;border:none;border-radius:10px;font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 8px #7c3aed40}.refund-summary__error-btn:hover{transform:translateY(-2px);box-shadow:0 4px 16px #7c3aed59}.refund-summary__error-btn:active{transform:translateY(0)}.refund-summary__error-btn svg{transition:transform .3s ease}.refund-summary__error-btn:hover svg{transform:rotate(180deg)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{transform:scale(1)}50%{transform:scale(1.05)}}.refund-summary__footer{display:flex;gap:12px;padding:16px 20px;background:#fff;border-top:1px solid rgb(229,231,235)}.package-cards{display:flex;flex-direction:column;gap:12px;margin-bottom:12px}.package-card{background:#fff;border:1px solid rgb(21,128,60);border-radius:12px;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);padding:16px}.package-card__header{display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer}.package-card__info{flex:1;min-width:0}.package-card__title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}.package-card__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#000;line-height:20px;margin:0}.package-card__badge{font-size:calc(10 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-bold);color:#15803c;background:#f0fdf5;padding:6px 8px;border-radius:999px;text-transform:uppercase;flex-shrink:0}.package-card__badge--cancelled{color:#92939e;background:#fff;border:1px solid rgb(217,217,222)}.package-card__header-expand-icon{color:currentColor;transition:transform .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.package-card__header-expand-icon.rotated{transform:rotate(180deg)}.package-card__expandable-content{opacity:0;max-height:0;transform:translateY(-10px);transition:opacity .3s cubic-bezier(.4,0,.2,1),max-height .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1),margin-top .3s cubic-bezier(.4,0,.2,1);overflow:hidden;margin-top:0}.package-card__expandable-content.expanded{opacity:1;max-height:1000px;transform:translateY(0);margin-top:12px}.package-card__rooms-container{display:flex;flex-direction:column;gap:4px;margin:8px 0 4px}.package-card__rooms{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}.package-card__room{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:16px;border:1px solid rgb(217,217,222);background:#fff}.package-card__room-name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center;flex-wrap:wrap;gap:0;margin:0}.package-card__room-basis{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#6b7280}.package-card__room-summary{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;display:flex;align-items:center;flex-wrap:wrap;gap:0}.package-card__separator{margin:0 4px;color:#1f2937;font-weight:var(--almatar-font-weight-regular)}.package-card__date{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#6b7280;margin-bottom:12px}.package-card__details{cursor:pointer;overflow:hidden}.package-card__expanded-content{opacity:0;max-height:0;transform:translateY(-10px);transition:opacity .3s cubic-bezier(.4,0,.2,1),max-height .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden;margin-bottom:0}.package-card__expanded-content.expanded{opacity:1;max-height:500px;transform:translateY(0);margin-bottom:0}.package-card__row{display:flex;justify-content:space-between;align-items:center;transition:all .2s ease;margin-bottom:4px}.package-card__row--clickable{cursor:pointer}.package-card__row--total{margin-top:4px;font-weight:var(--almatar-font-weight-semibold);margin-bottom:0}.package-card__row:last-child{margin-bottom:0}.package-card__label{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#747583;font-weight:var(--almatar-font-weight-regular)}.package-card__label--dark{color:#1b1a1f;font-weight:var(--almatar-font-weight-medium)}.package-card__label--dark-light{color:#1b1a1f}.package-card__value{font-size:calc(13 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-medium);color:#1b1a1f;display:flex;align-items:center}:host-context(#ltr) .package-card__value{flex-direction:row-reverse}.package-card__value{gap:2px}.package-card__value--gray{color:#747583}.package-card__value--highlight{font-weight:var(--almatar-font-weight-medium);font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f}.package-card__value--regular{font-weight:var(--almatar-font-weight-regular)}.package-card__expand-icon{color:currentColor;transition:transform .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;width:16px;height:16px}.package-card__expand-icon.rotated{transform:rotate(180deg)}.package-card--cancelled-before{border:1px solid transparent;background-color:#f7f7f8}.package-card--cancelled-before .package-card__label.package-card__label--dark,.package-card--cancelled-before .package-card__value.package-card__value--highlight{color:#15803c}.package-card--expanded .package-card__header{margin-bottom:0}.addons-refund{margin-bottom:4px}.addons-refund__title{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);color:#1b1a1f;margin:0 0 12px}.addons-refund__list{display:flex;flex-direction:column}.addons-refund__item{display:flex;justify-content:space-between;align-items:center}.addons-refund__name{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#747583}.addons-refund__value{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#747583;display:flex;align-items:center}:host-context(#ltr) .addons-refund__value{flex-direction:row-reverse}.addons-refund__value{gap:2px}.addons-refund__notice{display:flex;align-items:center;gap:8px;padding:12px;border-radius:12px;font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:400;margin-top:8px;background:#f7f7f8;border:1px solid rgb(217,217,222);color:#1b1a1f}.addons-refund__notice svg{flex-shrink:0;width:18px;height:18px;margin-top:1px;color:#1b1a1f}.addons-refund__notice-text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#1b1a1f;margin:0;line-height:1.5}.seperator{margin:12px 0;border:1px dashed rgb(217,217,222)}.total-summary{background:#f0f8ff;border-radius:12px;padding:16px;margin-bottom:16px;transition:all .3s cubic-bezier(.4,0,.2,1)}.total-summary__row{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.total-summary__label{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;font-weight:var(--almatar-font-weight-regular)}.total-summary__label--highlight{font-weight:var(--almatar-font-weight-medium)}.total-summary__value{font-size:calc(13 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-regular);color:#0b54c2;display:flex;align-items:center}:host-context(#ltr) .total-summary__value{flex-direction:row-reverse}.total-summary__value{gap:2px}.total-summary__value--highlight{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-bold);color:#0b54c2}.info-banner{display:flex;gap:8px;border:1px solid rgb(11,84,194);border-radius:12px;padding:14px;align-items:flex-start;transition:all .3s cubic-bezier(.4,0,.2,1)}.info-banner__icon{color:#0b54c2;flex-shrink:0;width:20px;height:20px}.info-banner__content{flex:1}.info-banner__text{font-size:calc(12 * var(--almatar-font-size-ratio, 1) * 1px);color:#0b54c2;margin:0 0 4px;font-weight:var(--almatar-font-weight-regular);line-height:16px}.info-banner__subtext{font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);color:#1b1a1f;margin:0;line-height:1.4}.btn{flex:1;padding:12px 20px;border-radius:10px;font-size:calc(14 * var(--almatar-font-size-ratio, 1) * 1px);font-weight:var(--almatar-font-weight-semibold);cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);border:none;position:relative;overflow:hidden}.btn:before{content:\"\";position:absolute;top:50%;left:50%;width:0;height:0;border-radius:50%;background:#fff3;transform:translate(-50%,-50%);transition:width .6s,height .6s}.btn:active:before{width:300px;height:300px}.btn--primary{background:#7c3aed;color:#fff}.btn--primary:hover{background:#6d28d9;transform:translateY(-1px);color:#fff;box-shadow:0 4px 12px #7c3aed4d}.btn--primary:active{transform:translateY(0)}.btn--secondary{background:#fff;color:#1b1a1f;border:1.5px solid rgb(229,231,235)}.btn--secondary:hover{background:#f9fafb;border-color:#d1d5db}.btn--secondary:active{background:#f3f4f6}.btn--danger{background:#fae3de;color:#dc2626;width:100%}.btn--danger:hover{color:#dc2626}.btn--danger:disabled{opacity:.7;cursor:not-allowed}.btn__spinner{display:inline-block;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)}}\n"] }]
|
|
295
|
+
}], ctorParameters: () => [] });
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmQtc3VtbWFyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2NvbXBvbmVudHMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmQtc3VtbWFyeS9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5L2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLXN1bW1hcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsVUFBVSxFQUVWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQVMvRSxPQUFPLEVBQUUsNENBQTRDLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUNoSSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUM3RyxPQUFPLEVB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Q2xCLHlCQUF5Qjt3QkFDekIscUJBQXFCO3dCQUNyQixpQ0FBaUM7cUJBQ2xDLG1CQU1nQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgRGVzdHJveVJlZixcbiAgT25Jbml0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTG9hZGVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL21vZHVsZXMvbG9hZGVyL2xvYWRlci5tb2R1bGUnO1xuaW1wb3J0IHtcbiAgSUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Sb29tLFxuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFN1bW1hcnksXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uSG90ZWxJbmZvLFxuICBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFBhY2thZ2UsXG4gIElBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kUGFja2FnZVJvb20sXG4gIElHaWZ0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ktYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvbkVuZHBvaW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFsbWF0YXJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL21vZHVsZXMvYWxtYXRhci1pY29uL2FsbWF0YXItaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50Q3VycmVuY3kgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvc3RvcmUvc2VsZWN0b3JzL2N1cnJlbmN5LnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBFeGNoYW5nZVBpcGVNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvcGlwZXMvZXhjaGFuZ2UucGlwZSc7XG5pbXBvcnQgeyBDdXJyZW5jeUNvZGVJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvY3VycmVuY3ktY29kZS1pY29uL2N1cnJlbmN5LWNvZGUtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBIb3RlbE1hbmFnZUJvb2tpbmdFbmRwb2ludHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2hvdGVsLW1hbmFnZS1ib29raW5nLWVuZHBvaW50cy9ob3RlbC1tYW5hZ2UtYm9va2luZy1lbmRwb2ludHMuc2VydmljZSc7XG5pbXBvcnQgeyBIb3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2hvdGVsLW1hbmFnZS1ib29raW5nL2hvdGVsLW1hbmFnZS1ib29raW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FuY2VsSG90ZWxCb29raW5nUGF5bG9hZCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9tb2RlbHMvY2FuY2VsLWhvdGVsLWJvb2tpbmcubW9kZWwnO1xuaW1wb3J0IHsgSG90ZWxNYW5hZ2VCb29raW5nQXNpZGVUYWJFbnVtIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2VudW1zL2hvdGVsLW1hbmFnZS1ib29raW5nLWFzaWRlLXRhYi5lbnVtJztcbmltcG9ydCB7IGVudmlyb25tZW50cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQ29uZmlybU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvY29uZmlybS1tb2RhbC9jb25maXJtLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYW5hZ2VCb29raW5nRmFpbGVkTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50cy9tYW5hZ2UtYm9va2luZy1mYWlsZWQtbW9kYWwvbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FsbWF0YXItaG90ZWwtYXV0by1jYW5jZWxsYXRpb24tcmVmdW5kLXN1bW1hcnknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIExvYWRlck1vZHVsZSxcbiAgICBBbG1hdGFySWNvbk1vZHVsZSxcbiAgICBFeGNoYW5nZVBpcGVNb2R1bGUsXG4gICAgQ3VycmVuY3lDb2RlSWNvbkNvbXBvbmVudCxcbiAgICBDb25maXJtTW9kYWxDb21wb25lbnQsXG4gICAgTWFuYWdlQm9va2luZ0ZhaWxlZE1vZGFsQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDpcbiAgICAnLi9hbG1hdGFyLWhvdGVsLWF1dG8tY2FuY2VsbGF0aW9uLXJlZnVuZC1zdW1tYXJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vYWxtYXRhci1ob3RlbC1hdXRvLWNhbmNlbGxhdGlvbi1yZWZ1bmQtc3VtbWFyeS5jb21wb25lbnQuc2NzcycsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uUmVmdW5kU3VtbWFyeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRzU2VydmljZSA9IGluamVjdChcbiAgICBBbG1hdGFySG90ZWxBdXRvQ2FuY2VsbGF0aW9uRW5kcG9pbnRzU2VydmljZSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlID0gaW5qZWN0KFxuICAgIEFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25TZXJ2aWNlLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNoYXJlZFNlcnZpY2UgPSBpbmplY3QoU2hhcmVkU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG90ZWxNYW5hZ2VCb29raW5nc0VuZHBvaW50c1NlcnZpY2UgPSBpbmplY3QoXG4gICAgSG90ZWxNYW5hZ2VCb29raW5nRW5kcG9pbnRzU2VydmljZSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvdGVsTWFuYWdlQm9va2luZ1NlcnZpY2UgPSBpbmplY3QoXG4gICAgSG90ZWxNYW5hZ2VCb29raW5nU2VydmljZSxcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcigpe1xuICAgIC8vIGVmZmVjdCgoKSA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnUmVmdW5kIFN1bW1hcnkgVXBkYXRlZDonLCB0aGlzLmN1cnJlbnRDdXJyZW5jeSgpKTtcbiAgICAvLyB9KVxuICB9XG5cbiAgLy8gQ3VycmVuY3lcbiAgcmVhZG9ubHkgYmFzZUN1cnJlbmN5Q29kZSA9IHNpZ25hbCgnU0FSJyk7XG4gIHJlYWRvbmx5IGN1cnJlbnRDdXJyZW5jeSA9IHNpZ25hbDxhbnk+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHBheW1lbnRNZXRob2QgPSBzaWduYWw8YW55PihudWxsKTtcblxuICAvLyBMYW5ndWFnZVxuICByZWFkb25seSBjdXJyZW50TGFuZyA9IHNpZ25hbCgnZW4nKTtcblxuICByZWFkb25seSBzZWxlY3RlZFJvb21zID1cbiAgICBpbnB1dC5yZXF1aXJlZDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJvb21bXT4oKTtcblxuICByZWFkb25seSBib29raW5nSWQgPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KCcnKTtcblxuICByZWFkb25seSBob3RlbElkID0gaW5wdXQ8c3RyaW5nIHwgbnVtYmVyPignJyk7XG5cbiAgcmVhZG9ubHkgaG90ZWxJbmZvID0gaW5wdXQ8SUFsbWF0YXJIb3RlbEF1dG9DYW5jZWxsYXRpb25Ib3RlbEluZm8gfCBudWxsPihcbiAgICBudWxsLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblNraXBwZWQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkga2VlcFJvb20gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0UmVmdW5kT3B0aW9uID0gb3V0cHV0PHtcbiAgICBwYWNrYWdlSWRzOiBzdHJpbmdbXTtcbiAgICBwYXlvdXQ6IGFueTtcbiAgICB0b3RhbFJlZnVuZDogbnVtYmVyO1xuICAgIHJlc3BvbnNlRGF0YTogYW55O1xuICB9PigpO1xuXG4gIHJlYWRvbmx5IGNsb3NlTW9kYWwgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBpc0NhbmNlbExvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIE1vZGFsIHN0YXRlXG4gIHJlYWRvbmx5IHNob3dDb25maXJtTW9kYWxGbGFnID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yTW9kYWxGbGFnID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaG90ZWxNYW5hZ2VFcnJvciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICBiYWNrQXJyb3cgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuICdhcnJvdy1sZWZ0JzsgLy8gQWx3YXlzIExUUiBmb3IgRW5nbGlzaFxuICB9KTtcblxuICByZWFkb25seSBleHBhbmRlZFBhY2thZ2VJZHMgPSBzaWduYWw8U2V0PHN0cmluZz4+KG5ldyBTZXQoKSk7XG4gIHJlYWRvbmx5IGV4cGFuZGVkQW1vdW50SWRzID0gc2lnbmFsPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHJlZnVuZFN1bW1hcnkgPVxuICAgIHNpZ25hbDxJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFN1bW1hcnkgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgcmVzcG9uc2VEYXRhID0gc2lnbmFsPGFueSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IHJvb21zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LnJvb21zID8/IFtdKTtcblxuICBncm91cFJvb21zQnlOYW1lKHJvb21zOiBJQWxtYXRhckhvdGVsQXV0b0NhbmNlbGxhdGlvblJlZnVuZFBhY2thZ2VSb29tW10pOiB7XG4gICAgcm9vbU5hbWU6IHN0cmluZztcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIG5pZ2h0cz86IG51bWJlcjtcbiAgICBhZHVsdHM/OiBudW1iZXI7XG4gICAgY2hpbGRyZW4/OiBudW1iZXI7XG4gICAgYmFzaXM/OiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgZ3JvdXBlZCA9IG5ldyBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGNvdW50OiBudW1iZXI7XG4gICAgICAgIG5pZ2h0cz86IG51bWJlcjtcbiAgICAgICAgYWR1bHRzPzogbnVtYmVyO1xuICAgICAgICBjaGlsZHJlbj86IG51bWJlcjtcbiAgICAgICAgYmFzaXM/OiBzdHJpbmc7XG4gICAgICB9XG4gICAgPigpO1xuXG4gICAgcm9vbXMuZm9yRWFjaCgocm9vbSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHJvb20ucm9vbU5hbWUgfHwgJ1Jvb20nO1xuICAgICAgY29uc3QgYWR1bHRzID0gcm9vbS5wYXg/LmFkdWx0cyA/PyByb29tLmFkdWx0cztcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcm9vbS5wYXg/LmNoaWxkcmVuID8/IHJvb20uY2hpbGRyZW47XG4gICAgICBpZiAoZ3JvdXBlZC5oYXMobmFtZSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBncm91cGVkLmdldChuYW1lKSE7XG4gICAgICAgIGV4aXN0aW5nLmNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncm91cGVkLnNldChuYW1lLCB7XG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgbmlnaHRzOiByb29tLm5pZ2h0cyxcbiAgICAgICAgICBhZHVsdHMsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgYmFzaXM6IHJvb20uYmFzaXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBlZC5lbnRyaWVzKCkpLm1hcCgoW3Jvb21OYW1lLCBkYXRhXSkgPT4gKHtcbiAgICAgIHJvb21OYW1lLFxuICAgICAgLi4uZGF0YSxcbiAgICB9KSk7XG4gIH1cblxuICByZWFkb25seSBwYWNrYWdlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy5wYWNrYWdlcyA/PyBbXSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFJlZnVuZFJvb21zTnVtYmVyID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5wYWNrYWdlcygpO1xuICAgIHJldHVybiBwYWNrYWdlc1xuICAgICAgLmZpbHRlcigocGtnKSA9PiAhcGtnLmNhbmNlbGxlZEJlZm9yZSlcbiAgICAgIC5yZWR1Y2UoKGFjYywgcGtnKSA9PiBhY2MgKyAocGtnLnJvb21zPy5sZW5ndGggfHwgMCksIDApO1xuICB9KTtcblxuICByZWFkb25seSB0b3RhbFBhaWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlZnVuZFN1bW1hcnkoKT8udG90YWxQYWlkID8/IDApO1xuICByZWFkb25seSB0b3RhbFJlZnVuZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy50b3RhbFJlZnVuZCA/PyAwKTtcbiAgcmVhZG9ubHkgYWxyZWFkeVJlZnVuZGVkID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5wYXlvdXQoKT8uYWxyZWFkeVJlZnVuZGVkID8/IDAsXG4gICk7XG5cbiAgcmVhZG9ubHkgc3VtbWFyaWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LnN1bW1hcmllcyA/PyBbXSk7XG4gIHJlYWRvbmx5IHBheW91dCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy5wYXlvdXQgPz8gbnVsbCk7XG4gIHJlYWRvbmx5IHBhY2thZ2VJZHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuc2VsZWN0ZWRSb29tcygpLm1hcCgocm9vbSkgPT4gcm9vbS5wYWNrYWdlSWQpLFxuICApO1xuXG4gIHJlYWRvbmx5IHRvdGFsUGFja2FnZXNDb3VudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5wYWNrYWdlcygpLnJlZHVjZSgoYWNjLCBwa2cpID0+IGFjYyArIChwa2cucm9vbXM/Lmxlbmd0aCB8fCAwKSwgMCksXG4gICk7XG5cbiAgLy8gQWRkaXRpb25hbCBicmVha2Rvd24gZmllbGRzXG4gIHJlYWRvbmx5IGNvdXBvbkFtb3VudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy5jb3Vwb24gPz8gMCk7XG4gIHJlYWRvbmx5IGdpZnRzVG90YWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlZnVuZFN1bW1hcnkoKT8uZ2lmdHNUb3RhbCA/PyAwKTtcbiAgcmVhZG9ubHkgZ2lmdHNEZXRhaWxzID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LmdpZnRzRGV0YWlscyA/PyBbXSxcbiAgKTtcblxuICByZWFkb25seSBnaWZ0c0hhc1JlZnVuZGFibGVFbnRpdHkgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuZ2lmdHNEZXRhaWxzKCkuc29tZSgoZ2lmdDogSUdpZnQpID0+IGdpZnQucmVmdW5kYWJsZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VydmljZUZlZUFtb3VudCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy5zZXJ2aWNlRmVlID8/IDAsXG4gICk7XG5cbiAgcmVhZG9ubHkgc3VyY2hhcmdlQW1vdW50ID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LnN1cmNoYXJnZSA/PyAwLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzR29sZGVuR2lmdCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMucmVmdW5kU3VtbWFyeSgpPy5nb2xkZW5HaWZ0ID8/IGZhbHNlLFxuICApO1xuXG4gIHJlYWRvbmx5IHBheW91dE5vdGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBheW91dCgpPy5ub3RlID8/IG51bGwpO1xuICByZWFkb25seSBwcmV2aW91c1Jvb21zID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LnByZXZpb3VzUm9vbXMgPz8gW10sXG4gICk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBkZWR1Y3Rpb25zIHRvIHNob3dcbiAgcmVhZG9ubHkgaGFzRGVkdWN0aW9ucyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLmNvdXBvbkFtb3VudCgpID4gMCB8fFxuICAgICAgdGhpcy5naWZ0c1RvdGFsKCkgPiAwIHx8XG4gICAgICB0aGlzLnNlcnZpY2VGZWVBbW91bnQoKSA+IDAgfHxcbiAgICAgIHRoaXMuc3VyY2hhcmdlQW1vdW50KCkgPiAwLFxuICApO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFJlZnVuZERldGFpbHMoKTtcbiAgICB0aGlzLmluaXRDdXJyZW5jeSgpO1xuICAgIHRoaXMuaW5pdExhbmd1YWdlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRMYW5ndWFnZSgpOiB2b2lkIHtcbiAgICAvLyBMYW5ndWFnZSBpcyBmaXhlZCB0byBFbmdsaXNoXG4gICAgdGhpcy5jdXJyZW50TGFuZy5zZXQoJ2VuJyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDdXJyZW5jeSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KGdldEN1cnJlbnRDdXJyZW5jeSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGN1cnJlbmN5KSA9PiAhIWN1cnJlbmN5KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjdXJyZW5jeSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRDdXJyZW5jeS5zZXQoY3VycmVuY3kpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2VcbiAgICAgIC5nZXRCYXNlQ3VycmVuY3koKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChjdXJyZW5jeSkgPT4ge1xuICAgICAgICB0aGlzLmJhc2VDdXJyZW5jeUNvZGUuc2V0KGN1cnJlbmN5LmNvZGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBsb2FkUmVmdW5kRGV0YWlscygpOiB2b2lkIHtcbiAgICBjb25zdCBwYWNrYWdlSWRzID0gdGhpcy5wYWNrYWdlSWRzKCk7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgdGhpcy5lbmRwb2ludHNTZXJ2aWNlXG4gICAgICAuZ2V0UmVmdW5kRGV0YWlscyhwYWNrYWdlSWRzKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5lbmRwb2ludHNTZXJ2aWNlLm1hcEFwaVJlc3BvbnNlVG9SZWZ1bmRTdW1tYXJ5KFxuICAgICAgICAgICAgICByZXNwb25zZS5kYXRhLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuc2V0KHJlc3BvbnNlLmRhdGEpO1xuXG4gICAgICAgICAgICB0aGlzLnJlZnVuZFN1bW1hcnkuc2V0KHN1bW1hcnkpO1xuXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRNZXRob2Quc2V0KFxuICAgICAgICAgICAgICB0aGlzLmRldGVybWluZVBheW1lbnRNZXRob2QoXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZ1bmRTdW1tYXJ5KCk/LnBheW91dCxcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnVuZFN1bW1hcnkoKT8udG90YWxzLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZUxvY2FsUmVmdW5kU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgcmVmdW5kIGRldGFpbHMnKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUxvY2FsUmVmdW5kU3VtbWFyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5lbmRwb2ludHNTZXJ2aWNlLmNhbGN1bGF0ZUxvY2FsUmVmdW5kU3VtbWFyeShcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb29tcygpLm1hcCgocm9vbSkgPT4gKHsgLi4ucm9vbSwgaXNTZWxlY3RlZDogdHJ1ZSB9KSksXG4gICAgKTtcbiAgICB0aGlzLnJlZnVuZFN1bW1hcnkuc2V0KHN1bW1hcnkpO1xuICB9XG5cbiAgdG9nZ2xlUGFja2FnZUV4cGFuZChwYWNrYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRQYWNrYWdlSWRzLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChjdXJyZW50KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHBhY2thZ2VJZCkpIHtcbiAgICAgICAgbmV3U2V0LmRlbGV0ZShwYWNrYWdlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2V0LmFkZChwYWNrYWdlSWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NldDtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZUFtb3VudEV4cGFuZChwYWNrYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRBbW91bnRJZHMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdTZXQgPSBuZXcgU2V0KGN1cnJlbnQpO1xuICAgICAgaWYgKG5ld1NldC5oYXMocGFja2FnZUlkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHBhY2thZ2VJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTZXQuYWRkKHBhY2thZ2VJZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9XG5cbiAgaXNQYWNrYWdlRXhwYW5kZWQocGFja2FnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZFBhY2thZ2VJZHMoKS5oYXMocGFja2FnZUlkKTtcbiAgfVxuXG4gIGlzQW1vdW50RXhwYW5kZWQocGFja2FnZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEFtb3VudElkcygpLmhhcyhwYWNrYWdlSWQpO1xuICB9XG5cbiAgb25LZWVwUm9vbSgpOiB2b2lkIHtcbiAgICB0aGlzLmtlZXBSb29tLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZWN0UmVmdW5kT3B0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0UmVmdW5kT3B0aW9uLmVtaXQoe1xuICAgICAgcGFja2FnZUlkczogdGhpcy5wYWNrYWdlSWRzKCksXG4gICAgICBwYXlvdXQ6IHRoaXMucGF5b3V0KCksXG4gICAgICB0b3RhbFJlZnVuZDogdGhpcy50b3RhbFJlZnVuZCgpLFxuICAgICAgcmVzcG9uc2VEYXRhOiB0aGlzLnJlc3BvbnNlRGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgc3VibWl0RGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ29uZmlybVNlbmQoKTtcbiAgfVxuXG4gIG9uQ29uZmlybVNlbmQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0NhbmNlbExvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuaG90ZWxNYW5hZ2VCb29raW5nc0VuZHBvaW50c1NlcnZpY2VcbiAgICAgIC5jYW5jZWxCb29raW5nUmVxdWVzdChuZXcgQ2FuY2VsSG90ZWxCb29raW5nUGF5bG9hZCgpKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0NhbmNlbExvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICBpZiAoZW52aXJvbm1lbnRzLmlzVGVuYW50KSB7XG4gICAgICAgICAgICB0aGlzLm9uU2hvd1doYXRzQXBwQWdlbnQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlcz8uZGF0YT8uaXNXaGF0c0FwcFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgIHRoaXMub25TaG93V2hhdHNBcHBBZ2VudCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5vblNob3dDb25maXJtTW9kYWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNDYW5jZWxMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5ob3RlbE1hbmFnZUVycm9yLnNldChlcnJvcj8uZXJyb3I/LmVycm9ycz8ubWVzc2FnZSB8fCAnJyk7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3JNb2RhbEZsYWcuc2V0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uU2hvd1doYXRzQXBwQWdlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5ob3RlbE1hbmFnZUJvb2tpbmdTZXJ2aWNlLnNldEFjdGl2ZUFzaWRlVGFiKFxuICAgICAgSG90ZWxNYW5hZ2VCb29raW5nQXNpZGVUYWJFbnVtLndoYXRzQXBwQWdlbnQsXG4gICAgKTtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNob3dDb25maXJtTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q29uZmlybU1vZGFsRmxhZy5zZXQodHJ1ZSk7XG4gIH1cblxuICBjbG9zZUFsbE1vZGFscygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb25maXJtTW9kYWxGbGFnLnNldChmYWxzZSk7XG4gICAgdGhpcy5zaG93RXJyb3JNb2RhbEZsYWcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBkYXkgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdEJyk7XG4gICAgY29uc3QgbW9udGggPSBtb21lbnQoZGF0ZSkubG9jYWxlKCdlbicpLmZvcm1hdCgnTU1NTScpO1xuICAgIGNvbnN0IHllYXIgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZJyk7XG4gICAgcmV0dXJuIGAke2RheX0gJHttb250aH0gJHt5ZWFyfWA7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZVBheW1lbnRNZXRob2QodG90YWxzOiBhbnksIHBheW91dDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoKHBheW91dD8udGFiYnkgPz8gdG90YWxzPy50YWJieSA/PyAwKSA+IDApIHtcbiAgICAgIHJldHVybiAnVEInOyAvLyBUYWJieVxuICAgIH1cbiAgICBpZiAoKHBheW91dD8udGFtYXJhID8/IHRvdGFscz8udGFtYXJhID8/IDApID4gMCkge1xuICAgICAgcmV0dXJuICdUTSc7IC8vIFRhbWFyYVxuICAgIH1cbiAgICBpZiAoKHBheW91dD8uY2FyZCA/PyB0b3RhbHM/LmNhcmQgPz8gMCkgPiAwKSB7XG4gICAgICByZXR1cm4gJ0NIJzsgLy8gQ2FyZFxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeVwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwicmVmdW5kLXN1bW1hcnlfX2hlYWRlclwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9faGVhZGVyLWJ0blwiXG4gICAgICAoY2xpY2spPVwib25LZWVwUm9vbSgpXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgPlxuICAgICAgPGFsbWF0YXItaWNvbiBbbmFtZV09XCJiYWNrQXJyb3coKVwiPjwvYWxtYXRhci1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cInJlZnVuZC1zdW1tYXJ5X19oZWFkZXItdGV4dFwiPlxuICAgICAgPGgzIGNsYXNzPVwicmVmdW5kLXN1bW1hcnlfX2hlYWRlci10aXRsZVwiPlxuICAgICAgICBDYW5jZWwgQm9va2luZyBSZXF1ZXN0XG4gICAgICA8L2gzPlxuICAgIDwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9faGVhZGVyLWJ0blwiXG4gICAgICAoY2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgPlxuICAgICAgPGFsbWF0YXItaWNvbiBbbmFtZV09XCIneC1tYXJrJ1wiPjwvYWxtYXRhci1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj4gLS0+XG5cbiAgQGlmIChpc0xvYWRpbmcoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9fbG9hZGVyXCI+XG4gICAgICA8YWxtYXRhci1sb2FkZXI+PC9hbG1hdGFyLWxvYWRlcj5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSBpZiAoZXJyb3IoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9fZXJyb3JcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9fZXJyb3ItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVmdW5kLXN1bW1hcnlfX2Vycm9yLWljb24td3JhcHBlclwiPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMzJcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMzJcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTEyIDhWMTJNMTIgMTZIMTIuMDFNMjEgMTJDMjEgMTYuOTcwNiAxNi45NzA2IDIxIDEyIDIxQzcuMDI5NDQgMjEgMyAxNi45NzA2IDMgMTJDMyA3LjAyOTQ0IDcuMDI5NDQgMyAxMiAzQzE2Ljk3MDYgMyAyMSA3LjAyOTQ0IDIxIDEyWlwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cInJlZnVuZC1zdW1tYXJ5X19lcnJvci10aXRsZVwiPlxuICAgICAgICAgIEZhaWxlZCB0byBsb2FkIHJlZnVuZCBkZXRhaWxzLiBQbGVhc2UgdHJ5IGFnYWluLlxuICAgICAgICA8L2g0PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9fZXJyb3ItYnRuXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwibG9hZFJlZnVuZERldGFpbHMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xIDRWMTBIN00yMyAyMFYxNEgxN00yMC40OSA5QzE5Ljk4MjggNy41NjY3OCAxOS4xMjA5IDYuMjg1NCAxNy45ODQ1IDUuMjc1NDJDMTYuODQ4MiA0LjI2NTQzIDE1LjQ3NDUgMy41NTk3NiAxMy45OTE3IDMuMjI0MjZDMTIuNTA4OSAyLjg4ODc1IDEwLjk2NTIgMi45MzQzNCA5LjUwNDgxIDMuMzU2NzdDOC4wNDQzNyAzLjc3OTIxIDYuNzE0NzUgNC41NjQ3MSA1LjY0IDUuNjRMMSAxME0yMyAxNEwxOC4zNiAxOC4zNkMxNy4yODUzIDE5LjQzNTMgMTUuOTU1NiAyMC4yMjA4IDE0LjQ5NTIgMjAuNjQzMkMxMy4wMzQ4IDIxLjA2NTcgMTEuNDkxMSAyMS4xMTEyIDEwLjAwODMgMjAuNzc1N0M4LjUyNTQ3IDIwLjQ0MDIgNy4xNTE4IDE5LjczNDYgNi4wMTU0NyAxOC43MjQ2QzQuODc5MTMgMTcuNzE0NiA0LjAxNzE3IDE2LjQzMzIgMy41MSAxNVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBUcnkgQWdhaW5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdiBjbGFzcz1cInJlZnVuZC1zdW1tYXJ5X19jb250ZW50XCI+XG4gICAgICA8aDMgY2xhc3M9XCJyZWZ1bmQtc3VtbWFyeV9fdGl0bGVcIj5cbiAgICAgICAgUmVmdW5kIHN1bW1hcnlcbiAgICAgIDwvaDM+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWNhcmRzXCI+XG4gICAgICAgIEBmb3IgKHBrZyBvZiBwYWNrYWdlcygpOyB0cmFjayBpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkXCJcbiAgICAgICAgICAgIFtjbGFzcy5wYWNrYWdlLWNhcmQtLWV4cGFuZGVkXT1cImlzUGFja2FnZUV4cGFuZGVkKHBrZy5wYWNrYWdlSWQpXCJcbiAgICAgICAgICAgIFtjbGFzcy5wYWNrYWdlLWNhcmQtLWNhbmNlbGxlZC1iZWZvcmVdPVwicGtnLmNhbmNlbGxlZEJlZm9yZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cInBhY2thZ2UtY2FyZF9faGVhZGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhY2thZ2VFeHBhbmQocGtnLnBhY2thZ2VJZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1jYXJkX19pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX25hbWVcIj57eyBwa2cucGFja2FnZU5hbWUgfX08L2g0PlxuICAgICAgICAgICAgICAgICAgQGlmICghcGtnLmNhbmNlbGxlZEJlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fYmFkZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UIENBTkNFTExBVElPTlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2RhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBUb2RheSBvblxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdERhdGUocGtnLmNhbmNlbGxhdGlvbkRhdGUpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhY2thZ2UtY2FyZF9fYmFkZ2UgcGFja2FnZS1jYXJkX19iYWRnZS0tY2FuY2VsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIFBSRVZJT1VTIENBTkNFTExBVElPTlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2RhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb24gZGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXREYXRlKHBrZy5jYW5jZWxsYXRpb25EYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkX19leHBhbmQtaWNvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZWRdPVwiaXNQYWNrYWdlRXhwYW5kZWQocGtnLnBhY2thZ2VJZClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGFsbWF0YXItaWNvbiBbbmFtZV09XCInY2hldnJvbi1kb3duJ1wiPjwvYWxtYXRhci1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFJvb21zIGRpc3BsYXkgLS0+XG4gICAgICAgICAgICBAaWYgKHBrZy5yb29tcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3Jvb21zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgZ3JvdXAgb2YgZ3JvdXBSb29tc0J5TmFtZShwa2cucm9vbXMpO1xuICAgICAgICAgICAgICAgICAgdHJhY2sgaTtcbiAgICAgICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1jYXJkX19yb29tLXN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5jb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpcGxlIHJvb21zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmNvdW50IH19eCB7eyBncm91cC5yb29tTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmdsZSByb29tIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIFJvb21cblxuICAgICAgICAgICAgICAgICAgICAgIHt7IGkgKyAxIH19XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3NlcGFyYXRvclwiPiZidWxsOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5yb29tTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZ3JvdXAubmlnaHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3NlcGFyYXRvclwiPiZidWxsOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5uaWdodHMgfX1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLm5pZ2h0cyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5pZ2h0c1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLmFkdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFja2FnZS1jYXJkX19zZXBhcmF0b3JcIj4mYnVsbDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAuYWR1bHRzIH19XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5hZHVsdHMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkdWx0XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBZHVsdHNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFja2FnZS1jYXJkX19zZXBhcmF0b3JcIj4mYnVsbDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAuY2hpbGRyZW4gfX1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLmNoaWxkcmVuID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDaGlsZFxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoIXBrZy5jYW5jZWxsZWRCZWZvcmUpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2RhdGVcIj5cbiAgICAgICAgICAgICAgICBUb2RheSBvblxuICAgICAgICAgICAgICAgIHt7IGZvcm1hdERhdGUocGtnLmNhbmNlbGxhdGlvbkRhdGUpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fZGF0ZVwiPlxuICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvbiBkYXRlOlxuICAgICAgICAgICAgICAgIHt7IGZvcm1hdERhdGUocGtnLmNhbmNlbGxhdGlvbkRhdGUpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBSb29tIEFtb3VudCBSb3cgd2l0aCBleHBhbmQgLS0+XG5cbiAgICAgICAgICAgIDwhLS0gRXhwYW5kYWJsZSBjb250ZW50OiBSb29tcywgRGF0ZSwgYW5kIEZpbmFuY2lhbCBicmVha2Rvd24gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkX19leHBhbmRhYmxlLWNvbnRlbnRcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwiaXNQYWNrYWdlRXhwYW5kZWQocGtnLnBhY2thZ2VJZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3JvdyBwYWNrYWdlLWNhcmRfX3Jvdy0tY2xpY2thYmxlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICB0b2dnbGVBbW91bnRFeHBhbmQocGtnLnBhY2thZ2VJZCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKHBrZz8ucm9vbXM/Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkX19sYWJlbCBwYWNrYWdlLWNhcmRfX2xhYmVsLS1kYXJrLWxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgPlJvb21zIGFtb3VudDwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2xhYmVsIHBhY2thZ2UtY2FyZF9fbGFiZWwtLWRhcmstbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICA+Um9vbSBhbW91bnQ8L3NwYW5cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3ZhbHVlIHBhY2thZ2UtY2FyZF9fdmFsdWUtLXJlZ3VsYXJcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBrZy5mZWUgPiAwIHx8IHBrZy5zZXJ2aWNlRmVlID4gMCB8fCBzdXJjaGFyZ2VBbW91bnQoKSA+IDBcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2V4cGFuZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mucm90YXRlZF09XCJpc0Ftb3VudEV4cGFuZGVkKHBrZy5wYWNrYWdlSWQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxhbG1hdGFyLWljb24gW25hbWVdPVwiJ2NoZXZyb24tZG93bidcIj48L2FsbWF0YXItaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgIHBrZy5hbW91bnRcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q3VycmVuY3koKT8uY29kZSB9fVxuICAgICAgICAgICAgICAgICAgQGlmIChjdXJyZW50Q3VycmVuY3koKSkge1xuICAgICAgICAgICAgICAgICAgICA8YXBwLWN1cnJlbmN5LWNvZGUtaWNvblxuICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW50Q3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2FwcC1jdXJyZW5jeS1jb2RlLWljb24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEV4cGFuZGVkIGNvbnRlbnQ6IENhbmNlbGxhdGlvbiBmZWUgYW5kIFNlcnZpY2UgZmVlIC0tPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2V4cGFuZGVkLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJcbiAgICAgICAgICAgICAgICAgIGlzQW1vdW50RXhwYW5kZWQocGtnLnBhY2thZ2VJZCkgJiZcbiAgICAgICAgICAgICAgICAgIChwa2cuZmVlID4gMCB8fCBwa2cuc2VydmljZUZlZSA+IDApXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocGtnLmZlZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fbGFiZWxcIj5DYW5jZWxsYXRpb24gZmVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkX192YWx1ZSBwYWNrYWdlLWNhcmRfX3ZhbHVlLS1ncmF5IHBhY2thZ2UtY2FyZF9fdmFsdWUtLXJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBwa2cuZmVlXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q3VycmVuY3koKT8uY29kZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY3VycmVudEN1cnJlbmN5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtY3VycmVuY3ktY29kZS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW50Q3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9hcHAtY3VycmVuY3ktY29kZS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChwa2cuc2VydmljZUZlZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fbGFiZWxcIj5TZXJ2aWNlIEZlZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhY2thZ2UtY2FyZF9fdmFsdWUgcGFja2FnZS1jYXJkX192YWx1ZS0tZ3JheSBwYWNrYWdlLWNhcmRfX3ZhbHVlLS1yZWd1bGFyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIC1cbiAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgcGtnLnNlcnZpY2VGZWVcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRDdXJyZW5jeSgpPy5jb2RlIH19XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjdXJyZW50Q3VycmVuY3koKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1jdXJyZW5jeS1jb2RlLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5XT1cImN1cnJlbnRDdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2FwcC1jdXJyZW5jeS1jb2RlLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKHN1cmNoYXJnZUFtb3VudCgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFja2FnZS1jYXJkX19sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIFN1cmNoYXJnZSAoMi41JSlcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFja2FnZS1jYXJkX192YWx1ZSBwYWNrYWdlLWNhcmRfX3ZhbHVlLS1ncmF5IHBhY2thZ2UtY2FyZF9fdmFsdWUtLXJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXJjaGFyZ2VBbW91bnQoKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudEN1cnJlbmN5KCk/LmNvZGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRDdXJyZW5jeSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWN1cnJlbmN5LWNvZGUtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiY3VycmVudEN1cnJlbmN5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYXBwLWN1cnJlbmN5LWNvZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS0gQWRkLU9ucyBSZWZ1bmQgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgICAgQGlmIChnaWZ0c0RldGFpbHMoKS5sZW5ndGggPiAwICYmIGkgPT09IHBhY2thZ2VzKCk/Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkb25zLXJlZnVuZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX2xhYmVsIHBhY2thZ2UtY2FyZF9fbGFiZWwtLWRhcmstbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBBZGQtT25zIFJlZnVuZFxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZG9ucy1yZWZ1bmRfX2xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZ2lmdCBvZiBnaWZ0c0RldGFpbHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fbGFiZWxcIj57eyBnaWZ0Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhY2thZ2UtY2FyZF9fdmFsdWUgcGFja2FnZS1jYXJkX192YWx1ZS0tZ3JheSBwYWNrYWdlLWNhcmRfX3ZhbHVlLS1yZWd1bGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZ0LnRvQmVSZWZ1bmRlZEFtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleGNoYW5nZV9yb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2VDdXJyZW5jeUNvZGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRDdXJyZW5jeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY3VycmVudEN1cnJlbmN5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWN1cnJlbmN5LWNvZGUtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5XT1cImN1cnJlbnRDdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9hcHAtY3VycmVuY3ktY29kZS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQGlmICghZ2lmdC5yZWZ1bmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+IC0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPCEtLSBAaWYgKGdpZnRzSGFzUmVmdW5kYWJsZUVudGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRvbnMtcmVmdW5kX19ub3RpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3k9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHI9XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDlWMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjYuNVwiIHI9XCIwLjc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGRvbnMtcmVmdW5kX19ub3RpY2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhZGQtb24gc2VydmljZS9zIHJlZnVuZCB3aWxsIGJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5IGJ5IG91ciBDdXN0b21lciBTZXJ2aWNlIHRlYW0gc2hvcnRseS5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfSAtLT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEVuZCBleHBhbmRhYmxlIGNvbnRlbnQgLS0+XG5cbiAgICAgICAgICAgIDwhLS0gWW91IHdpbGwgZ2V0IGJhY2sgcm93IC0gQUxXQVlTIFZJU0lCTEUgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1jYXJkX19kZXRhaWxzXCI+XG4gICAgICAgICAgICAgIEBpZiAocGtnLmNhbmNlbGxlZEJlZm9yZSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3JvdyBwYWNrYWdlLWNhcmRfX3Jvdy0tdG90YWxcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFja2FnZS1jYXJkX19sYWJlbCBwYWNrYWdlLWNhcmRfX2xhYmVsLS1kYXJrXCI+UmVmdW5kZWQgYW1vdW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3ZhbHVlIHBhY2thZ2UtY2FyZF9fdmFsdWUtLWhpZ2hsaWdodFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcGtnLnJlZnVuZFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50Q3VycmVuY3koKT8uY29kZSB9fVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRDdXJyZW5jeSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC1jdXJyZW5jeS1jb2RlLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW50Q3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYXBwLWN1cnJlbmN5LWNvZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFja2FnZS1jYXJkX19yb3cgcGFja2FnZS1jYXJkX19yb3ctLXRvdGFsXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhY2thZ2UtY2FyZF9fbGFiZWwgcGFja2FnZS1jYXJkX19sYWJlbC0tZGFya1wiPllvdSB3aWxsIGdldCBiYWNrPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWNrYWdlLWNhcmRfX3ZhbHVlIHBhY2thZ2UtY2FyZF9fdmFsdWUtLWhpZ2hsaWdodCBwYWNrYWdlLWNhcmRfX3ZhbHVlLS1yZWd1bGFyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICBwa2cucmVmdW5kXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRDdXJyZW5jeSgpPy5jb2RlIH19XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY3VycmVudEN1cnJlbmN5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXBwLWN1cnJlbmN5LWNvZGUtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5XT1cImN1cnJlbnRDdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9hcHAtY3VycmVuY3ktY29kZS1pY29uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwic2VwZXJhdG9yXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLXN1bW1hcnlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLXN1bW1hcnlfX3Jvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtc3VtbWFyeV9fbGFiZWxcIj5Ub3RhbCBwYWlkPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtc3VtbWFyeV9fdmFsdWVcIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIHRvdGFsUGFpZCgpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAge3sgY3VycmVudEN1cnJlbmN5KCk/LmNvZGUgfX1cbiAgICAgICAgICAgIEBpZiAoY3VycmVudEN1cnJlbmN5KCkpIHtcbiAgICAgICAgICAgICAgPGFwcC1jdXJyZW5jeS1jb2RlLWljb25cbiAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiY3VycmVudEN1cnJlbmN5KClcIlxuICAgICAgICAgICAgICA+PC9hcHAtY3VycmVuY3ktY29kZS1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChhbHJlYWR5UmVmdW5kZWQoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1zdW1tYXJ5X19yb3dcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtc3VtbWFyeV9fbGFiZWxcIj5Sb29tcyBSZWZ1bmRlZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtc3VtbWFyeV9fdmFsdWVcIj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICBhbHJlYWR5UmVmdW5kZWQoKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB7eyBjdXJyZW50Q3VycmVuY3koKT8uY29kZSB9fVxuICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRDdXJyZW5jeSgpKSB7XG4gICAgICAgICAgICAgICAgPGFwcC1jdXJyZW5jeS1jb2RlLWljb25cbiAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW50Q3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgPjwvYXBwLWN1cnJlbmN5LWNvZGUtaWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLXN1bW1hcnlfX3JvdyB0b3RhbC1zdW1tYXJ5X19yb3ctLWhpZ2hsaWdodFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1zdW1tYXJ5X19sYWJlbCB0b3RhbC1zdW1tYXJ5X19sYWJlbC0taGlnaGxpZ2h0XCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgWW91J2xsIGdldCBiYWNrIGZvclxuICAgICAgICAgICAgICB7eyBjdXJyZW50UmVmdW5kUm9vbXNOdW1iZXIoKSB9fVxuICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMYW5nKCkgIT09ICdhcidcbiAgICAgICAgICAgICAgICAgID8gY3VycmVudFJlZnVuZFJvb21zTnVtYmVyKCkgPiAxXG4gICAgICAgICAgICAgICAgICAgID8gKCdSb29tcycpXG4gICAgICAgICAgICAgICAgICAgIDogKCdSb29tJylcbiAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXN1bW1hcnlfX3ZhbHVlIHRvdGFsLXN1bW1hcnlfX3ZhbHVlLS1oaWdobGlnaHRcIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIHRvdGFsUmVmdW5kKClcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7eyBjdXJyZW50Q3VycmVuY3koKT8uY29kZSB9fVxuICAgICAgICAgICAgQGlmIChjdXJyZW50Q3VycmVuY3koKSkge1xuICAgICAgICAgICAgICA8YXBwLWN1cnJlbmN5LWNvZGUtaWNvblxuICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW50Q3VycmVuY3koKVwiXG4gICAgICAgICAgICAgID48L2FwcC1jdXJyZW5jeS1jb2RlLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5mby1iYW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tYmFubmVyX19pY29uXCI+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyMFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTAgMkwzIDVWOUMzIDEzLjU1IDYuMjQgMTcuNzQgMTAgMTguNUMxMy43NiAxNy43NCAxNyAxMy41NSAxNyA5VjVMMTAgMlpcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNNyAxMEw5IDEyTDEzIDhcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJhbm5lcl9fY29udGVudFwiPlxuICAgICAgICAgIEBpZiAocGF5bWVudE1ldGhvZCgpID09PSAnQ0gnKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImluZm8tYmFubmVyX190ZXh0XCI+XG4gICAgICAgICAgICAgIFlvdXIgcmVmdW5kIGlzIGluc3RhbnQgZnJvbSBvdXIgc2lkZSwgeW91ciBiYW5rIG1heSB0YWtlIHVwIHRvIDE1IGJ1c2luZXNzIGRheXMgdG8gcmVmbGVjdCBpdC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChwYXltZW50TWV0aG9kKCkgPT09ICdUQicpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5mby1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgICAgWW91ciByZWZ1bmQgd2lsbCBiZSBwcm9jZXNzZWQgdG8gVGFiYnkgd2l0aGluIDMtNSBidXNpbmVzcyBkYXlzLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKHBheW1lbnRNZXRob2QoKSA9PT0gJ1RNJykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbmZvLWJhbm5lcl9fdGV4dFwiPlxuICAgICAgICAgICAgICBZb3VyIHJlZnVuZCB3aWxsIGJlIHByb2Nlc3NlZCB0byBUYW1hcmEgd2l0aGluIDctMTAgYnVzaW5lc3MgZGF5cy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaW5mby1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICAgICAgWW91ciBsb3lhbHR5IHBvaW50cyB3aWxsIGJlIHJlZnVuZGVkIGluc3RhbnRseSB0byB5b3VyIGFjY291bnQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPHAgY2xhc3M9XCJpbmZvLWJhbm5lcl9fc3VidGV4dFwiPlxuICAgICAgICAgICAgWW91IGNhbiBzZWxlY3QgcmVmdW5kIG9wdGlvbiBpbiB0aGUgbmV4dCBzdGVwXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJlZnVuZC1zdW1tYXJ5X19mb290ZXJcIj5cbiAgICAgIEBpZiAodG90YWxSZWZ1bmQoKSkge1xuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi0tc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbktlZXBSb29tKClcIj5cbiAgICAgICAgICBLZWVwIFJvb21cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tLXByaW1hcnlcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdFJlZnVuZE9wdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgIFNlbGVjdCByZWZ1bmQgb3B0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tLWRhbmdlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzQ2FuY2VsTG9hZGluZygpXCJcbiAgICAgICAgICAoY2xpY2spPVwic3VibWl0RGF0YSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoaXNDYW5jZWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuX19zcGlubmVyXCI+PC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQ2FuY2VsIEJvb2tpbmdcbiAgICAgICAgICB9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPCEtLSBDb25maXJtIE1vZGFsIC0tPlxuQGlmIChzaG93Q29uZmlybU1vZGFsRmxhZygpKSB7XG4gIDxkaXZcbiAgICBhbG1hdGFyLWNvbmZpcm0tbW9kYWxcbiAgICBbTWVzc2FnZV09XCInWW91ciByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZC4gT3VyIGN1c3RvbWVyIHNlcnZpY2UgdGVhbSB3aWxsIGNvbnRhY3QgeW91IHNob3J0bHkuJ1wiXG4gICAgKGNhbmNlbEV2ZW50KT1cImNsb3NlQWxsTW9kYWxzKClcIlxuICAgIChjb25maXJtRXZlbnQpPVwiY2xvc2VBbGxNb2RhbHMoKVwiXG4gID48L2Rpdj5cbn1cblxuPCEtLSBFcnJvciBNb2RhbCAtLT5cbkBpZiAoc2hvd0Vycm9yTW9kYWxGbGFnKCkpIHtcbiAgPGRpdlxuICAgIGFsbWF0YXItbWFuYWdlLWJvb2tpbmctZmFpbGVkLW1vZGFsXG4gICAgW2Vycm9yTWVzc2FnZV09XCJob3RlbE1hbmFnZUVycm9yKClcIlxuICAgIChjYW5jZWxFdmVudCk9XCJjbG9zZUFsbE1vZGFscygpXCJcbiAgICAoY29uZmlybUV2ZW50KT1cImNsb3NlQWxsTW9kYWxzKClcIlxuICA+PC9kaXY+XG59XG4iXX0=
|