simpo-component-library 3.6.485 → 3.6.486

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/esm2022/lib/directive/background-directive.mjs +31 -36
  2. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
  3. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +38 -165
  4. package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +409 -0
  5. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +27 -28
  6. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +3 -3
  7. package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +3 -3
  8. package/esm2022/lib/sections/new-services/new-services.component.mjs +5 -18
  9. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
  10. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  11. package/esm2022/public-api.mjs +2 -1
  12. package/fesm2022/simpo-component-library.mjs +568 -321
  13. package/fesm2022/simpo-component-library.mjs.map +1 -1
  14. package/lib/directive/background-directive.d.ts +0 -1
  15. package/lib/elements/text-editor/text-editor.component.d.ts +0 -10
  16. package/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.d.ts +69 -0
  17. package/lib/sections/appointment-form/appointment-form.component.d.ts +3 -1
  18. package/lib/sections/new-services/new-services.component.d.ts +0 -2
  19. package/package.json +1 -1
  20. package/public-api.d.ts +1 -0
  21. package/simpo-component-library-3.6.486.tgz +0 -0
  22. package/simpo-component-library-3.6.485.tgz +0 -0
@@ -0,0 +1,409 @@
1
+ import { Component, HostListener } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { CdkDragPlaceholder } from "@angular/cdk/drag-drop";
4
+ import { MatIcon } from "@angular/material/icon";
5
+ import { FormsModule } from '@angular/forms';
6
+ import { MatFormFieldModule } from "@angular/material/form-field";
7
+ import { MatDatepickerModule } from "@angular/material/datepicker";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@simpo-ui/services/rest.service";
10
+ import * as i2 from "../../../../services/events.service";
11
+ import * as i3 from "@angular/material/dialog";
12
+ import * as i4 from "@angular/material/snack-bar";
13
+ import * as i5 from "@angular/common";
14
+ import * as i6 from "@angular/material/datepicker";
15
+ import * as i7 from "@angular/forms";
16
+ export class AppointmentBookingComponent {
17
+ constructor(restService, _eventService, matDialog, snackBar) {
18
+ this.restService = restService;
19
+ this._eventService = _eventService;
20
+ this.matDialog = matDialog;
21
+ this.snackBar = snackBar;
22
+ this.accessedTabs = {
23
+ serviceListing: false,
24
+ locationListing: false,
25
+ staffListing: false
26
+ };
27
+ this.businessName = localStorage.getItem('bName') ?? "";
28
+ this.businessId = localStorage.getItem('bId') ?? "";
29
+ this.activeButton = false;
30
+ this.selectedTab = '';
31
+ this.barWidth = '';
32
+ this.showCancellationPolicy = false;
33
+ this.showReducingPolicy = false;
34
+ this.selectedService = {};
35
+ this.Object = Object;
36
+ this.showCalendar = false;
37
+ this.selectedDate = null;
38
+ this.selectedDateStr = '';
39
+ this.userDetails = {
40
+ name: '',
41
+ email: '',
42
+ mobileNumber: ''
43
+ };
44
+ this.serviceData = [];
45
+ this.locationData = [];
46
+ this.staffPayload = {
47
+ serviceId: '',
48
+ storeId: '',
49
+ businessId: ''
50
+ };
51
+ this.staffData = [];
52
+ this.slotsPayload = {
53
+ storeId: "",
54
+ serviceId: "",
55
+ businessId: "",
56
+ bookingDate: ""
57
+ };
58
+ this.locationTiming = [];
59
+ this.loader = false;
60
+ this.appointmentPayload = {
61
+ staffDetail: {
62
+ id: '',
63
+ name: ''
64
+ },
65
+ bookingDate: '',
66
+ startTime: '',
67
+ customerDetail: {
68
+ name: '',
69
+ phoneNumber: '',
70
+ email: ''
71
+ },
72
+ serviceDetail: {
73
+ id: '',
74
+ name: ''
75
+ },
76
+ storeId: '',
77
+ businessId: this.businessId
78
+ };
79
+ this.apiStatus = false;
80
+ }
81
+ ngOnInit() {
82
+ this.getAllServices();
83
+ }
84
+ closeOnOutsideClick() {
85
+ this.showCalendar = false;
86
+ }
87
+ toggleCalendar(event) {
88
+ if (event)
89
+ event.stopPropagation();
90
+ this.showCalendar = !this.showCalendar;
91
+ }
92
+ onDateSelected(date) {
93
+ this.selectedDate = date;
94
+ this.selectedDateStr = this.formatDate(date);
95
+ this.showCalendar = false;
96
+ this.getAvailableSlots();
97
+ }
98
+ formatDate(d) {
99
+ const dd = String(d.getDate()).padStart(2, '0');
100
+ const mm = String(d.getMonth() + 1).padStart(2, '0');
101
+ const yyyy = d.getFullYear();
102
+ return `${dd}-${mm}-${yyyy}`;
103
+ }
104
+ selectService(service) {
105
+ service.selected = true;
106
+ if (this.selectedService) {
107
+ this.selectedService.selected = false;
108
+ }
109
+ this.selectedService = service;
110
+ this.activeButton = this.selectedService ? true : false;
111
+ }
112
+ selectLocation(location) {
113
+ location.selected = true;
114
+ if (this.selectedLocation) {
115
+ this.selectedLocation.selected = false;
116
+ }
117
+ this.activeButton = true;
118
+ this.selectedLocation = location;
119
+ }
120
+ selectStaff(staff) {
121
+ this.selectedStaff = staff;
122
+ this.activeButton = true;
123
+ }
124
+ nextStep() {
125
+ if (this.selectedTab === 'serviceListing') {
126
+ this.activeButton = this.selectedLocation ? true : false;
127
+ this.accessedTabs.serviceListing = true;
128
+ if (!this.activeButton) {
129
+ this.getAllLocations();
130
+ }
131
+ else {
132
+ if (this.accessedTabs.locationListing) {
133
+ this.selectedTab = 'locationListing';
134
+ this.barWidth = '29.28';
135
+ }
136
+ else if (this.accessedTabs.staffListing) {
137
+ this.selectedTab = 'staffListing';
138
+ this.barWidth = '43.57';
139
+ }
140
+ else {
141
+ this.selectedTab = 'dateSelection';
142
+ this.barWidth = '58.57';
143
+ }
144
+ }
145
+ }
146
+ else if (this.selectedTab === 'locationListing') {
147
+ this.activeButton = this.selectedStaff ? true : false;
148
+ this.accessedTabs.locationListing = true;
149
+ if (!this.activeButton) {
150
+ this.getAllStaff();
151
+ }
152
+ else {
153
+ if (this.accessedTabs.staffListing) {
154
+ this.selectedTab = 'staffListing';
155
+ this.barWidth = '43.57';
156
+ }
157
+ else {
158
+ this.selectedTab = 'dateSelection';
159
+ this.barWidth = '58.57';
160
+ }
161
+ }
162
+ }
163
+ else if (this.selectedTab === 'staffListing') {
164
+ this.accessedTabs.staffListing = true;
165
+ this.selectedTab = 'dateSelection';
166
+ this.barWidth = '58.57';
167
+ if (!this.activeButton)
168
+ this.getAvailableSlots();
169
+ }
170
+ else if (this.selectedTab === 'dateSelection') {
171
+ this.activeButton = this.selectedDateStr && this.selectedTime ? true : false;
172
+ this.selectedTab = 'contactDetails';
173
+ this.barWidth = '70.57';
174
+ }
175
+ else if (this.selectedTab === 'contactDetails') {
176
+ this.checkRequiredValues();
177
+ this.selectedTab = 'paymentTab';
178
+ this.barWidth = '85.57';
179
+ }
180
+ }
181
+ previousStep() {
182
+ this.activeButton = true;
183
+ if (this.selectedTab === 'locationListing') {
184
+ if (this.accessedTabs.serviceListing) {
185
+ this.selectedTab = 'serviceListing';
186
+ this.barWidth = '14.28';
187
+ }
188
+ }
189
+ else if (this.selectedTab === 'staffListing') {
190
+ if (this.accessedTabs.locationListing) {
191
+ this.selectedTab = 'locationListing';
192
+ this.barWidth = '29.28';
193
+ }
194
+ else if (this.accessedTabs.serviceListing) {
195
+ this.selectedTab = 'serviceListing';
196
+ this.barWidth = '14.28';
197
+ }
198
+ }
199
+ else if (this.selectedTab === 'dateSelection') {
200
+ if (this.accessedTabs.staffListing) {
201
+ this.selectedTab = 'staffListing';
202
+ this.barWidth = '43.57';
203
+ }
204
+ else if (this.accessedTabs.locationListing) {
205
+ this.selectedTab = 'locationListing';
206
+ this.barWidth = '29.28';
207
+ }
208
+ else if (this.accessedTabs.serviceListing) {
209
+ this.selectedTab = 'serviceListing';
210
+ this.barWidth = '14.28';
211
+ }
212
+ }
213
+ else if (this.selectedTab === 'contactDetails') {
214
+ this.selectedTab = 'dateSelection';
215
+ this.barWidth = '58.57';
216
+ }
217
+ else if (this.selectedTab === 'paymentTab') {
218
+ this.selectedTab = 'contactDetails';
219
+ this.barWidth = '70.57';
220
+ }
221
+ }
222
+ getAllServices() {
223
+ let servicePayload = {
224
+ businessId: this.businessId ?? "",
225
+ pageNo: 0,
226
+ size: 100
227
+ };
228
+ this.restService.getAllAppointmentService(servicePayload).subscribe((res) => {
229
+ if (res.content.length > 0) {
230
+ this.serviceData = res.content.filter((service) => service.active === true);
231
+ this.serviceData.forEach(service => service.selected = false);
232
+ console.log(this.serviceData);
233
+ if (this.serviceData.length === 1 && !this.activeButton) {
234
+ this.selectedService = this.serviceData[0];
235
+ this.getAllLocations();
236
+ }
237
+ else {
238
+ this.selectedTab = 'serviceListing';
239
+ this.barWidth = '14.28';
240
+ }
241
+ }
242
+ }, (error) => {
243
+ // Handle errors gracefully
244
+ });
245
+ }
246
+ getAllLocations() {
247
+ this.loader = true;
248
+ this.locationData = [];
249
+ let payload = { businessId: this.businessId ?? "" };
250
+ this.restService.getAllStores(payload).subscribe((res) => {
251
+ if (res.data.data.length > 0) {
252
+ let locations = res.data.data.filter((store) => { return store.status === 'ACTIVE'; });
253
+ locations.forEach((location) => {
254
+ if (this.selectedService.storeIds.includes(location.id)) {
255
+ location.selected = false;
256
+ this.locationData.push(location);
257
+ }
258
+ });
259
+ if (this.locationData.length === 1 && !this.activeButton) {
260
+ this.selectedLocation = this.locationData[0];
261
+ this.loader = false;
262
+ this.getAllStaff();
263
+ }
264
+ else {
265
+ this.loader = false;
266
+ this.selectedTab = 'locationListing';
267
+ this.barWidth = '29.28';
268
+ }
269
+ }
270
+ }, (error) => {
271
+ // Handle errors gracefully
272
+ });
273
+ }
274
+ getAllStaff() {
275
+ this.loader = true;
276
+ this.staffPayload.storeId = this.selectedLocation?.id ?? "";
277
+ this.staffPayload.serviceId = this.selectedService?.serviceId ? this.selectedService.serviceId : '';
278
+ this.staffPayload.businessId = this.businessId ?? "";
279
+ this.restService.getAllStaff(this.staffPayload).subscribe((res) => {
280
+ if (res.length > 0) {
281
+ this.staffData = res.filter((staff) => staff.active === true);
282
+ if (this.staffData.length === 1 && !this.activeButton) {
283
+ this.loader = false;
284
+ this.selectedTab = 'dateSelection';
285
+ this.barWidth = '58.57';
286
+ this.selectedStaff = this.staffData[0];
287
+ this.getAvailableSlots();
288
+ }
289
+ else if (this.staffData.length > 1) {
290
+ this.loader = false;
291
+ this.selectedTab = 'staffListing';
292
+ this.barWidth = '43.57';
293
+ }
294
+ }
295
+ }, (error) => {
296
+ // Handle errors gracefully
297
+ });
298
+ }
299
+ convertTo24Hour(time) {
300
+ const [hourMin, modifierRaw] = time.split(' ');
301
+ const modifier = modifierRaw.toUpperCase(); // "AM" or "PM"
302
+ let [hours, minutes] = hourMin.split(':').map(Number);
303
+ if (modifier === 'PM' && hours < 12) {
304
+ hours += 12;
305
+ }
306
+ if (modifier === 'AM' && hours === 12) {
307
+ hours = 0;
308
+ }
309
+ const hh = hours.toString().padStart(2, '0');
310
+ const mm = minutes.toString().padStart(2, '0');
311
+ return `${hh}:${mm} ${modifier}`;
312
+ }
313
+ getAvailableSlots() {
314
+ this.loader = false;
315
+ this.locationTiming = [];
316
+ this.slotsPayload.storeId = this.selectedLocation?.id ?? "";
317
+ this.slotsPayload.serviceId = this.selectedService?.serviceId ? this.selectedService.serviceId : '';
318
+ this.slotsPayload.businessId = this.businessId ?? "";
319
+ const date = this.selectedDate ?? new Date();
320
+ this.selectedDateStr = this.formatDate(date);
321
+ const yyyy = date.getFullYear();
322
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
323
+ const dd = String(date.getDate()).padStart(2, '0');
324
+ this.slotsPayload.bookingDate = `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
325
+ if (this.selectedStaff)
326
+ this.slotsPayload.staffId = this.selectedStaff.staffId;
327
+ this.restService.getBookingSlots(this.slotsPayload).subscribe((res) => {
328
+ res.forEach((time) => {
329
+ this.locationTiming.push({ selected: false, value: this.convertTo24Hour(time) });
330
+ });
331
+ });
332
+ }
333
+ selectTimeSlot(time) {
334
+ time.selected = true;
335
+ if (this.selectedTime) {
336
+ this.selectedTime.selected = false;
337
+ }
338
+ this.selectedTime = time;
339
+ this.activeButton = true;
340
+ }
341
+ checkRequiredValues() {
342
+ if (this.appointmentPayload.customerDetail.name && this.appointmentPayload.customerDetail.email && this.appointmentPayload.customerDetail.phoneNumber) {
343
+ this.activeButton = true;
344
+ console.log(this.selectedService, this.selectedLocation, this.selectedStaff, this.selectedDate, this.selectedTime, this.userDetails);
345
+ }
346
+ }
347
+ checkPayment() {
348
+ // if (this.selectedService?.depositAmount?.depositRequired) {
349
+ // this.paymentBookingAppointment();
350
+ // } else {
351
+ // this.createAppointment();
352
+ // }
353
+ this.createAppointment();
354
+ }
355
+ createAppointment() {
356
+ const date = this.selectedDate ?? new Date();
357
+ const yyyy = date.getFullYear();
358
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
359
+ const dd = String(date.getDate()).padStart(2, '0');
360
+ this.appointmentPayload.staffDetail.id = this.selectedStaff.staffId;
361
+ this.appointmentPayload.staffDetail.name = this.selectedStaff.staffName;
362
+ this.appointmentPayload.storeId = this.selectedLocation.id;
363
+ this.appointmentPayload.serviceDetail.id = this.selectedService.serviceId;
364
+ this.appointmentPayload.serviceDetail.name = this.selectedService.name;
365
+ this.appointmentPayload.startTime = this.selectedTime.value.slice(0, 5);
366
+ this.appointmentPayload.bookingDate = `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
367
+ this.restService.bookAppointmentV2(this.appointmentPayload).subscribe((res) => {
368
+ this.snackBar.open('Appointment booked successfully', 'close', { duration: 2000 });
369
+ this.selectedTab = 'statusTemplate';
370
+ this.barWidth = '100';
371
+ this.apiStatus = true;
372
+ }, (error) => {
373
+ this.apiStatus = false;
374
+ this.snackBar.open('Failed to book appointment', 'close', { duration: 2000 });
375
+ });
376
+ }
377
+ paymentBookingAppointment() {
378
+ const date = this.selectedDate ?? new Date();
379
+ const yyyy = date.getFullYear();
380
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
381
+ const dd = String(date.getDate()).padStart(2, '0');
382
+ this.appointmentPayload.staffDetail.id = this.selectedStaff.staffId;
383
+ this.appointmentPayload.staffDetail.name = this.selectedStaff.staffName;
384
+ this.appointmentPayload.storeId = this.selectedLocation.id;
385
+ this.appointmentPayload.serviceDetail.id = this.selectedService.serviceId;
386
+ this.appointmentPayload.serviceDetail.name = this.selectedService.name;
387
+ this.appointmentPayload.startTime = this.selectedTime.value.slice(0, 5);
388
+ this.appointmentPayload.bookingDate = `${yyyy}-${mm}-${dd}T00:00:00.000Z`;
389
+ this.restService.paymentForAppointment(this.appointmentPayload).subscribe((res) => {
390
+ this._eventService.cashFreeEvent.emit(res.data);
391
+ }, (error) => {
392
+ this.snackBar.open('Failed to book appointment please select another time slot', 'close', { duration: 2000 });
393
+ this.loader = false;
394
+ });
395
+ }
396
+ goBack() {
397
+ this.matDialog.closeAll();
398
+ }
399
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, deps: [{ token: i1.RestService }, { token: i2.EventsService }, { token: i3.MatDialog }, { token: i4.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
400
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppointmentBookingComponent, isStandalone: true, selector: "simpo-appointment-booking", host: { listeners: { "document:click": "closeOnOutsideClick()" } }, ngImport: i0, template: "<section class=\"main_section\">\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span>Back to My Bookings</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\r\n <div class=\"footer-buttons\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"complete_booking cursor-pointer\" *ngIf=\"selectedTab==='paymentTab'\"\r\n (click)=\"checkPayment()\">Complete Booking</button>\r\n </div>\r\n </div>\r\n</section>\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service you'd like to book</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n <div class=\"service-category\">Wellness</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83D\uDC64</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">General Consultation</div>\r\n <div class=\"service-category\">Medical</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9800</div>\r\n <div class=\"service-duration\">30 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Comprehensive health consultation\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83E\uDDE0</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Mental Health Counseling</div>\r\n <div class=\"service-category\">Mental Health</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91500</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional psychological support\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\u2702</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Hair Cut & Styling</div>\r\n <div class=\"service-category\">Beauty</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91200</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional hair cutting and styling\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #locationListing>\r\n <div class=\"location_header\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div>\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon branch-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Branch Clinic</h3>\r\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">5.8 km</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon home-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Home Visit</h3>\r\n <p>Your Location</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">0 km</div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <!-- Header Section -->\r\n <div class=\"staff-header mb-3\">\r\n <h1 class=\"mb-1\">Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <!-- Staff Cards -->\r\n <div class=\"d-flex flex-column gap-4 staff-list\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <div class=\" staff-card card rounded-3 p-4\" (click)=\"selectStaff(staff)\">\r\n <div class=\"d-flex align-items-start justify-content-between\">\r\n <div class=\"d-flex align-items-start flex-grow-1\">\r\n <div\r\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,3).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\r\n <p class=\"staff-specialty\">General Medicine</p>\r\n <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\r\n general\r\n medicine and wellness care.</p>\r\n </div>\r\n </div>\r\n <div class=\"rating-section\">\r\n <div class=\"star-rating d-flex align-items-center\">\r\n <span class=\"star-icon\"></span>\r\n <span class=\"rating-number\">4.9</span>\r\n </div>\r\n <div class=\"review-count\">156 reviews</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #dateSelection>\r\n <div class=\"w-60\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1 class=\"mb-3\">Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"d-flex gap-4 main_container\">\r\n <!-- Left Column - Date Selection -->\r\n <div class=\"w-50\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"form-control date-input border-0 rounded-2\"\r\n placeholder=\"dd-mm-yyyy\" [value]=\"selectedDateStr\" readonly\r\n (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" (selectedChange)=\"onDateSelected($event)\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Column - Time Selection -->\r\n <div class=\"w-50\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n\r\n <!-- Time Slots Grid -->\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectTimeSlot(time)\">{{time ?\r\n time?.value.slice(0,5) : 'N/A'}}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Waitlist Section -->\r\n <div class=\"waitlist-section rounded-3\">\r\n <div class=\"d-flex align-items-start\">\r\n <div class=\"d-flex h-100 justify-content-between flex-column\"><span\r\n class=\"waitlist-icon check-icon\"></span>\r\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"flexCheckChecked\">\r\n </div>\r\n <div>\r\n <div class=\"waitlist-title\">No slots available?</div>\r\n <div class=\"waitlist-description\">\r\n Add me to the waitlist for earlier\r\n availability\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n<ng-template #contactDetails>\r\n <div class=\"w-60\">\r\n <div class=\"d-flex\">\r\n <div class=\"h-100 w-100\">\r\n <!-- Header Section -->\r\n <div class=\"contact-header mb-2\">\r\n <h1 class=\"mb-0\">Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <!-- Form Sections -->\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <!-- Left Column - Personal Information -->\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"w-50\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <!-- Full Name -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n\r\n <!-- Email Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n\r\n <!-- Phone Number -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Right Column - Home Visit Details -->\r\n <div class=\"w-50\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <!-- Home Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Home Address\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Enter your complete address\"></textarea>\r\n </div>\r\n\r\n <!-- Special Instructions -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Special Instructions\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\">\r\n <!-- Header -->\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <!-- Policy Items -->\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <!-- Cancellation Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span>&#8226; Free cancellation up to 24 hours before appointment</span>\r\n <span>&#8226; 50% charge for cancellations within 24 hours</span>\r\n <span>&#8226; No refund for no-shows</span>\r\n <span>&#8226; Emergency cancellations will be reviewed case by case</span>\r\n </div>\r\n\r\n <!-- Rescheduling Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span>&#8226; Free cancellation up to 24 hours before appointment</span>\r\n <span>&#8226; 50% charge for cancellations within 24 hours</span>\r\n <span>&#8226; No refund for no-shows</span>\r\n <span>&#8226; Emergency cancellations will be reviewed case by case</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Acceptance Section -->\r\n <div class=\"acceptance-section\">\r\n <div class=\"custom-checkbox\"></div>\r\n <p class=\"acceptance-text\">\r\n I understand and accept the cancellation & rescheduling policies and\r\n <a href=\"#\" class=\"terms-link\">Terms & Conditions<span\r\n class=\"external-link-icon\"></span></a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #paymentTab>\r\n <div class=\"w-60\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <!-- Header Section -->\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1 class=\"mb-0\">Payment & Confirmation</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\r\n </div>\r\n\r\n <!-- Booking Summary Card -->\r\n <div class=\"booking-summary-card w-50\">\r\n <h2 class=\"summary-title\">Booking Summary</h2>\r\n\r\n <!-- Service -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Service</div>\r\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Professional -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Location -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\r\n </div>\r\n </div>\r\n\r\n <!-- Date & Time -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDate ? (selectedDate | date : 'shortData') :\r\n (selectedDateStr ? (selectedDateStr) : 'N/A')}} at\r\n 15:30</div>\r\n </div>\r\n\r\n <!-- Duration -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Duration</div>\r\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\r\n minutes</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Tax Percent</div>\r\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\r\n selectedService?.priceDetails?.taxPercent : 'N/A'}}%</div>\r\n </div>\r\n <!-- Total -->\r\n <div class=\"summary-row total-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\">\r\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.price ?\r\n selectedService?.priceDetails?.price : 'N/A'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <!-- Success Icon -->\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Details Card -->\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Service</span>\r\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\r\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\r\n </div>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Professional</span>\r\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\r\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Date & Time</span>\r\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\r\n appointmentPayload.bookingDate.slice(0,8) :\r\n 'N/A'}} at\r\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Action Buttons -->\r\n <!-- <div class=\"action-buttons\">\r\n <button class=\"btn btn-outline\">View My Bookings</button>\r\n <button class=\"btn btn-primary\">Back to Admin</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_header{padding:1%}.main_body{height:73vh}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection{height:100%;overflow:hidden}.service-selection h2{font-size:20px;font-weight:600;margin-bottom:8px}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid black}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;overflow-x:scroll;height:87%;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;padding-top:20px;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_header{width:60%;overflow:hidden}.location_header .header h1{font-size:20px;font-weight:600;margin-bottom:.25rem}.location_header .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease;padding-bottom:2rem!important}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card.selected{border-color:#666}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:0!important}.main_container{height:64vh}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:30%}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:gray;border:none;padding:20px;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px;margin-right:8px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.waitlist-description{color:#aaa;font-size:14px;margin-bottom:0}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:2%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:65vh;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:12px;margin-top:8px}.custom-checkbox{width:20px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#90ee90;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px}.datepicker-popover{position:absolute;top:0;left:0;z-index:1000;background:#fff;border-radius:.5rem;box-shadow:0 6px 24px #0000001f;overflow:hidden}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i6.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
401
+ }
402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, decorators: [{
403
+ type: Component,
404
+ args: [{ selector: 'simpo-appointment-booking', standalone: true, imports: [CdkDragPlaceholder, CommonModule, MatIcon, MatFormFieldModule, MatDatepickerModule, FormsModule], template: "<section class=\"main_section\">\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span>Back to My Bookings</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\r\n <div class=\"footer-buttons\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"complete_booking cursor-pointer\" *ngIf=\"selectedTab==='paymentTab'\"\r\n (click)=\"checkPayment()\">Complete Booking</button>\r\n </div>\r\n </div>\r\n</section>\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service you'd like to book</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n <div class=\"service-category\">Wellness</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83D\uDC64</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">General Consultation</div>\r\n <div class=\"service-category\">Medical</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9800</div>\r\n <div class=\"service-duration\">30 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Comprehensive health consultation\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83E\uDDE0</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Mental Health Counseling</div>\r\n <div class=\"service-category\">Mental Health</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91500</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional psychological support\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\u2702</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Hair Cut & Styling</div>\r\n <div class=\"service-category\">Beauty</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91200</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional hair cutting and styling\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #locationListing>\r\n <div class=\"location_header\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div>\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon branch-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Branch Clinic</h3>\r\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">5.8 km</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon home-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Home Visit</h3>\r\n <p>Your Location</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">0 km</div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <!-- Header Section -->\r\n <div class=\"staff-header mb-3\">\r\n <h1 class=\"mb-1\">Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <!-- Staff Cards -->\r\n <div class=\"d-flex flex-column gap-4 staff-list\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <div class=\" staff-card card rounded-3 p-4\" (click)=\"selectStaff(staff)\">\r\n <div class=\"d-flex align-items-start justify-content-between\">\r\n <div class=\"d-flex align-items-start flex-grow-1\">\r\n <div\r\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,3).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\r\n <p class=\"staff-specialty\">General Medicine</p>\r\n <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\r\n general\r\n medicine and wellness care.</p>\r\n </div>\r\n </div>\r\n <div class=\"rating-section\">\r\n <div class=\"star-rating d-flex align-items-center\">\r\n <span class=\"star-icon\"></span>\r\n <span class=\"rating-number\">4.9</span>\r\n </div>\r\n <div class=\"review-count\">156 reviews</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #dateSelection>\r\n <div class=\"w-60\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1 class=\"mb-3\">Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"d-flex gap-4 main_container\">\r\n <!-- Left Column - Date Selection -->\r\n <div class=\"w-50\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"form-control date-input border-0 rounded-2\"\r\n placeholder=\"dd-mm-yyyy\" [value]=\"selectedDateStr\" readonly\r\n (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" (selectedChange)=\"onDateSelected($event)\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Column - Time Selection -->\r\n <div class=\"w-50\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n\r\n <!-- Time Slots Grid -->\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectTimeSlot(time)\">{{time ?\r\n time?.value.slice(0,5) : 'N/A'}}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Waitlist Section -->\r\n <div class=\"waitlist-section rounded-3\">\r\n <div class=\"d-flex align-items-start\">\r\n <div class=\"d-flex h-100 justify-content-between flex-column\"><span\r\n class=\"waitlist-icon check-icon\"></span>\r\n <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"flexCheckChecked\">\r\n </div>\r\n <div>\r\n <div class=\"waitlist-title\">No slots available?</div>\r\n <div class=\"waitlist-description\">\r\n Add me to the waitlist for earlier\r\n availability\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n<ng-template #contactDetails>\r\n <div class=\"w-60\">\r\n <div class=\"d-flex\">\r\n <div class=\"h-100 w-100\">\r\n <!-- Header Section -->\r\n <div class=\"contact-header mb-2\">\r\n <h1 class=\"mb-0\">Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <!-- Form Sections -->\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <!-- Left Column - Personal Information -->\r\n <div class=\"d-flex gap-4\">\r\n <div class=\"w-50\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <!-- Full Name -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n\r\n <!-- Email Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n\r\n <!-- Phone Number -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Right Column - Home Visit Details -->\r\n <div class=\"w-50\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <!-- Home Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Home Address\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Enter your complete address\"></textarea>\r\n </div>\r\n\r\n <!-- Special Instructions -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Special Instructions\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\">\r\n <!-- Header -->\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <!-- Policy Items -->\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <!-- Cancellation Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span>&#8226; Free cancellation up to 24 hours before appointment</span>\r\n <span>&#8226; 50% charge for cancellations within 24 hours</span>\r\n <span>&#8226; No refund for no-shows</span>\r\n <span>&#8226; Emergency cancellations will be reviewed case by case</span>\r\n </div>\r\n\r\n <!-- Rescheduling Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span>&#8226; Free cancellation up to 24 hours before appointment</span>\r\n <span>&#8226; 50% charge for cancellations within 24 hours</span>\r\n <span>&#8226; No refund for no-shows</span>\r\n <span>&#8226; Emergency cancellations will be reviewed case by case</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Acceptance Section -->\r\n <div class=\"acceptance-section\">\r\n <div class=\"custom-checkbox\"></div>\r\n <p class=\"acceptance-text\">\r\n I understand and accept the cancellation & rescheduling policies and\r\n <a href=\"#\" class=\"terms-link\">Terms & Conditions<span\r\n class=\"external-link-icon\"></span></a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #paymentTab>\r\n <div class=\"w-60\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <!-- Header Section -->\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1 class=\"mb-0\">Payment & Confirmation</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\r\n </div>\r\n\r\n <!-- Booking Summary Card -->\r\n <div class=\"booking-summary-card w-50\">\r\n <h2 class=\"summary-title\">Booking Summary</h2>\r\n\r\n <!-- Service -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Service</div>\r\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Professional -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Location -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\r\n </div>\r\n </div>\r\n\r\n <!-- Date & Time -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDate ? (selectedDate | date : 'shortData') :\r\n (selectedDateStr ? (selectedDateStr) : 'N/A')}} at\r\n 15:30</div>\r\n </div>\r\n\r\n <!-- Duration -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Duration</div>\r\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\r\n minutes</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Tax Percent</div>\r\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\r\n selectedService?.priceDetails?.taxPercent : 'N/A'}}%</div>\r\n </div>\r\n <!-- Total -->\r\n <div class=\"summary-row total-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\">\r\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.price ?\r\n selectedService?.priceDetails?.price : 'N/A'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <!-- Success Icon -->\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Details Card -->\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Service</span>\r\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\r\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\r\n </div>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Professional</span>\r\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\r\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Date & Time</span>\r\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\r\n appointmentPayload.bookingDate.slice(0,8) :\r\n 'N/A'}} at\r\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Action Buttons -->\r\n <!-- <div class=\"action-buttons\">\r\n <button class=\"btn btn-outline\">View My Bookings</button>\r\n <button class=\"btn btn-primary\">Back to Admin</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_header{padding:1%}.main_body{height:73vh}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection{height:100%;overflow:hidden}.service-selection h2{font-size:20px;font-weight:600;margin-bottom:8px}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid black}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;overflow-x:scroll;height:87%;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;padding-top:20px;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_header{width:60%;overflow:hidden}.location_header .header h1{font-size:20px;font-weight:600;margin-bottom:.25rem}.location_header .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease;padding-bottom:2rem!important}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card.selected{border-color:#666}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:0!important}.main_container{height:64vh}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:30%}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:gray;border:none;padding:20px;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px;margin-right:8px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.waitlist-description{color:#aaa;font-size:14px;margin-bottom:0}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:2%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:65vh;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:12px;margin-top:8px}.custom-checkbox{width:20px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#90ee90;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px}.datepicker-popover{position:absolute;top:0;left:0;z-index:1000;background:#fff;border-radius:.5rem;box-shadow:0 6px 24px #0000001f;overflow:hidden}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}\n"] }]
405
+ }], ctorParameters: () => [{ type: i1.RestService }, { type: i2.EventsService }, { type: i3.MatDialog }, { type: i4.MatSnackBar }], propDecorators: { closeOnOutsideClick: [{
406
+ type: HostListener,
407
+ args: ['document:click']
408
+ }] } });
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZWN0aW9ucy9hcHBvaW50bWVudC1mb3JtL2FwcG9pbnRtZW50LWJvb2tpbmcvYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7QUFhbkUsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxZQUNVLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQ25CLFNBQW9CLEVBQzdCLFFBQXFCO1FBSHJCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDN0IsYUFBUSxH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RSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUM7OEpBaUIxRyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2RrRHJhZ1BsYWNlaG9sZGVyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcclxuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICdAc2ltcG8tdWkvc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1hcHBvaW50bWVudC1ib29raW5nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDZGtEcmFnUGxhY2Vob2xkZXIsIENvbW1vbk1vZHVsZSwgTWF0SWNvbiwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXREYXRlcGlja2VyTW9kdWxlLCBGb3Jtc01vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBvaW50bWVudEJvb2tpbmdDb21wb25lbnQge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXJcclxuICApIHtcclxuXHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5nZXRBbGxTZXJ2aWNlcygpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgY2xvc2VPbk91dHNpZGVDbGljaygpIHtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcbiAgfVxyXG4gIGFjY2Vzc2VkVGFicyA9IHtcclxuICAgIHNlcnZpY2VMaXN0aW5nOiBmYWxzZSxcclxuICAgIGxvY2F0aW9uTGlzdGluZzogZmFsc2UsXHJcbiAgICBzdGFmZkxpc3Rpbmc6IGZhbHNlXHJcbiAgfVxyXG5cclxuICBidXNpbmVzc05hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYk5hbWUnKSA/PyBcIlwiO1xyXG4gIGJ1c2luZXNzSWQ6IHN0cmluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiSWQnKSA/PyBcIlwiO1xyXG4gIGFjdGl2ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkVGFiOiBzdHJpbmcgPSAnJztcclxuICBiYXJXaWR0aDogc3RyaW5nID0gJyc7XHJcbiAgc2hvd0NhbmNlbGxhdGlvblBvbGljeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dSZWR1Y2luZ1BvbGljeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkU2VydmljZTogYW55ID0ge307XHJcbiAgc2VsZWN0ZWRMb2NhdGlvbjogYW55O1xyXG4gIE9iamVjdCA9IE9iamVjdDtcclxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcclxuICBzZWxlY3RlZERhdGVTdHIgPSAnJztcclxuICB1c2VyRGV0YWlscyA9IHtcclxuICAgIG5hbWU6ICcnLFxyXG4gICAgZW1haWw6ICcnLFxyXG4gICAgbW9iaWxlTnVtYmVyOiAnJ1xyXG4gIH1cclxuXHJcblxyXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9ICF0aGlzLnNob3dDYWxlbmRhcjtcclxuICB9XHJcblxyXG4gIG9uRGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpO1xyXG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuICAgIHRoaXMuZ2V0QXZhaWxhYmxlU2xvdHMoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBtbSA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgeXl5eSA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgIHJldHVybiBgJHtkZH0tJHttbX0tJHt5eXl5fWA7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTZXJ2aWNlKHNlcnZpY2U6IGFueSkge1xyXG4gICAgc2VydmljZS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlID0gc2VydmljZVxyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnNlbGVjdGVkU2VydmljZSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgc2VsZWN0TG9jYXRpb24obG9jYXRpb246IGFueSkge1xyXG4gICAgbG9jYXRpb24uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG4gIH1cclxuICBzZWxlY3RlZFN0YWZmOiBhbnk7XHJcbiAgc2VsZWN0U3RhZmYoc3RhZmY6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0YWZmID0gc3RhZmY7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XHJcbiAgfVxyXG4gIG5leHRTdGVwKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLnNlcnZpY2VMaXN0aW5nID0gdHJ1ZTtcclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZUJ1dHRvbikge1xyXG4gICAgICAgIHRoaXMuZ2V0QWxsTG9jYXRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLnN0YWZmTGlzdGluZykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xyXG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcclxuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnNlbGVjdGVkU3RhZmYgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IHRydWU7XHJcbiAgICAgIGlmICghdGhpcy5hY3RpdmVCdXR0b24pIHtcclxuICAgICAgICB0aGlzLmdldEFsbFN0YWZmKCk7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc3RhZmZMaXN0aW5nJztcclxuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XHJcbiAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzU4LjU3JztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnKSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLnN0YWZmTGlzdGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlQnV0dG9uKVxyXG4gICAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlU2xvdHMoKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdkYXRlU2VsZWN0aW9uJykge1xyXG4gICAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMuc2VsZWN0ZWREYXRlU3RyICYmIHRoaXMuc2VsZWN0ZWRUaW1lID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnY29udGFjdERldGFpbHMnO1xyXG4gICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3J1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2NvbnRhY3REZXRhaWxzJykge1xyXG4gICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWx1ZXMoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdwYXltZW50VGFiJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICc4NS41NydcclxuICAgIH1cclxuICB9XHJcbiAgcHJldmlvdXNTdGVwKCkge1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdsb2NhdGlvbkxpc3RpbmcnKSB7XHJcbiAgICAgIGlmICh0aGlzLmFjY2Vzc2VkVGFicy5zZXJ2aWNlTGlzdGluZykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnc3RhZmZMaXN0aW5nJykge1xyXG4gICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMjkuMjgnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLnNlcnZpY2VMaXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XHJcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdkYXRlU2VsZWN0aW9uJykge1xyXG4gICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc3RhZmZMaXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcclxuICAgICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmFjY2Vzc2VkVGFicy5zZXJ2aWNlTGlzdGluZykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnY29udGFjdERldGFpbHMnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAncGF5bWVudFRhYicpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdjb250YWN0RGV0YWlscyc7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNzAuNTcnO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXJ2aWNlRGF0YTogYW55W10gPSBbXTtcclxuICBnZXRBbGxTZXJ2aWNlcygpIHtcclxuICAgIGxldCBzZXJ2aWNlUGF5bG9hZDogYW55ID0ge1xyXG4gICAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIixcclxuICAgICAgcGFnZU5vOiAwLFxyXG4gICAgICBzaXplOiAxMDBcclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQXBwb2ludG1lbnRTZXJ2aWNlKHNlcnZpY2VQYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlcnZpY2VEYXRhID0gcmVzLmNvbnRlbnQuZmlsdGVyKChzZXJ2aWNlOiBhbnkpID0+IHNlcnZpY2UuYWN0aXZlID09PSB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuc2VydmljZURhdGEuZm9yRWFjaChzZXJ2aWNlID0+IHNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlcnZpY2VEYXRhKVxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VydmljZURhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmFjdGl2ZUJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9IHRoaXMuc2VydmljZURhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsTG9jYXRpb25zKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XHJcbiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvY2F0aW9uRGF0YTogYW55W10gPSBbXTtcclxuICBnZXRBbGxMb2NhdGlvbnMoKSB7XHJcbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLmxvY2F0aW9uRGF0YSA9IFtdO1xyXG4gICAgbGV0IHBheWxvYWQgPSB7IGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsU3RvcmVzKHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGxvY2F0aW9ucyA9IHJlcy5kYXRhLmRhdGEuZmlsdGVyKChzdG9yZTogYW55KSA9PiB7IHJldHVybiBzdG9yZS5zdGF0dXMgPT09ICdBQ1RJVkUnIH0pO1xyXG4gICAgICAgICAgbG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnN0b3JlSWRzLmluY2x1ZGVzKGxvY2F0aW9uLmlkKSkge1xyXG4gICAgICAgICAgICAgIGxvY2F0aW9uLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbkRhdGEucHVzaChsb2NhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbkRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmFjdGl2ZUJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uRGF0YVswXTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5nZXRBbGxTdGFmZigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcclxuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIGdyYWNlZnVsbHlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgc3RhZmZQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBzZXJ2aWNlSWQ6ICcnLFxyXG4gICAgc3RvcmVJZDogJycsXHJcbiAgICBidXNpbmVzc0lkOiAnJ1xyXG4gIH1cclxuICBzdGFmZkRhdGE6IGFueVtdID0gW107XHJcbiAgZ2V0QWxsU3RhZmYoKSB7XHJcbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLnN0YWZmUGF5bG9hZC5zdG9yZUlkID0gdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5pZCA/PyBcIlwiO1xyXG4gICAgdGhpcy5zdGFmZlBheWxvYWQuc2VydmljZUlkID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlcnZpY2VJZCA/IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlcnZpY2VJZCA6ICcnO1xyXG4gICAgdGhpcy5zdGFmZlBheWxvYWQuYnVzaW5lc3NJZCA9IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdGFmZih0aGlzLnN0YWZmUGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc3RhZmZEYXRhID0gcmVzLmZpbHRlcigoc3RhZmY6IGFueSkgPT4gc3RhZmYuYWN0aXZlID09PSB0cnVlKTtcclxuICAgICAgICAgIGlmICh0aGlzLnN0YWZmRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuYWN0aXZlQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XHJcbiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RhZmYgPSB0aGlzLnN0YWZmRGF0YVswXTtcclxuICAgICAgICAgICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFmZkRhdGEubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XHJcbiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGNvbnZlcnRUbzI0SG91cih0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgW2hvdXJNaW4sIG1vZGlmaWVyUmF3XSA9IHRpbWUuc3BsaXQoJyAnKTtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJSYXcudG9VcHBlckNhc2UoKTsgLy8gXCJBTVwiIG9yIFwiUE1cIlxyXG4gICAgbGV0IFtob3VycywgbWludXRlc10gPSBob3VyTWluLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcblxyXG4gICAgaWYgKG1vZGlmaWVyID09PSAnUE0nICYmIGhvdXJzIDwgMTIpIHtcclxuICAgICAgaG91cnMgKz0gMTI7XHJcbiAgICB9XHJcbiAgICBpZiAobW9kaWZpZXIgPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSB7XHJcbiAgICAgIGhvdXJzID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoaCA9IGhvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1tID0gbWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICByZXR1cm4gYCR7aGh9OiR7bW19ICR7bW9kaWZpZXJ9YDtcclxuICB9XHJcbiAgc2xvdHNQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgc2VydmljZUlkOiBcIlwiLFxyXG4gICAgYnVzaW5lc3NJZDogXCJcIixcclxuICAgIGJvb2tpbmdEYXRlOiBcIlwiXHJcbiAgfVxyXG4gIGxvY2F0aW9uVGltaW5nOiBhbnlbXSA9IFtdO1xyXG4gIGxvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdldEF2YWlsYWJsZVNsb3RzKCkge1xyXG4gICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgIHRoaXMubG9jYXRpb25UaW1pbmcgPSBbXTtcclxuICAgIHRoaXMuc2xvdHNQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkID8/IFwiXCI7XHJcbiAgICB0aGlzLnNsb3RzUGF5bG9hZC5zZXJ2aWNlSWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VydmljZUlkID8gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VydmljZUlkIDogJyc7XHJcbiAgICB0aGlzLnNsb3RzUGF5bG9hZC5idXNpbmVzc0lkID0gdGhpcy5idXNpbmVzc0lkID8/IFwiXCI7XHJcbiAgICBjb25zdCBkYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPz8gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpO1xyXG4gICAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1tID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBkZCA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuXHJcbiAgICB0aGlzLnNsb3RzUGF5bG9hZC5ib29raW5nRGF0ZSA9IGAke3l5eXl9LSR7bW19LSR7ZGR9VDAwOjAwOjAwLjAwMFpgO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RhZmYpXHJcbiAgICAgIHRoaXMuc2xvdHNQYXlsb2FkLnN0YWZmSWQgPSB0aGlzLnNlbGVjdGVkU3RhZmYuc3RhZmZJZDtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Qm9va2luZ1Nsb3RzKHRoaXMuc2xvdHNQYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHJlcy5mb3JFYWNoKCh0aW1lOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uVGltaW5nLnB1c2goeyBzZWxlY3RlZDogZmFsc2UsIHZhbHVlOiB0aGlzLmNvbnZlcnRUbzI0SG91cih0aW1lKSB9KTtcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHNlbGVjdGVkVGltZTogYW55XHJcbiAgc2VsZWN0VGltZVNsb3QodGltZTogYW55KSB7XHJcbiAgICB0aW1lLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gIH1cclxuICBjaGVja1JlcXVpcmVkVmFsdWVzKCkge1xyXG4gICAgaWYgKHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWUgJiYgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwuZW1haWwgJiYgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkU2VydmljZSwgdGhpcy5zZWxlY3RlZExvY2F0aW9uLCB0aGlzLnNlbGVjdGVkU3RhZmYsIHRoaXMuc2VsZWN0ZWREYXRlLCB0aGlzLnNlbGVjdGVkVGltZSwgdGhpcy51c2VyRGV0YWlscylcclxuICAgIH1cclxuICB9XHJcbiAgYXBwb2ludG1lbnRQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBzdGFmZkRldGFpbDoge1xyXG4gICAgICBpZDogJycsXHJcbiAgICAgIG5hbWU6ICcnXHJcbiAgICB9LFxyXG4gICAgYm9va2luZ0RhdGU6ICcnLFxyXG4gICAgc3RhcnRUaW1lOiAnJyxcclxuICAgIGN1c3RvbWVyRGV0YWlsOiB7XHJcbiAgICAgIG5hbWU6ICcnLFxyXG4gICAgICBwaG9uZU51bWJlcjogJycsXHJcbiAgICAgIGVtYWlsOiAnJ1xyXG4gICAgfSxcclxuICAgIHNlcnZpY2VEZXRhaWw6IHtcclxuICAgICAgaWQ6ICcnLFxyXG4gICAgICBuYW1lOiAnJ1xyXG4gICAgfSxcclxuICAgIHN0b3JlSWQ6ICcnLFxyXG4gICAgYnVzaW5lc3NJZDogdGhpcy5idXNpbmVzc0lkXHJcbiAgfVxyXG4gIGNoZWNrUGF5bWVudCgpIHtcclxuICAgIC8vIGlmICh0aGlzLnNlbGVjdGVkU2VydmljZT8uZGVwb3NpdEFtb3VudD8uZGVwb3NpdFJlcXVpcmVkKSB7XHJcbiAgICAvLyAgIHRoaXMucGF5bWVudEJvb2tpbmdBcHBvaW50bWVudCgpO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xyXG4gIH1cclxuICBhcGlTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjcmVhdGVBcHBvaW50bWVudCgpIHtcclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/PyBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1tID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBkZCA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsLmlkID0gdGhpcy5zZWxlY3RlZFN0YWZmLnN0YWZmSWQ7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdGFmZkRldGFpbC5uYW1lID0gdGhpcy5zZWxlY3RlZFN0YWZmLnN0YWZmTmFtZTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWQ7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsLmlkID0gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VydmljZUlkO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbC5uYW1lID0gdGhpcy5zZWxlY3RlZFNlcnZpY2UubmFtZTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YXJ0VGltZSA9IHRoaXMuc2VsZWN0ZWRUaW1lLnZhbHVlLnNsaWNlKDAsIDUpO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuYm9va2luZ0RhdGUgPSBgJHt5eXl5fS0ke21tfS0ke2RkfVQwMDowMDowMC4wMDBaYDtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuYm9va0FwcG9pbnRtZW50VjIodGhpcy5hcHBvaW50bWVudFBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdBcHBvaW50bWVudCBib29rZWQgc3VjY2Vzc2Z1bGx5JywgJ2Nsb3NlJywgeyBkdXJhdGlvbjogMjAwMCB9KVxyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YXR1c1RlbXBsYXRlJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxMDAnO1xyXG4gICAgICB0aGlzLmFwaVN0YXR1cyA9IHRydWU7XHJcbiAgICB9LFxyXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBpU3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gYm9vayBhcHBvaW50bWVudCcsICdjbG9zZScsIHsgZHVyYXRpb246IDIwMDAgfSlcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuICBwYXltZW50Qm9va2luZ0FwcG9pbnRtZW50KCkge1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8/IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbW0gPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRkID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU3RhZmYuc3RhZmZJZDtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU3RhZmYuc3RhZmZOYW1lO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RvcmVJZCA9IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZDtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnNlcnZpY2VEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZS5zZXJ2aWNlSWQ7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU2VydmljZS5uYW1lO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RhcnRUaW1lID0gdGhpcy5zZWxlY3RlZFRpbWUudmFsdWUuc2xpY2UoMCwgNSk7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZSA9IGAke3l5eXl9LSR7bW19LSR7ZGR9VDAwOjAwOjAwLjAwMFpgO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5wYXltZW50Rm9yQXBwb2ludG1lbnQodGhpcy5hcHBvaW50bWVudFBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmNhc2hGcmVlRXZlbnQuZW1pdChyZXMuZGF0YSk7XHJcbiAgICB9LFxyXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIGJvb2sgYXBwb2ludG1lbnQgcGxlYXNlIHNlbGVjdCBhbm90aGVyIHRpbWUgc2xvdCcsICdjbG9zZScsIHsgZHVyYXRpb246IDIwMDAgfSlcclxuICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gIH1cclxuICBnb0JhY2soKSB7XHJcbiAgICB0aGlzLm1hdERpYWxvZy5jbG9zZUFsbCgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cIm1haW5fc2VjdGlvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1haW5faGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrLWJ0biBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgZ2FwLTIgbWItM1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9iYWNrc3BhY2U8L21hdC1pY29uPjxzcGFuPkJhY2sgdG8gTXkgQm9va2luZ3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICA8aDE+Qm9vayBOZXcgQXBwb2ludG1lbnQ8L2gxPlxyXG4gICAgICAgICAgICAgICAgPHA+e3tidXNpbmVzc05hbWUgPz8gXCJOL0FcIiB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGggKyAnJSdcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1haW5fYm9keSB3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3NlcnZpY2VMaXN0aW5nJ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VydmljZUxpc3RpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdsb2NhdGlvbkxpc3RpbmcnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2NhdGlvbkxpc3RpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGFmZkxpc3RpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdkYXRlU2VsZWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZVNlbGVjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdjb250YWN0RGV0YWlscydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhY3REZXRhaWxzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3BheW1lbnRUYWInXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYXltZW50VGFiXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3N0YXR1c1RlbXBsYXRlJ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdHVzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1haW5fZm9vdGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwic2VsZWN0ZWRUYWIhPT0nc3RhdHVzVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1idXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFjay1mb290ZXItYnRuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInByZXZpb3VzU3RlcCgpXCI+QmFjazwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIFtkaXNhYmxlZF09XCIhYWN0aXZlQnV0dG9uXCIgKGNsaWNrKT1cIm5leHRTdGVwKClcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiE9J3BheW1lbnRUYWInXCI+e3shbG9hZGVyID8gJ0NvbnRpbnVlJyA6ICdMb2FkaW5nLi4uJ319PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb21wbGV0ZV9ib29raW5nIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdwYXltZW50VGFiJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tQYXltZW50KClcIj5Db21wbGV0ZSBCb29raW5nPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG48bmctdGVtcGxhdGUgI3NlcnZpY2VMaXN0aW5nPlxyXG4gICAgPGRpdiBjbGFzcz1cInctNjAgc2VydmljZV9zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2Utc2VsZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxoMj5TZWxlY3QgYSBTZXJ2aWNlPC9oMj5cclxuICAgICAgICAgICAgPHA+Q2hvb3NlIHRoZSBzZXJ2aWNlIHlvdSdkIGxpa2UgdG8gYm9vazwvcD5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlcy1ncmlkXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZXJ2aWNlIG9mIHNlcnZpY2VEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIChjbGljayk9XCJzZWxlY3RTZXJ2aWNlKHNlcnZpY2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VydmljZS1jYXJkLXNlbGVjdGVkJyA6IHNlcnZpY2U/LnNlbGVjdGVkLCAnc2VydmljZS1jYXJkJzogIXNlcnZpY2U/LnNlbGVjdGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBzZXJ2aWNlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj5wZXJzb25fb3V0bGluZTwvbWF0LWljb24+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj57e3NlcnZpY2U/Lm5hbWUgPyBzZXJ2aWNlPy5uYW1lIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhdGVnb3J5XCI+V2VsbG5lc3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuXt7c2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U/LnByaWNlRGV0YWlscz8ucHJpY2UgOiAnTi9BJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWR1cmF0aW9uXCI+e3tzZXJ2aWNlPy5kdXJhdGlvbiA/IHNlcnZpY2U/LmR1cmF0aW9uIDogJ04vQSd9fSBtaW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VydmljZT8uZGVzY3JpcHRpb24gPyBzZXJ2aWNlPy5kZXNjcmlwdGlvbiA6ICdOL0EnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob21lLXZpc2l0XCIgKm5nSWY9XCJzZXJ2aWNlPy5ob21lQXBwb2ludG1lbnRBdmFpbGFibGVcIj48aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy85ODIxMjZjMTc1ODYyODg2MzEyOWZ1cm5pdHVyZV8xNjQwNjEwMy5wbmdcIj5Ib21lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdCBBdmFpbGFibGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pY29uXCI+8J+RpDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPkdlbmVyYWwgQ29uc3VsdGF0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXRlZ29yeVwiPk1lZGljYWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuTgwMDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZHVyYXRpb25cIj4zMCBtaW48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlaGVuc2l2ZSBoZWFsdGggY29uc3VsdGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj7wn6egPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+TWVudGFsIEhlYWx0aCBDb3Vuc2VsaW5nPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXRlZ29yeVwiPk1lbnRhbCBIZWFsdGg8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuTE1MDA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWR1cmF0aW9uXCI+NDUgbWluPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFByb2Zlc3Npb25hbCBwc3ljaG9sb2dpY2FsIHN1cHBvcnRcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9tZS12aXNpdFwiPkhvbWUgVmlzaXQgQXZhaWxhYmxlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj7inII8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj5IYWlyIEN1dCAmIFN0eWxpbmc8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhdGVnb3J5XCI+QmVhdXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrkxMjAwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kdXJhdGlvblwiPjQ1IG1pbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9mZXNzaW9uYWwgaGFpciBjdXR0aW5nIGFuZCBzdHlsaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtdmlzaXRcIj5Ib21lIFZpc2l0IEF2YWlsYWJsZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2xvY2F0aW9uTGlzdGluZz5cclxuICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbl9oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxoMT5DaG9vc2UgTG9jYXRpb248L2gxPlxyXG4gICAgICAgICAgICA8cD5TZWxlY3Qgd2hlcmUgeW91J2QgbGlrZSB0byByZWNlaXZlIHRoZSBzZXJ2aWNlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsb2NhdGlvbiBvZiBsb2NhdGlvbkRhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInNlbGVjdExvY2F0aW9uKGxvY2F0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbG9jYXRpb24tY2FyZC1zZWxlY3RlZCcgOiBsb2NhdGlvbj8uc2VsZWN0ZWQsICdsb2NhdGlvbi1jYXJkJzogIWxvY2F0aW9uPy5zZWxlY3RlZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uXCI+PGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzQyNzIyNmMxNzU4NjI5MTU3NzU4c3RvcmVfMzE3MTUxMC5wbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+e3tsb2NhdGlvbj8uc3RvcmVOYW1lID8gbG9jYXRpb24/LnN0b3JlTmFtZSA6ICdOL0EnfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzdGFuY2VcIj48bWF0LWljb24+bG9jYXRpb25fb248L21hdC1pY29uPiAyLjMga208L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uYWRkcmVzc0xpbmV9fSwge3tsb2NhdGlvbj8uYWRkcmVzc0RldGFpbHM/LmNpdHl9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsb2NhdGlvbj8uYWRkcmVzc0RldGFpbHM/LnN0YXRlfX0ge3tsb2NhdGlvbj8ucGluY29kZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uIGJyYW5jaC1pY29uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QnJhbmNoIENsaW5pYzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD40NTYgQ2FyZSBBdmVudWUsIEhlYWx0aCBab25lLCBNdW1iYWkgNDAwMDE1PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzdGFuY2VcIj41Ljgga208L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uIGhvbWUtaWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhvbWUgVmlzaXQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91ciBMb2NhdGlvbjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3RhbmNlXCI+MCBrbTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3N0YWZmTGlzdGluZz5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgaC0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWhlYWRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwibWItMVwiPlNlbGVjdCBTdGFmZiBNZW1iZXI8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3VidGl0bGUgbWItMFwiPkNob29zZSB5b3VyIHByZWZlcnJlZCBwcm9mZXNzaW9uYWw8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YWZmIENhcmRzIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtNCBzdGFmZi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhZmYgb2Ygc3RhZmZEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgc3RhZmYtY2FyZCBjYXJkIHJvdW5kZWQtMyBwLTRcIiAoY2xpY2spPVwic2VsZWN0U3RhZmYoc3RhZmYpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YWZmLWF2YXRhciByb3VuZGVkLWNpcmNsZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgbWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzdGFmZj8uc3RhZmZOYW1lLnNsaWNlKDAsMykudG9VcHBlckNhc2UoKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtZGV0YWlscyBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic3RhZmYtbmFtZVwiPnt7c3RhZmY/LnN0YWZmTmFtZSA/IHN0YWZmPy5zdGFmZk5hbWUgOiAnTi9BJ319PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3BlY2lhbHR5XCI+R2VuZXJhbCBNZWRpY2luZTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtZGVzY3JpcHRpb24gbWItMFwiPkV4cGVyaWVuY2VkIHBoeXNpY2lhbiB3aXRoIDEwKyB5ZWFycyBpblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpY2luZSBhbmQgd2VsbG5lc3MgY2FyZS48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYXRpbmctc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Rhci1yYXRpbmcgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFyLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhdGluZy1udW1iZXJcIj40Ljk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LWNvdW50XCI+MTU2IHJldmlld3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2RhdGVTZWxlY3Rpb24+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy02MFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaGVhZGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJtYi0zXCI+U2VsZWN0IERhdGUgJiBUaW1lPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImRhdGV0aW1lLXN1YnRpdGxlIG1iLTBcIj5DaG9vc2Ugd2hlbiB5b3UnZCBsaWtlIHlvdXIgYXBwb2ludG1lbnQ8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgbWFpbl9jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgQ29sdW1uIC0gRGF0ZSBTZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5TZWxlY3QgRGF0ZTwvaDM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZGF0ZS1pbnB1dCBib3JkZXItMCByb3VuZGVkLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImRkLW1tLXl5eXlcIiBbdmFsdWVdPVwic2VsZWN0ZWREYXRlU3RyXCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXMtMlwiIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigkZXZlbnQpXCI+Y2FsZW5kYXJfdG9kYXk8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItcG9wb3ZlclwiICpuZ0lmPVwic2hvd0NhbGVuZGFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FsZW5kYXIgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWREYXRlXCIgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uRGF0ZVNlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uIC0gVGltZSBTZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIGgtMTAwIHJvdW5kZWQtMyBwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5BdmFpbGFibGUgVGltZXM8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGltZSBTbG90cyBHcmlkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItNCBvdmVyZmxvdy1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIiAqbmdGb3I9XCJsZXQgdGltZSBvZiBsb2NhdGlvblRpbWluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zbG90IHJvdW5kZWQtMlwiIFtjbGFzcy5zZWxlY3RlZF09XCJ0aW1lLnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUaW1lU2xvdCh0aW1lKVwiPnt7dGltZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lPy52YWx1ZS5zbGljZSgwLDUpIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXYWl0bGlzdCBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhaXRsaXN0LXNlY3Rpb24gcm91bmRlZC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGgtMTAwIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGZsZXgtY29sdW1uXCI+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndhaXRsaXN0LWljb24gY2hlY2staWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIlwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWl0bGlzdC10aXRsZVwiPk5vIHNsb3RzIGF2YWlsYWJsZT88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWl0bGlzdC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBtZSB0byB0aGUgd2FpdGxpc3QgZm9yIGVhcmxpZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250YWN0RGV0YWlscz5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1oZWFkZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMSBjbGFzcz1cIm1iLTBcIj5Db250YWN0IERldGFpbHM8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29udGFjdC1zdWJ0aXRsZSBtYi0wXCI+UHJvdmlkZSB5b3VyIGNvbnRhY3QgaW5mb3JtYXRpb248L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEZvcm0gU2VjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGRldGFpbHNfY29udGFpbmVyIGZsZXgtY29sdW1uIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWZ0IENvbHVtbiAtIFBlcnNvbmFsIEluZm9ybWF0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24gY2FyZCByb3VuZGVkLTMgcC00IGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGdWxsIE5hbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsIE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVtYWlsIEFkZHJlc3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWFpbCBBZGRyZXNzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBob25lIE51bWJlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lIE51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGVsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dCByb3VuZGVkLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uIC0gSG9tZSBWaXNpdCBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+SG9tZSBWaXNpdCBEZXRhaWxzPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIb21lIEFkZHJlc3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb21lIEFkZHJlc3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tdGV4dGFyZWEgcm91bmRlZC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBjb21wbGV0ZSBhZGRyZXNzXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGVjaWFsIEluc3RydWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWwgSW5zdHJ1Y3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXRleHRhcmVhIHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFueSBzcGVjaWFsIGluc3RydWN0aW9ucyBmb3IgdGhlIHByb2Zlc3Npb25hbCAob3B0aW9uYWwpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWNpZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwb2xpY2llcy10aXRsZVwiPlBvbGljaWVzICYgVGVybXM8L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQb2xpY3kgSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbXMtY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWxsYXRpb24gUG9saWN5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q2FuY2VsbGF0aW9uUG9saWN5ID0gIXNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5DYW5jZWxsYXRpb24gUG9saWN5PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWFycm93IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxtYXQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsbGF0aW9uX3BvbGljaWVzIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBmdy01MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgRnJlZSBjYW5jZWxsYXRpb24gdXAgdG8gMjQgaG91cnMgYmVmb3JlIGFwcG9pbnRtZW50PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgNTAlIGNoYXJnZSBmb3IgY2FuY2VsbGF0aW9ucyB3aXRoaW4gMjQgaG91cnM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JiM4MjI2OyBObyByZWZ1bmQgZm9yIG5vLXNob3dzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgRW1lcmdlbmN5IGNhbmNlbGxhdGlvbnMgd2lsbCBiZSByZXZpZXdlZCBjYXNlIGJ5IGNhc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlc2NoZWR1bGluZyBQb2xpY3kgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZWR1Y2luZ1BvbGljeSA9ICFzaG93UmVkdWNpbmdQb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxpbmcgUG9saWN5PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWFycm93IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxtYXQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd1JlZHVjaW5nUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93UmVkdWNpbmdQb2xpY3lcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbmNlbGxhdGlvbl9wb2xpY2llcyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgZnctNTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dSZWR1Y2luZ1BvbGljeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgRnJlZSBjYW5jZWxsYXRpb24gdXAgdG8gMjQgaG91cnMgYmVmb3JlIGFwcG9pbnRtZW50PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgNTAlIGNoYXJnZSBmb3IgY2FuY2VsbGF0aW9ucyB3aXRoaW4gMjQgaG91cnM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JiM4MjI2OyBObyByZWZ1bmQgZm9yIG5vLXNob3dzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiYjODIyNjsgRW1lcmdlbmN5IGNhbmNlbGxhdGlvbnMgd2lsbCBiZSByZXZpZXdlZCBjYXNlIGJ5IGNhc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY2VwdGFuY2UgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2VwdGFuY2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhY2NlcHRhbmNlLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCB0aGUgY2FuY2VsbGF0aW9uICYgcmVzY2hlZHVsaW5nIHBvbGljaWVzIGFuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJ0ZXJtcy1saW5rXCI+VGVybXMgJiBDb25kaXRpb25zPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXh0ZXJuYWwtbGluay1pY29uXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNwYXltZW50VGFiPlxyXG4gICAgPGRpdiBjbGFzcz1cInctNjBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWhlYWRlciBtYi0zIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwibWItMFwiPlBheW1lbnQgJiBDb25maXJtYXRpb248L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicGF5bWVudC1zdWJ0aXRsZSBtYi0wXCI+UmV2aWV3IHlvdXIgYm9va2luZyBhbmQgY29tcGxldGUgcGF5bWVudDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQm9va2luZyBTdW1tYXJ5IENhcmQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9va2luZy1zdW1tYXJ5LWNhcmQgdy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInN1bW1hcnktdGl0bGVcIj5Cb29raW5nIFN1bW1hcnk8L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlcnZpY2UgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2VydmljZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWRTZXJ2aWNlPy5uYW1lID8gc2VsZWN0ZWRTZXJ2aWNlPy5uYW1lIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFByb2Zlc3Npb25hbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Qcm9mZXNzaW9uYWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA/IHNlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMb2NhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Mb2NhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lID8gc2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlICYgVGltZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5EYXRlICYgVGltZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWREYXRlID8gKHNlbGVjdGVkRGF0ZSB8IGRhdGUgOiAnc2hvcnREYXRhJykgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRGF0ZVN0ciA/IChzZWxlY3RlZERhdGVTdHIpIDogJ04vQScpfX0gYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjMwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRHVyYXRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+RHVyYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU2VydmljZT8uZHVyYXRpb24gPyBzZWxlY3RlZFNlcnZpY2U/LmR1cmF0aW9uIDogJ04vQSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRheCBQZXJjZW50PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3tzZWxlY3RlZFNlcnZpY2U/LnByaWNlRGV0YWlscz8udGF4UGVyY2VudCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcnZpY2U/LnByaWNlRGV0YWlscz8udGF4UGVyY2VudCA6ICdOL0EnfX0lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUb3RhbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3cgdG90YWwtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+VG90YWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sXCI+4oK5PC9zcGFuPnt7c2VsZWN0ZWRTZXJ2aWNlPy5wcmljZURldGFpbHM/LnByaWNlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA6ICdOL0EnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNzdGF0dXNUZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJib29raW5nLWNvbmZpcm1hdGlvblwiPlxyXG4gICAgICAgIDwhLS0gU3VjY2VzcyBJY29uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzLWljb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy84ODEyOTNjMTc1ODY5NTU3ODUxOHN1Y2Nlc3MuZ2lmXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zMjUwMDBjMTc1ODY5NTU2NDUxOGZhaWwuZ2lmXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwXCIgKm5nSWY9XCIhYXBpU3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybWF0aW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwiY29uZmlybWF0aW9uLXRpdGxlXCI+e3thcGlTdGF0dXMgPyAnQm9va2luZyBDb25maXJtZWQhJyA6ICdCb29raW5nIEZhaWxlZCd9fTwvaDE+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIHt7YXBpU3RhdHVzID8gJ1lvdXIgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvb2tlZC4nOidGYWlsZWQgdG8gYm9vayB5b3UgYXBwb2ludG1lbnQuIFBsZWFzZVxyXG4gICAgICAgICAgICAgICAgdHJ5IGFnYWluIGxhdGVyJ319XHJcbiAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGV0YWlscyBDYXJkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXRpdGxlXCI+QXBwb2ludG1lbnQgRGV0YWlsczwvaDM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlNlcnZpY2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3thcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbD8ubmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbD8ubmFtZSA6ICdOL0EnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlByb2Zlc3Npb25hbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57e2FwcG9pbnRtZW50UGF5bG9hZC5zdGFmZkRldGFpbD8ubmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWw/Lm5hbWUgOiAnTi9BJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkRhdGUgJiBUaW1lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7YXBwb2ludG1lbnRQYXlsb2FkLmJvb2tpbmdEYXRlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZS5zbGljZSgwLDgpIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOL0EnfX0gYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwb2ludG1lbnRQYXlsb2FkLnN0YXJ0VGltZSA/IGFwcG9pbnRtZW50UGF5bG9hZC5zdGFydFRpbWUgOiAnTi9BJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCI+VmlldyBNeSBCb29raW5nczwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPkJhY2sgdG8gQWRtaW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19