@norwegian/core-components 6.51.3 → 6.52.0

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 (33) hide show
  1. package/assets/documentation/filter-new/filter-new.md +0 -0
  2. package/esm2022/lib/components/airport-select-new/airport-select-new.component.mjs +2 -2
  3. package/esm2022/lib/components/alert/alert.component.mjs +2 -2
  4. package/esm2022/lib/components/datepicker-combo-new/datepicker-combo-new.component.mjs +1 -1
  5. package/esm2022/lib/components/filter/index.mjs +1 -2
  6. package/esm2022/lib/components/filter-new/enums/trip-type.enum.mjs +8 -0
  7. package/esm2022/lib/components/filter-new/filter-new.component.mjs +1328 -0
  8. package/esm2022/lib/components/filter-new/filter-new.module.mjs +101 -0
  9. package/esm2022/lib/components/filter-new/index.mjs +4 -0
  10. package/esm2022/lib/components/index.mjs +3 -1
  11. package/esm2022/lib/components/number-field-new/number-field-new.component.mjs +3 -3
  12. package/esm2022/lib/components/passenger-select/index.mjs +1 -3
  13. package/esm2022/lib/components/passenger-select-new/enums/passenger-type.enum.mjs +9 -0
  14. package/esm2022/lib/components/passenger-select-new/index.mjs +5 -0
  15. package/esm2022/lib/components/passenger-select-new/models/passengers.model.mjs +2 -0
  16. package/esm2022/lib/components/passenger-select-new/passenger-select-new.component.mjs +417 -0
  17. package/esm2022/lib/components/passenger-select-new/passenger-select-new.module.mjs +28 -0
  18. package/fesm2022/norwegian-core-components.mjs +8664 -6835
  19. package/fesm2022/norwegian-core-components.mjs.map +1 -1
  20. package/lib/components/datepicker-combo-new/datepicker-combo-new.component.d.ts +2 -2
  21. package/lib/components/filter/index.d.ts +0 -1
  22. package/lib/components/filter-new/enums/trip-type.enum.d.ts +6 -0
  23. package/lib/components/filter-new/filter-new.component.d.ts +829 -0
  24. package/lib/components/filter-new/filter-new.module.d.ts +27 -0
  25. package/lib/components/filter-new/index.d.ts +3 -0
  26. package/lib/components/index.d.ts +2 -0
  27. package/lib/components/passenger-select/index.d.ts +0 -2
  28. package/lib/components/passenger-select-new/enums/passenger-type.enum.d.ts +7 -0
  29. package/lib/components/passenger-select-new/index.d.ts +4 -0
  30. package/lib/components/passenger-select-new/models/passengers.model.d.ts +10 -0
  31. package/lib/components/passenger-select-new/passenger-select-new.component.d.ts +141 -0
  32. package/lib/components/passenger-select-new/passenger-select-new.module.d.ts +10 -0
  33. package/package.json +1 -1
@@ -0,0 +1,1328 @@
1
+ /**
2
+ * @license
3
+ * Copyright Norwegian Air Shuttle. All Rights Reserved.
4
+ */
5
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
6
+ import { BehaviorSubject } from 'rxjs';
7
+ import { TripType } from './enums/trip-type.enum';
8
+ import { NasComponentBase } from '../../core/base/nas-component.base';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../../core/services/device/device-helper.service";
11
+ import * as i2 from "../../core/services/sort/sort.service";
12
+ import * as i3 from "../../core/services/abandoned-basket/abandoned-basket.service";
13
+ import * as i4 from "../../core/services/date/date-helper.service";
14
+ import * as i5 from "@angular/common";
15
+ import * as i6 from "../../core/directives/nas-class/nas-class.directive";
16
+ import * as i7 from "../accordion/accordion.component";
17
+ import * as i8 from "../icon/icon.component";
18
+ import * as i9 from "@angular/forms";
19
+ import * as i10 from "../subsidy-discount/subsidy-discount.component";
20
+ import * as i11 from "../suggestions/suggestions.component";
21
+ import * as i12 from "../airport-select-new/airport-select-new.component";
22
+ import * as i13 from "../datepicker-combo-new/datepicker-combo-new.component";
23
+ import * as i14 from "../button-new/button-new.component";
24
+ import * as i15 from "../passenger-select-new/passenger-select-new.component";
25
+ import * as i16 from "../radio-new/radio-new.component";
26
+ /**
27
+ * @description
28
+ * Norwegian Filter Component | New design | Beta
29
+ */
30
+ export class FilterNewComponent extends NasComponentBase {
31
+ get outboundOpen() {
32
+ return this.outboundOpenValue;
33
+ }
34
+ set outboundOpen(value) {
35
+ if (this.outboundOpenValue === value) {
36
+ return;
37
+ }
38
+ if (value) {
39
+ this.closeDropdowns();
40
+ if (this.airportSelect) {
41
+ this.airportSelect.originOpen = false;
42
+ this.airportSelect.destinationOpen = false;
43
+ }
44
+ }
45
+ this.outboundOpenValue = value;
46
+ this.outboundOpenChange.emit(value);
47
+ }
48
+ get inboundOpen() {
49
+ return this.inboundOpenValue;
50
+ }
51
+ set inboundOpen(value) {
52
+ if (this.inboundOpenValue === value) {
53
+ return;
54
+ }
55
+ if (value) {
56
+ this.closeDropdowns();
57
+ if (this.airportSelect) {
58
+ this.airportSelect.originOpen = false;
59
+ this.airportSelect.destinationOpen = false;
60
+ }
61
+ }
62
+ clearTimeout(this.inboundOpenTimeout);
63
+ this.inboundOpenTimeout = setTimeout(() => {
64
+ this.inboundOpenValue = value;
65
+ });
66
+ this.inboundOpenChange.emit(value);
67
+ }
68
+ /**
69
+ * @property Input
70
+ * @description
71
+ * An array of different passenger types that will be displayed.
72
+ */
73
+ get passengers() {
74
+ return this.passengersValue;
75
+ }
76
+ set passengers(value) {
77
+ if (!value) {
78
+ return;
79
+ }
80
+ this.passengersValue = value;
81
+ this.passengersChange.emit(value);
82
+ }
83
+ /**
84
+ * @property Input
85
+ * @description
86
+ * Indicates if the edit search of accordion should be expended on mobile screen sizes.
87
+ */
88
+ get expandedAccordionMobile() {
89
+ return this.expandedAccordionMobileValue;
90
+ }
91
+ set expandedAccordionMobile(value) {
92
+ if (value === this.expandedAccordionMobileValue) {
93
+ return;
94
+ }
95
+ this.expandedAccordionMobileValue = value;
96
+ }
97
+ get closestAirports() {
98
+ return this.closestAirportsValue;
99
+ }
100
+ set closestAirports(airports) {
101
+ if (!airports || airports.length < 1) {
102
+ return;
103
+ }
104
+ this.closestAirportsValue = airports;
105
+ if (this.exists(this.overrideOrigin)) {
106
+ this.originAirportCode = airports[0].code;
107
+ }
108
+ }
109
+ /**
110
+ * @property Input
111
+ * @required
112
+ * @description
113
+ * All airports that will be populated into the dropdown lists.
114
+ * If displayLatestSearches is true, it will try to get the latest searches from the abandoned basket.
115
+ */
116
+ get airports() {
117
+ return this.airportsValue;
118
+ }
119
+ set airports(airports) {
120
+ this.airportsValue = airports;
121
+ if (this.exists(this.displayLatestSearches)) {
122
+ const abandonedBasket = this.abandonedBasketService.getAll();
123
+ this.setLatestSearches(abandonedBasket, this.airports);
124
+ }
125
+ }
126
+ /**
127
+ * @property Input
128
+ * @description
129
+ * Sets and gets the selected trip type.
130
+ */
131
+ get tripType() {
132
+ return this.tripTypeValue;
133
+ }
134
+ set tripType(tripType) {
135
+ if (tripType === this.tripTypeValue) {
136
+ return;
137
+ }
138
+ this.tripTypeValue = tripType;
139
+ this.tripTypeChange.emit(this.tripType);
140
+ }
141
+ /**
142
+ * @property Input
143
+ * @description
144
+ * Sets and gets whether the selected transit type is direct only or not.
145
+ */
146
+ get directOnly() {
147
+ return this.directOnlyValue;
148
+ }
149
+ set directOnly(directOnly) {
150
+ if (directOnly === this.directOnlyValue) {
151
+ return;
152
+ }
153
+ this.directOnlyValue = directOnly;
154
+ this.directOnlyChange.emit(this.directOnly);
155
+ }
156
+ /**
157
+ * @property Input
158
+ * @description
159
+ * Selected datefor outbound calendar.
160
+ */
161
+ get outboundSelectedDate() {
162
+ return this.outboundSelectedDateValue;
163
+ }
164
+ set outboundSelectedDate(date) {
165
+ if (!date) {
166
+ return;
167
+ }
168
+ setTimeout(() => {
169
+ this.outboundSelectedDateValue = date;
170
+ this.outboundSelectedDateChange.emit(date);
171
+ });
172
+ }
173
+ /**
174
+ * @property Input
175
+ * @description
176
+ * Selected datefor inbound calendar.
177
+ */
178
+ get inboundSelectedDate() {
179
+ return this.inboundSelectedDateValue;
180
+ }
181
+ set inboundSelectedDate(date) {
182
+ if (!date) {
183
+ return;
184
+ }
185
+ setTimeout(() => {
186
+ this.inboundSelectedDateValue = date;
187
+ this.inboundSelectedDateChange.emit(date);
188
+ });
189
+ }
190
+ get inboundSelectedMonth() {
191
+ return this.inboundSelectedMonthValue;
192
+ }
193
+ set inboundSelectedMonth(month) {
194
+ if (this.dateService.isSameMonth(month, this.inboundSelectedMonthValue)) {
195
+ return;
196
+ }
197
+ setTimeout(() => {
198
+ this.inboundMonthChange.emit(month);
199
+ this.inboundSelectedMonthValue = month;
200
+ });
201
+ }
202
+ constructor(deviceHelper, sortService, abandonedBasketService, dateService, elementRef, changeDetector) {
203
+ super('nas-filter-new');
204
+ this.deviceHelper = deviceHelper;
205
+ this.sortService = sortService;
206
+ this.abandonedBasketService = abandonedBasketService;
207
+ this.dateService = dateService;
208
+ this.elementRef = elementRef;
209
+ this.changeDetector = changeDetector;
210
+ this.displaySummary = true;
211
+ this.containerWidth = new BehaviorSubject(0);
212
+ this.maximize = false;
213
+ this.isNasGroupValid = false;
214
+ this.inlineFlex = 0;
215
+ this.openPassengerSelect = false;
216
+ this.openTransitTypeSelect = false;
217
+ /**
218
+ * @property Input
219
+ * @description
220
+ * A separator for the filter summary that is dispayed if minimizeOnMobile is true.
221
+ *
222
+ * ### Example
223
+ * 1 traveller, round trip and direct/transit
224
+ */
225
+ this.defaultSummarySeparator = '';
226
+ /**
227
+ * A separator for the filter summary is are dispayed if minimizeOnMobile is true.
228
+ *
229
+ * ### Example
230
+ * 1 traveller, round trip and direct/transit
231
+ */
232
+ this.lastSummarySeparator = '';
233
+ /**
234
+ * @property Input
235
+ * @description
236
+ * A placeholder that will appear on the origin airport input field.
237
+ */
238
+ this.placeholderOrigin = '';
239
+ /**
240
+ * @property Input
241
+ * @description
242
+ * A placeholder that will appear on the destination airport input field.
243
+ */
244
+ this.placeholderDestination = '';
245
+ /**
246
+ * @property Output
247
+ * @description
248
+ * An event that is fired every time the origin dropdown selector opens or closes.
249
+ */
250
+ this.originOpenChange = new EventEmitter();
251
+ /**
252
+ * @property Output
253
+ * @description
254
+ * An event that is fired every time the origin dropdown selector opens or closes.
255
+ */
256
+ this.destinationOpenChange = new EventEmitter();
257
+ /**
258
+ * @property Output
259
+ * @description
260
+ * An event that is fired every time the passenger select dropdown opens or closes.
261
+ */
262
+ this.passengerSelectOpenChange = new EventEmitter();
263
+ /**
264
+ * @property Output
265
+ * @description
266
+ * An event that is fired every time the selected origin airport changes.
267
+ */
268
+ this.originChange = new EventEmitter();
269
+ /**
270
+ * @property Output
271
+ * @description
272
+ * An event that is fired every time the selected destination airport changes.
273
+ */
274
+ this.destinationChange = new EventEmitter();
275
+ /**
276
+ * @property Output
277
+ * @description
278
+ * An event that is fired every time a passenger selection change is performed.
279
+ */
280
+ this.passengersChange = new EventEmitter();
281
+ /**
282
+ * @property Output
283
+ * @description
284
+ * Sets and gets the selected trip type.
285
+ */
286
+ this.tripTypeChange = new EventEmitter();
287
+ /**
288
+ * @property Output
289
+ * @description
290
+ * Sets and gets whether the selected transit type is direct only or not.
291
+ */
292
+ this.directOnlyChange = new EventEmitter();
293
+ /**
294
+ * @property Input
295
+ * @description
296
+ * The display format of the date when user has selected the date and it is being shown in the input box for the date picker.
297
+ * Please look at the angular Date pipe for valid formats and variations.
298
+ */
299
+ this.dateDisplayFormat = 'EEE d, MMM';
300
+ /**
301
+ * @property Input
302
+ * @description
303
+ * The time display format.
304
+ */
305
+ this.timeDisplayFormat = 'HH:mm';
306
+ /**
307
+ * @property Input
308
+ * @description
309
+ * A locale code for the locale format rules to use. When not supplied, uses the value of LOCALE_ID, which is en-US by default.
310
+ * This requires that registerLocaleData is called with the respective locale.
311
+ */
312
+ this.locale = 'en-GB';
313
+ /**
314
+ * @property Input
315
+ * @description
316
+ * Will display the destination input, set this to false to remove it. It's true by default.
317
+ */
318
+ this.enableDestinationSelect = true;
319
+ /**
320
+ * @property Input
321
+ * @description
322
+ * Will display passenger select, set this to false to remove it. It's true by default.
323
+ */
324
+ this.enablePassengersSelect = true;
325
+ /**
326
+ * @property Input
327
+ * @description
328
+ * Will display the trip switch, set this to false to remove it. It's true by default.
329
+ */
330
+ this.enableTripSwitch = true;
331
+ /**
332
+ * @property Input
333
+ * @description
334
+ * Will display the transit switch, set this to false to remove it. It's true by default.
335
+ */
336
+ this.enableTransitSwitch = true;
337
+ /**
338
+ * @property Output
339
+ * @description
340
+ * When selected datehas been changed on the outbound calendar.
341
+ */
342
+ this.outboundSelectedDateChange = new EventEmitter();
343
+ /**
344
+ * @property Output
345
+ * @description
346
+ * When selected datehas been changed on the inbound calendar.
347
+ */
348
+ this.inboundSelectedDateChange = new EventEmitter();
349
+ /**
350
+ * @property Output
351
+ * @description
352
+ * Outbound datepicker is open or closed.
353
+ */
354
+ this.outboundOpenChange = new EventEmitter();
355
+ /**
356
+ * @property Output
357
+ * @description
358
+ * Inbound datepicker is open or closed.
359
+ */
360
+ this.inboundOpenChange = new EventEmitter();
361
+ /**
362
+ * @property Output
363
+ * @description
364
+ * Outbound calendar changes month.
365
+ */
366
+ this.outboundMonthChange = new EventEmitter();
367
+ /**
368
+ * @property Output
369
+ * @description
370
+ * Inbound calendar changes month.
371
+ */
372
+ this.inboundMonthChange = new EventEmitter();
373
+ /**
374
+ * @property Output
375
+ * @description
376
+ * When a user has actively changed the date.
377
+ */
378
+ this.focusOnNextChange = new EventEmitter();
379
+ /**
380
+ * @property Output
381
+ * @description
382
+ * The geolocation of the user. Will be emitted if 'enableSuggestions' is true.
383
+ */
384
+ this.positionChange = new EventEmitter();
385
+ /**
386
+ * @property Output
387
+ * @description
388
+ * An even that is fired every time the info button on the subsidy discount is clicked.
389
+ */
390
+ this.subsidyDiscountInfoClick = new EventEmitter();
391
+ this.outboundOpenValue = false;
392
+ this.inboundOpenValue = false;
393
+ this.passengersValue = new Array();
394
+ this.nativeElement = elementRef.nativeElement;
395
+ }
396
+ ngOnInit() {
397
+ if (!this.nasFormGroup) {
398
+ return;
399
+ }
400
+ this.nasFormGroup.statusChanges.subscribe((x) => {
401
+ setTimeout(() => {
402
+ this.isNasGroupValid = /true/i.test(x);
403
+ });
404
+ });
405
+ if (this.nasFormControlNameDirectOnly) {
406
+ const directOnlyControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
407
+ if (directOnlyControl) {
408
+ this.directOnly = directOnlyControl.value;
409
+ }
410
+ }
411
+ if (this.nasFormControlNameTripType) {
412
+ const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
413
+ if (tripTypeControl) {
414
+ this.tripType = tripTypeControl.value;
415
+ this.inboundDisabled = tripTypeControl.value === TripType.oneWay;
416
+ if (this.nasFormControlNameInbound) {
417
+ const inboundControl = this.nasFormGroup.get(this.nasFormControlNameInbound);
418
+ if (inboundControl && this.inboundDisabled) {
419
+ inboundControl.disable();
420
+ }
421
+ }
422
+ tripTypeControl.valueChanges.subscribe((value) => {
423
+ this.inboundDisabled = value === TripType.oneWay;
424
+ this.tripType = value;
425
+ });
426
+ }
427
+ }
428
+ if (this.nasFormControlNameDirectOnly) {
429
+ const directOnlyControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
430
+ if (directOnlyControl) {
431
+ directOnlyControl.valueChanges.subscribe((value) => {
432
+ this.directOnly = value;
433
+ });
434
+ }
435
+ }
436
+ }
437
+ ngAfterViewChecked() {
438
+ this.containerWidth.next(this.container.nativeElement.offsetWidth);
439
+ window.onresize = () => {
440
+ this.containerWidth.next(this.container.nativeElement.offsetWidth);
441
+ };
442
+ this.setInlineFlexWidth();
443
+ }
444
+ onSubsidyDiscountInfoClick() {
445
+ this.subsidyDiscountInfoClick.emit();
446
+ }
447
+ onSubsidyDiscountSelectChange(model) {
448
+ if (!this.nasFormGroup || !this.nasFormControlNameSubsidyDiscount) {
449
+ return;
450
+ }
451
+ const subsidyDiscountControl = this.nasFormGroup.get(this.nasFormControlNameSubsidyDiscount);
452
+ subsidyDiscountControl.patchValue(model);
453
+ }
454
+ getClosestAirports(position) {
455
+ this.positionChange.emit(position);
456
+ }
457
+ getFilterClass(element, modifiersInput) {
458
+ let modifiers = modifiersInput || new Array();
459
+ if (typeof modifiersInput === 'string' ||
460
+ modifiersInput instanceof String) {
461
+ modifiers = [modifiersInput];
462
+ }
463
+ const widths = [];
464
+ if (this.deviceHelper.isWidthTablet(this.containerWidth.getValue())) {
465
+ widths.push('md');
466
+ }
467
+ if (this.deviceHelper.isWidthDesktop(this.containerWidth.getValue())) {
468
+ widths.push('lg');
469
+ }
470
+ modifiers = [...modifiers, ...widths];
471
+ return this.getClass(element, modifiers);
472
+ }
473
+ getAirportSelectClass() {
474
+ return this.getClass('airport-select-new', [
475
+ this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg',
476
+ this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
477
+ this.exists(this.enableDatepickers) && 'no-border',
478
+ ]);
479
+ }
480
+ getSuggestions() {
481
+ const suggestions = Array.from(new Set([
482
+ ...(this.latestSearchesOrigin
483
+ ? this.latestSearchesOrigin.filter((x) => x.code !== this.originAirportCode)
484
+ : []),
485
+ ...(this.closestAirports
486
+ ? this.closestAirports.filter((x) => x.code !== this.originAirportCode)
487
+ : []),
488
+ ]));
489
+ return suggestions.slice(0, 3);
490
+ }
491
+ getDatePickersClass() {
492
+ return this.getFilterClass('date-combo-new', [
493
+ this.exists(this.minimize) && 'minimized',
494
+ this.containerWidth.getValue() > 500 && 'side-by-side',
495
+ ]);
496
+ }
497
+ getTravelDetailsClass(element, modifiersInput) {
498
+ let modifiers = modifiersInput || new Array();
499
+ if (typeof modifiersInput === 'string' ||
500
+ modifiersInput instanceof String) {
501
+ modifiers = [modifiersInput];
502
+ }
503
+ const widths = [
504
+ this.deviceHelper.isWidthTablet(this.containerWidth.getValue()) && 'md',
505
+ this.deviceHelper.isWidthDesktop(this.containerWidth.getValue()) && 'lg',
506
+ ];
507
+ modifiers = [...modifiers, ...widths];
508
+ const travelDetailsBase = new NasComponentBase('travel-details');
509
+ return travelDetailsBase.getClass(element, modifiers);
510
+ }
511
+ onInboundMonthChange(month) {
512
+ this.inboundMonthChange.emit(month);
513
+ }
514
+ onOutboundMonthChange(month) {
515
+ this.outboundMonthChange.emit(month);
516
+ }
517
+ onPassengersSelectFocusOnPrevious() {
518
+ if (this.isMobileDisplay()) {
519
+ this.onTransitSwitchOpen(true);
520
+ this.focusAsync(this.transitSwitch.toggleElement);
521
+ }
522
+ else if (this.isTabletDisplay()) {
523
+ this.selectPreviousControl();
524
+ }
525
+ }
526
+ passengerKeyDown(event) {
527
+ switch (event.key) {
528
+ case 'Tab':
529
+ if (event.shiftKey) {
530
+ if (this.isMobileDisplay() || this.isTabletDisplay()) {
531
+ break;
532
+ }
533
+ this.focusOnAirportSelectBackwards();
534
+ break;
535
+ }
536
+ if (this.isMobileDisplay()) {
537
+ if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
538
+ this.subsidyDiscount.infoButton.button.nativeElement.focus();
539
+ }
540
+ else {
541
+ this.focusOnNextChange.emit();
542
+ }
543
+ }
544
+ break;
545
+ case 'Enter':
546
+ if (event.shiftKey || this.isMobileDisplay()) {
547
+ break;
548
+ }
549
+ if (document.activeElement ===
550
+ this.passengerSelectDropdown.toggleElement.nativeElement) {
551
+ if (this.passengerSelectDropdown.open) {
552
+ this.onTripSwitchOpen(true);
553
+ this.focusAsync(this.tripSwitch.toggleElement);
554
+ }
555
+ else {
556
+ this.onPassengerSelectOpen();
557
+ }
558
+ }
559
+ break;
560
+ case 'Escape':
561
+ this.onPassengerSelectOpen();
562
+ event.preventDefault();
563
+ this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
564
+ break;
565
+ }
566
+ }
567
+ onTripSwitchKeyDown(event) {
568
+ switch (event.key) {
569
+ case 'ArrowRight':
570
+ if (document.activeElement === this.tripTypeRoundTrip.nativeElement) {
571
+ this.tripTypeOneway.nativeElement.focus();
572
+ }
573
+ break;
574
+ case 'ArrowLeft':
575
+ if (document.activeElement === this.tripTypeOneway.nativeElement) {
576
+ this.tripTypeRoundTrip.nativeElement.focus();
577
+ }
578
+ break;
579
+ case 'Tab':
580
+ case 'Enter':
581
+ if (event.shiftKey) {
582
+ event.preventDefault();
583
+ if (this.isMobileDisplay() || !this.passengerSelectDropdown) {
584
+ this.selectPreviousControl();
585
+ }
586
+ else {
587
+ this.onPassengerSelectOpen();
588
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
589
+ }
590
+ }
591
+ else {
592
+ if (event.key === 'Tab') {
593
+ this.onTransitSwitchOpen(true);
594
+ }
595
+ else {
596
+ if (this.tripSwitch.open) {
597
+ this.onTransitSwitchOpen(true);
598
+ this.focusAsync(this.transitSwitch.toggleElement);
599
+ }
600
+ else {
601
+ this.onTripSwitchOpen(true);
602
+ }
603
+ }
604
+ }
605
+ break;
606
+ case 'Escape':
607
+ this.onTripSwitchOpen(false);
608
+ this.setFocusOnNativeElement(this.tripSwitch.toggleElement);
609
+ break;
610
+ }
611
+ }
612
+ transitKeyDown(event) {
613
+ switch (event.key) {
614
+ case 'ArrowRight':
615
+ if (document.activeElement === this.transitTypeTransit.nativeElement) {
616
+ this.transitTypeDirectOnly.nativeElement.focus();
617
+ }
618
+ break;
619
+ case 'ArrowLeft':
620
+ if (document.activeElement === this.transitTypeDirectOnly.nativeElement) {
621
+ this.transitTypeTransit.nativeElement.focus();
622
+ }
623
+ break;
624
+ case 'Tab':
625
+ case 'Enter':
626
+ if (event.shiftKey) {
627
+ event.preventDefault();
628
+ this.onTripSwitchOpen(true);
629
+ this.focusAsync(this.tripSwitch.toggleElement);
630
+ }
631
+ else {
632
+ if (this.isMobileDisplay()) {
633
+ this.onPassengerSelectOpen();
634
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
635
+ }
636
+ else {
637
+ this.onTransitSwitchOpen(!this.transitSwitch.open);
638
+ if (this.subsidyDiscounts && this.subsidyDiscounts.length > 0) {
639
+ this.subsidyDiscount.infoButton.button.nativeElement.focus();
640
+ }
641
+ else {
642
+ this.focusOnNextChange.emit();
643
+ }
644
+ }
645
+ if (event.key === 'Tab') {
646
+ event.preventDefault();
647
+ }
648
+ }
649
+ break;
650
+ case 'Escape':
651
+ this.onTransitSwitchOpen(false);
652
+ event.preventDefault();
653
+ this.setFocusOnNativeElement(this.transitSwitch.toggleElement);
654
+ break;
655
+ }
656
+ }
657
+ onSubsidyDiscountInfoButtonKeydown(event) {
658
+ switch (event.key) {
659
+ case 'Tab':
660
+ if (event.shiftKey) {
661
+ if (this.isMobileDisplay()) {
662
+ this.focusAsync(this.passengerSelectDropdown.toggleElement);
663
+ }
664
+ else {
665
+ this.focusAsync(this.transitSwitch.toggleElement);
666
+ }
667
+ event.preventDefault();
668
+ }
669
+ break;
670
+ default:
671
+ break;
672
+ }
673
+ }
674
+ onPassengersSelectFocusOnNext() {
675
+ if (this.isMobileDisplay()) {
676
+ this.passengerSelectDropdown.toggle();
677
+ }
678
+ else {
679
+ this.onTripSwitchOpen(true);
680
+ this.focusAsync(this.tripSwitch.toggleElement);
681
+ }
682
+ }
683
+ focusAsync(refElement) {
684
+ clearTimeout(this.focusAsyncTimout);
685
+ this.focusAsyncTimout = setTimeout(() => this.setFocusOnNativeElement(refElement));
686
+ }
687
+ onDatepickerFocusOnPrevious(event) {
688
+ event.preventDefault();
689
+ this.focusOnAirportSelectBackwards();
690
+ }
691
+ selectPreviousControl() {
692
+ if (this.datepickerCombo) {
693
+ if (this.datepickerCombo.outboundOnly) {
694
+ this.outboundOpen = true;
695
+ }
696
+ else {
697
+ this.inboundOpen = true;
698
+ }
699
+ }
700
+ else if (this.airportSelect) {
701
+ if (this.exists(this.airportSelect.combo)) {
702
+ this.airportSelect.onDestinationOpen(true);
703
+ if (this.airportSelect.airportSelectDropdownDestination) {
704
+ this.focusAsync(this.airportSelect.airportSelectDropdownDestination.input);
705
+ }
706
+ }
707
+ else {
708
+ this.airportSelect.onOriginOpen(true);
709
+ if (this.airportSelect.airportSelectDropdownOrigin) {
710
+ this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
711
+ }
712
+ }
713
+ }
714
+ }
715
+ onFocusOnNextChange(event) {
716
+ if (this.isMobileDisplay() && this.tripSwitch) {
717
+ this.onTripSwitchOpen(true);
718
+ this.focusAsync(this.tripSwitch.toggleElement);
719
+ }
720
+ else if (this.isTabletDisplay()) {
721
+ if (this.passengerSelectDropdown) {
722
+ event.preventDefault();
723
+ setTimeout(() => {
724
+ this.onPassengerSelectOpen();
725
+ this.setFocusOnNativeElement(this.passengerSelectDropdown.toggleElement);
726
+ });
727
+ }
728
+ else if (this.tripSwitch) {
729
+ this.onTripSwitchOpen(true);
730
+ this.focusAsync(this.tripSwitch.toggleElement);
731
+ }
732
+ }
733
+ }
734
+ isMobileDisplay() {
735
+ return this.deviceHelper.isWidthMobile(this.containerWidth.getValue());
736
+ }
737
+ isTabletDisplay() {
738
+ return this.deviceHelper.isWidthTablet(this.containerWidth.getValue());
739
+ }
740
+ onOriginOpen(open) {
741
+ if (this.passengerSelectDropdown) {
742
+ this.passengerSelectDropdown.open = false;
743
+ }
744
+ if (this.tripSwitch) {
745
+ this.tripSwitch.open = false;
746
+ }
747
+ if (this.transitSwitch) {
748
+ this.transitSwitch.open = false;
749
+ }
750
+ if (this.datepickerCombo) {
751
+ this.datepickerCombo.inboundOpen = false;
752
+ this.datepickerCombo.outboundOpen = false;
753
+ }
754
+ if (this.airportSelect && !this.airportSelect.originOpen) {
755
+ this.updateMaximize();
756
+ }
757
+ this.originOpenChange.emit(open);
758
+ this.changeDetector.detectChanges();
759
+ }
760
+ validateAirportValues() {
761
+ if (!this.airportSelect) {
762
+ return false;
763
+ }
764
+ const originSnapshot = this.airportSelect.origin;
765
+ const destinationSnapshot = this.airportSelect.destination;
766
+ if (originSnapshot &&
767
+ destinationSnapshot &&
768
+ originSnapshot.code &&
769
+ originSnapshot.code.length &&
770
+ destinationSnapshot.code &&
771
+ destinationSnapshot.code.length) {
772
+ return true;
773
+ }
774
+ return false;
775
+ }
776
+ updateMaximize() {
777
+ setTimeout(() => {
778
+ this.maximize = this.validateAirportValues();
779
+ });
780
+ }
781
+ onDestinationOpen(open) {
782
+ if (this.passengerSelectDropdown) {
783
+ this.passengerSelectDropdown.open = false;
784
+ }
785
+ if (this.tripSwitch) {
786
+ this.tripSwitch.open = false;
787
+ }
788
+ if (this.transitSwitch) {
789
+ this.transitSwitch.open = false;
790
+ }
791
+ if (this.datepickerCombo) {
792
+ this.datepickerCombo.inboundOpen = false;
793
+ this.datepickerCombo.outboundOpen = false;
794
+ }
795
+ if (this.airportSelect && !this.airportSelect.destinationOpen) {
796
+ this.updateMaximize();
797
+ }
798
+ this.destinationOpenChange.emit(open);
799
+ }
800
+ onPassengerSelectOpen() {
801
+ this.openPassengerSelect = true;
802
+ if (this.airportSelect) {
803
+ this.airportSelect.originOpen = false;
804
+ this.airportSelect.destinationOpen = false;
805
+ }
806
+ if (this.tripSwitch) {
807
+ this.tripSwitch.open = false;
808
+ }
809
+ if (this.transitSwitch) {
810
+ this.transitSwitch.open = false;
811
+ }
812
+ if (this.datepickerCombo) {
813
+ if (this.datepickerCombo.inboundOpen) {
814
+ this.datepickerCombo.inboundOpen = false;
815
+ }
816
+ if (this.datepickerCombo.outboundOpen) {
817
+ this.datepickerCombo.outboundOpen = false;
818
+ }
819
+ }
820
+ this.passengerSelectOpenChange.emit(this.openPassengerSelect);
821
+ if (this.openPassengerSelect) {
822
+ setTimeout(() => {
823
+ if (this.passengerSelect?.numberFields.first) {
824
+ this.passengerSelect.numberFields.first.input.nativeElement.focus();
825
+ }
826
+ }, 300);
827
+ }
828
+ }
829
+ onTripSwitchOpen(open) {
830
+ clearTimeout(this.tripSwitchFocusTimeout);
831
+ if (this.passengerSelectDropdown) {
832
+ setTimeout(() => {
833
+ this.passengerSelectDropdown.open = false;
834
+ });
835
+ }
836
+ if (this.transitSwitch) {
837
+ this.transitSwitch.open = false;
838
+ }
839
+ if (this.airportSelect) {
840
+ this.airportSelect.originOpen = false;
841
+ this.airportSelect.destinationOpen = false;
842
+ }
843
+ if (this.datepickerCombo) {
844
+ this.datepickerCombo.inboundOpen = false;
845
+ this.datepickerCombo.outboundOpen = false;
846
+ }
847
+ this.tripSwitch.open = open;
848
+ if (open) {
849
+ this.tripSwitchFocusTimeout = setTimeout(() => {
850
+ this.tripTypeRoundTrip.nativeElement.focus();
851
+ }, 200);
852
+ }
853
+ }
854
+ onTransitSwitchOpen(open) {
855
+ this.openTransitTypeSelect = !this.openTransitTypeSelect;
856
+ clearTimeout(this.transitSwitchFocusTimeout);
857
+ if (this.passengerSelectDropdown) {
858
+ this.passengerSelectDropdown.open = false;
859
+ }
860
+ if (this.tripSwitch) {
861
+ this.tripSwitch.open = false;
862
+ }
863
+ if (this.airportSelect) {
864
+ this.airportSelect.originOpen = false;
865
+ this.airportSelect.destinationOpen = false;
866
+ }
867
+ if (this.datepickerCombo) {
868
+ this.datepickerCombo.inboundOpen = false;
869
+ this.datepickerCombo.outboundOpen = false;
870
+ }
871
+ if (this.transitSwitch) {
872
+ this.transitSwitch.open = open;
873
+ }
874
+ if (open) {
875
+ this.transitSwitchFocusTimeout = setTimeout(() => {
876
+ this.transitTypeTransit.nativeElement.focus();
877
+ }, 200);
878
+ }
879
+ }
880
+ onOriginChange(airport) {
881
+ this.originChange.emit(airport);
882
+ }
883
+ setSelectedOriginAirport(airport) {
884
+ if (!airport) {
885
+ return;
886
+ }
887
+ this.onOriginChange(airport);
888
+ if (this.originAirportCode === airport.code) {
889
+ return;
890
+ }
891
+ this.originAirportCode = airport.code;
892
+ this.changeDetector.detectChanges();
893
+ }
894
+ onDestinationChange(airport) {
895
+ this.destinationChange.emit(airport);
896
+ }
897
+ setFocusOnPassengerSelect(event) {
898
+ this.minimize = false;
899
+ if (this.isMobileDisplay()) {
900
+ if (this.datepickerCombo) {
901
+ event.preventDefault();
902
+ this.outboundOpen = true;
903
+ this.focusAsync(this.datepickerCombo.datepickerOutbound.input);
904
+ }
905
+ else if (this.tripSwitch) {
906
+ event.preventDefault();
907
+ this.onTripSwitchOpen(true);
908
+ this.focusAsync(this.tripSwitch.toggleElement);
909
+ }
910
+ }
911
+ else if (this.isTabletDisplay() && this.datepickerCombo) {
912
+ setTimeout(() => {
913
+ this.outboundOpen = true;
914
+ });
915
+ }
916
+ else {
917
+ if (this.passengerSelectDropdown) {
918
+ this.onPassengerSelectOpen();
919
+ const currentElementRef = this.passengerSelectDropdown.toggleElement;
920
+ setTimeout(() => this.setFocusOnNativeElement(currentElementRef));
921
+ }
922
+ else if (this.tripSwitch) {
923
+ this.onTripSwitchOpen(true);
924
+ this.tripSwitch.toggleElement.nativeElement.focus();
925
+ }
926
+ }
927
+ }
928
+ setFocusOnNativeElement(element) {
929
+ element.nativeElement.focus();
930
+ }
931
+ onTripTypeChange(tripType) {
932
+ setTimeout(() => {
933
+ if (this.tripSwitch) {
934
+ this.tripSwitch.open = false;
935
+ }
936
+ });
937
+ this.tripType = tripType;
938
+ if (this.nasFormGroup && this.nasFormControlNameTripType) {
939
+ const tripSwitchControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
940
+ tripSwitchControl.patchValue(tripType);
941
+ }
942
+ }
943
+ onTransitChange(directOnly) {
944
+ setTimeout(() => {
945
+ if (this.transitSwitch) {
946
+ this.transitSwitch.open = false;
947
+ }
948
+ });
949
+ this.directOnly = directOnly;
950
+ if (this.nasFormGroup && this.nasFormControlNameDirectOnly) {
951
+ const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameDirectOnly);
952
+ tripTypeControl.patchValue(directOnly);
953
+ }
954
+ this.openTransitTypeSelect = !this.openTransitTypeSelect;
955
+ }
956
+ getTravelDetailsTripSwitchIconClass(modifiers) {
957
+ const iconMediumBase = new NasComponentBase('icon-medium');
958
+ return [
959
+ iconMediumBase.getClass('', modifiers),
960
+ this.getTravelDetailsClass('icon'),
961
+ ];
962
+ }
963
+ getTripSwitchLabel() {
964
+ return this.tripType === TripType.twoWayReturn
965
+ ? this.tripSwitchRoundTripLabel
966
+ : this.tripSwitchOneWayLabel;
967
+ }
968
+ getTransitLabel() {
969
+ return this.directOnly ? this.directOnlyLabel : this.directTransitLabel;
970
+ }
971
+ onAccordionToggleChange(expanded) {
972
+ this.displaySummary = !expanded;
973
+ }
974
+ getSummary() {
975
+ return (`${this.passengerSelectLabel}${this.defaultSummarySeparator}` +
976
+ `${this.getTripSwitchLabel().toLowerCase()}${this.lastSummarySeparator}${this.getTransitLabel().toLowerCase()}`);
977
+ }
978
+ shouldMaximize() {
979
+ if (!this.exists(this.minimize)) {
980
+ return true;
981
+ }
982
+ else if (this.airportSelect &&
983
+ this.enableDestinationSelect &&
984
+ this.airportSelect.origin &&
985
+ this.airportSelect.origin.code &&
986
+ this.airportSelect.destination &&
987
+ this.airportSelect.destination.code) {
988
+ return true;
989
+ }
990
+ else if (this.airportSelect &&
991
+ !this.enableDestinationSelect &&
992
+ this.airportSelect.origin &&
993
+ this.airportSelect.origin.code) {
994
+ return true;
995
+ }
996
+ else if (this.airportSelect &&
997
+ (this.airportSelect.originOpen || this.airportSelect.destinationOpen)) {
998
+ return this.maximize;
999
+ }
1000
+ else if (this.exists(this.minimize)) {
1001
+ if (this.maximize) {
1002
+ if (this.nasFormGroup) {
1003
+ return this.isNasGroupValid;
1004
+ }
1005
+ return true;
1006
+ }
1007
+ else {
1008
+ return false;
1009
+ }
1010
+ }
1011
+ }
1012
+ focusOnAirportSelectBackwards() {
1013
+ if (this.exists(this.airportSelect.combo)) {
1014
+ this.airportSelect.onDestinationOpen(true);
1015
+ setTimeout(() => {
1016
+ this.airportSelect.airportSelectDropdownDestination.input.nativeElement.focus();
1017
+ }, 100);
1018
+ }
1019
+ else {
1020
+ this.airportSelect.onOriginOpen(true);
1021
+ this.focusAsync(this.airportSelect.airportSelectDropdownOrigin.input);
1022
+ }
1023
+ }
1024
+ setLatestSearches(abandonedBasket, airports) {
1025
+ if (!abandonedBasket || !airports) {
1026
+ return;
1027
+ }
1028
+ const unique = new Array();
1029
+ for (const item of abandonedBasket) {
1030
+ if (!unique.some((x) => x.destinationCode === item.destinationCode)) {
1031
+ unique.push(item);
1032
+ }
1033
+ }
1034
+ const originCodes = unique.map((x) => x.originCode);
1035
+ const destinationCodes = unique.map((x) => x.destinationCode);
1036
+ const latestSearchesOrigin = airports.filter((airport) => unique.some((x) => x.originCode.toLowerCase() === airport.code.toLowerCase()));
1037
+ const latestSearchesDestination = airports.filter((airport) => unique.some((x) => x.destinationCode.toLowerCase() === airport.code.toLowerCase()));
1038
+ const code = 'code';
1039
+ this.latestSearchesOrigin = this.sortService
1040
+ .sortByObject(latestSearchesOrigin, originCodes, code)
1041
+ .slice(0, 3);
1042
+ if (this.latestSearchesOrigin &&
1043
+ this.latestSearchesOrigin.length > 0 &&
1044
+ this.exists(this.overrideOrigin)) {
1045
+ this.originAirportCode = this.latestSearchesOrigin[0].code;
1046
+ }
1047
+ this.latestSearchesDestination = this.sortService
1048
+ .sortByObject(latestSearchesDestination, destinationCodes, code)
1049
+ .slice(0, 3);
1050
+ }
1051
+ closeDropdowns() {
1052
+ if (this.passengerSelectDropdown) {
1053
+ this.passengerSelectDropdown.open = false;
1054
+ }
1055
+ if (this.tripSwitch) {
1056
+ this.tripSwitch.open = false;
1057
+ }
1058
+ if (this.transitSwitch) {
1059
+ this.transitSwitch.open = false;
1060
+ }
1061
+ }
1062
+ setInlineFlexWidth() {
1063
+ this.inlineFlex = this.container.nativeElement.offsetWidth > 290 ? this.container.nativeElement.offsetWidth : 0;
1064
+ }
1065
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: FilterNewComponent, deps: [{ token: i1.DeviceHelper }, { token: i2.SortService }, { token: i3.AbandonedBasketService }, { token: i4.DateHelper }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.5", type: FilterNewComponent, selector: "nas-filter-new", inputs: { airportRelations: "airportRelations", ariaLabelClear: "ariaLabelClear", ariaLabelSubtract: "ariaLabelSubtract", ariaLabelBackdrop: "ariaLabelBackdrop", ariaLabelAdd: "ariaLabelAdd", allowedOriginAirports: "allowedOriginAirports", allowedDestinationAirports: "allowedDestinationAirports", displayLatestSearches: "displayLatestSearches", useSwitch: "useSwitch", displayClosestAirports: "displayClosestAirports", originAirportCode: "originAirportCode", destinationAirportCode: "destinationAirportCode", passengerSelectLabel: "passengerSelectLabel", maxPaxCount: "maxPaxCount", passengers: "passengers", minAdultCount: "minAdultCount", tripSwitchRoundTripLabel: "tripSwitchRoundTripLabel", tripSwitchOneWayLabel: "tripSwitchOneWayLabel", directOnlyLabel: "directOnlyLabel", directTransitLabel: "directTransitLabel", minimizeOnMobile: "minimizeOnMobile", expandedAccordionMobile: "expandedAccordionMobile", defaultSummarySeparator: "defaultSummarySeparator", lastSummarySeparator: "lastSummarySeparator", passengerSelectTitle: "passengerSelectTitle", passengerSelectAdultsLabel: "passengerSelectAdultsLabel", passengerSelectYouthsLabel: "passengerSelectYouthsLabel", passengerSelectYoungAdultsLabel: "passengerSelectYoungAdultsLabel", passengerSelectChildrenLabel: "passengerSelectChildrenLabel", passengerSelectInfantsLabel: "passengerSelectInfantsLabel", groupBookingLabel: "groupBookingLabel", allAirportsLabel: "allAirportsLabel", latestSearchesLabel: "latestSearchesLabel", closestAirportsLabel: "closestAirportsLabel", selectOriginFirstLabel: "selectOriginFirstLabel", labelOrigin: "labelOrigin", placeholderOrigin: "placeholderOrigin", labelDestination: "labelDestination", geolocationLabel: "geolocationLabel", geolocationBlockedLabel: "geolocationBlockedLabel", placeholderDestination: "placeholderDestination", keepSelection: "keepSelection", editSearchTitle: "editSearchTitle", nasFormGroup: "nasFormGroup", nasFormControlNameOrigin: "nasFormControlNameOrigin", nasFormControlNameDestination: "nasFormControlNameDestination", nasFormControlNameTripType: "nasFormControlNameTripType", nasFormControlNameDirectOnly: "nasFormControlNameDirectOnly", nasFormControlNameOutbound: "nasFormControlNameOutbound", nasFormControlNameInbound: "nasFormControlNameInbound", nasFormControlGroupBooking: "nasFormControlGroupBooking", nasFormControlNameSubsidyDiscount: "nasFormControlNameSubsidyDiscount", overrideOrigin: "overrideOrigin", enableSuggestions: "enableSuggestions", closestAirports: "closestAirports", minimize: "minimize", airports: "airports", tripType: "tripType", directOnly: "directOnly", groupBookingLimit: "groupBookingLimit", subsidyDiscounts: "subsidyDiscounts", selectedSubsidyDiscount: "selectedSubsidyDiscount", subsidyDiscountLabel: "subsidyDiscountLabel", ariaLabelPreviousMonth: "ariaLabelPreviousMonth", ariaLabelNextMonth: "ariaLabelNextMonth", noAvailableFlightsLabel: "noAvailableFlightsLabel", availableFlightsLabel: "availableFlightsLabel", disablePastSelection: "disablePastSelection", outboundLabel: "outboundLabel", inboundLabel: "inboundLabel", availability: "availability", outboundAvailableDates: "outboundAvailableDates", inboundAvailableDates: "inboundAvailableDates", times: "times", dateDisplayFormat: "dateDisplayFormat", timeDisplayFormat: "timeDisplayFormat", locale: "locale", compact: "compact", outboundDisabled: "outboundDisabled", inboundDisabled: "inboundDisabled", enableDatepickers: "enableDatepickers", minimizingLabel: "minimizingLabel", maximizingLabel: "maximizingLabel", directOnlyMobileLabel: "directOnlyMobileLabel", orLabel: "orLabel", passengersTitleLabel: "passengersTitleLabel", invalidDestinationText: "invalidDestinationText", outboundSelectedDate: "outboundSelectedDate", inboundSelectedDate: "inboundSelectedDate", enableDestinationSelect: "enableDestinationSelect", enablePassengersSelect: "enablePassengersSelect", enableTripSwitch: "enableTripSwitch", enableTransitSwitch: "enableTransitSwitch" }, outputs: { originOpenChange: "originOpenChange", destinationOpenChange: "destinationOpenChange", passengerSelectOpenChange: "passengerSelectOpenChange", originChange: "originChange", destinationChange: "destinationChange", passengersChange: "passengersChange", tripTypeChange: "tripTypeChange", directOnlyChange: "directOnlyChange", outboundSelectedDateChange: "outboundSelectedDateChange", inboundSelectedDateChange: "inboundSelectedDateChange", outboundOpenChange: "outboundOpenChange", inboundOpenChange: "inboundOpenChange", outboundMonthChange: "outboundMonthChange", inboundMonthChange: "inboundMonthChange", focusOnNextChange: "focusOnNextChange", positionChange: "positionChange", subsidyDiscountInfoClick: "subsidyDiscountInfoClick" }, viewQueries: [{ propertyName: "passengerSelectDropdown", first: true, predicate: ["passengerSelectDropdown"], descendants: true }, { propertyName: "passengerSelect", first: true, predicate: ["passengerSelect"], descendants: true }, { propertyName: "tripSwitch", first: true, predicate: ["tripSwitch"], descendants: true }, { propertyName: "transitSwitch", first: true, predicate: ["transitSwitch"], descendants: true }, { propertyName: "airportSelect", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "datepickerCombo", first: true, predicate: ["datepickerCombo"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "tripTypeOneway", first: true, predicate: ["tripTypeOneway"], descendants: true }, { propertyName: "tripTypeRoundTrip", first: true, predicate: ["tripTypeRoundTrip"], descendants: true }, { propertyName: "transitTypeDirectOnly", first: true, predicate: ["transitTypeDirectOnly"], descendants: true }, { propertyName: "transitTypeTransit", first: true, predicate: ["transitTypeTransit"], descendants: true }, { propertyName: "subsidyDiscount", first: true, predicate: ["subsidyDiscount"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\"\n simple\n containerOnToggle\n transparent\n [expanded]=\"expandedAccordionMobile\"\n [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\"\n *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}</div>\n\n<ng-template #filterTemplate>\n <div #container\n [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized', maximize && 'maximize'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select-new *ngIf=\"airports && airportRelations && (enableDestinationSelect)\"\n #airportSelect\n combo\n [ariaLabelClear]=\"ariaLabelClear\" \n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\"\n [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select-new>\n <nas-airport-select-new *ngIf=\"airports && (!enableDestinationSelect)\"\n #airportSelect\n [ariaLabelClear]=\"ariaLabelClear\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select-new>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [nasClass]=\"getFilterClass('suggestions')\"\n [suggestions]=\"getSuggestions()\"\n [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <div [nasClass]=\"!enableDestinationSelect ? getClass('origin-combined') :\n getTravelDetailsClass('', ['combined', exists(enableDatepickers) && 'no-border', exists(minimize) && 'minimized'])\">\n <ng-container *ngIf=\"enablePassengersSelect\">\n <button (click)=\"onPassengerSelectOpen($event)\" [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\" [type]=\"'small'\"></nas-icon></div>\n </button>\n <!-- <nas-dropdown #passengerSelectDropdown\n *ngIf=\"passengers?.length > 0\"\n [nasClass]=\"getTravelDetailsClass('dropdown', 'passengers')\"\n [cssClass]=\"getTravelDetailsClass('dropdown')\"\n [label]=\"passengerSelectLabel\"\n [labelStyle]=\"{'width': '102px'}\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (openChange)=\"onPassengerSelectOpen($event)\"\n (keydown)=\"passengerKeyDown($event)\"> -->\n <div *ngIf=\"openPassengerSelect\">\n <nas-passenger-select-new\n [ariaLabelAdd]=\"ariaLabelAdd\"\n [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\"\n [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\"\n [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\"\n [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\"\n [title]=\"passengerSelectTitle\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\"\n [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\"\n (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select-new>\n <nas-button-new *ngIf=\"this.openPassengerSelect\" light block \n [disabled]=\"passengers[0].count === 0 && passengers[1].count === 0 && passengers[2].count === 0\" (click)=\"openPassengerSelect = false\">\n Done\n </nas-button-new>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTripSwitch\">\n <form [nasClass]=\"getClass('radio')\">\n <nas-radio-new #tripTypeRoundTrip [name]=\"'tripType'\" [value]=\"2\" [checked]=\"true\" (checkedChange)=\"onTripTypeChange(2)\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio-new>\n <nas-radio-new #tripTypeOneway [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\">\n {{tripSwitchOneWayLabel}}\n </nas-radio-new>\n </form>\n </ng-container>\n <div *ngIf=\"exists(enableDatepickers)\"\n [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo-new #datepickerCombo\n compact\n [inlineFlex]=\"inlineFlex\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\"\n [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\"\n [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\"\n [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\"\n [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\"\n [times]=\"times\"\n [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\"\n [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\"\n (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\"\n (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\"\n [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\"\n [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo-new>\n </div>\n <ng-container *ngIf=\"enableTransitSwitch\">\n <nas-button-new *ngIf=\"directOnlyLabel && directTransitLabel\"\n #transitSwitch\n block\n light\n [iconType]=\"'chevron-down'\"\n [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button-new>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type')\">\n <button [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\"\n type=\"button\"\n #transitTypeDirectOnly\n (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button type=\"button\"\n #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"subsidyDiscounts && subsidyDiscounts.length > 0\"\n [nasClass]=\"getFilterClass('subsidy-discount')\">\n <nas-subsidy-discount #subsidyDiscount\n [discounts]=\"subsidyDiscounts\"\n [selectedDiscount]=\"selectedSubsidyDiscount\"\n [label]=\"subsidyDiscountLabel\"\n (infoButtonClick)=\"onSubsidyDiscountInfoClick()\"\n (discountSelectChange)=\"onSubsidyDiscountSelectChange($event)\"\n (infoButtonKeydown)=\"onSubsidyDiscountInfoButtonKeydown($event)\"></nas-subsidy-discount>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter-new{position:relative;z-index:6}.nas-filter-new ::ng-deep .nas-filter-new__transit .nas-button-new__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter-new ::ng-deep .nas-filter-new__transit--active .nas-button-new__icon{transform:rotate(180deg)}.nas-filter-new ::ng-deep .nas-filter-new__transit--active .nas-button-new{background-color:#ebf4ff}.nas-filter-new__title{margin-top:24px;font-size:28px;line-height:34px}@media screen and (min-width: 640px){.nas-filter-new__title{font-size:32px;line-height:38px}}.nas-filter-new__title--md{margin-top:60px}.nas-filter-new__radio{display:flex;gap:24px;padding:12px}.nas-filter-new__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #6f6f6f;padding:9px 14px;width:100%}.nas-filter-new__passengers-button--active{background-color:#ebf4ff!important}.nas-filter-new__label{flex-direction:column;text-align:left}.nas-filter-new__label p{margin:0}.nas-filter-new__button-title{font-weight:700;font-size:14px}.nas-filter-new__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter-new__transit-type{border:2px solid #15273f}.nas-filter-new__transit-type button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter-new__filters{margin-top:12px}.nas-filter-new__filters .nas-filter-new__date-combo{order:2;flex:1;z-index:2}.nas-filter-new__filters--minimized .nas-filter-new__airport-select:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.nas-filter-new__filters--maximize .nas-filter-new__airport-select-new:after{display:none}.nas-filter-new__filters--md .nas-filter-new__date-combo{flex:0 0 100%}.nas-filter-new__filters--lg{align-items:stretch}.nas-filter-new__filters--lg .nas-filter-new__date-combo{order:3;flex:0 0 100%;z-index:1}.nas-filter-new__filters--lg .nas-filter-new__suggestions{order:3}.nas-filter-new__filters--lg .nas-filter-new__filters--minimized .nas-filter-new__airport-select{margin-right:0;flex:0 1 100%}.nas-filter-new__filters--lg .nas-filter-new__filters--maximize .nas-filter-new__airport-select{margin-right:3px;flex:auto}.nas-filter-new__filters--lg.nas-filter-new__filters--maximize .nas-filter-new__date-combo{border-bottom:3px solid #c3c3c3}.nas-filter-new__suggestions{flex-basis:100%;position:relative;margin-top:3px}.nas-filter-new__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter-new__airport-select--lg{width:0;margin:0 3px 0 0;flex:1 1 auto}.nas-filter-new__toggler{font-family:Apercu,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;font-size:18px;line-height:26px;color:#15273f;margin-top:6px;z-index:1}.nas-filter-new__toggler .nas-filter-new__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter-new__toggler .nas-filter-new__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #f1f1f1}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:26px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:26px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f8f8f8}.travel-details__action--border{border-bottom:2px solid #f1f1f1}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__dropdown--md.travel-details__dropdown--trip-type{order:2;flex:1;margin-right:3px}.travel-details__dropdown--md.travel-details__dropdown--transit-type{order:3;flex:1}.travel-details__dropdown--md.travel-details__dropdown--passengers{order:1;flex:1;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--trip-type{order:2;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--transit-type{order:3;flex:1 1 auto}.travel-details__dropdown--lg.travel-details__dropdown--passengers{order:1;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg:focus{outline:none}.travel-details__dropdown--lg:after{display:none}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}.travel-details--combined{order:3;flex:0 0 100%}.travel-details--combined.travel-details--md:after{content:\"\";position:absolute;bottom:-6px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--md .travel-details__dropdown{margin:0 3px 0 0}.travel-details--combined.travel-details--md .travel-details__dropdown:last-child{margin:0}.travel-details--combined.travel-details--md .dropdown__toggle{height:calc(100% - 3px);margin:0;padding-left:16px;padding-right:16px}.travel-details--combined.travel-details--lg{order:2;flex:0 0 auto;margin:0 0 0 -3px;padding-left:3px;z-index:2}.travel-details--combined.travel-details--lg:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--lg .dropdown__toggle{height:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-passenger-select-new__list-item{padding:6px 16px!important}::ng-deep .nas-radio-new{margin:0!important}::ng-deep .nas-button-new{margin-top:6px}::ng-deep .nas-checkbox-new{background-color:#f1f1f1;padding:12px;width:100%;padding-left:42px!important;margin-bottom:12px!important}::ng-deep .nas-checkbox-new__indicator{left:12px!important}::ng-deep .nas-filter-new__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter-new__filters .nas-filter-new__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-filter-new__date-combo--side-by-side .nas-datepicker-combo-new__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-airport-select-new__input-line{border-top:none!important}::ng-deep .nas-filter-new__filters .nas-airport-select-new-combo__separator{border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter-new__filters .nas-datepicker-combo-new__separator{display:none}::ng-deep .nas-filter-new__filters--lg .nas-dropdown__toggle{display:flex}::ng-deep .nas-filter-new__filters--lg .nas-filter-new__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:3px solid #c3c3c3}::ng-deep .nas-filter-new__filters--lg .nas-airport-select-new__input-line{border-top:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__filters--lg .nas-datepicker-combo-new__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__filters--lg .nas-airport-select-new-combo__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__rotate{transform:rotate(180deg)}::ng-deep .nas-filter-new__rotate-enter,::ng-deep .nas-filter-new__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter-new__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter-new__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__input-line{border-top:none}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new-combo__separator{border-top:none}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__results-wrapper{margin-top:0}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__results{top:-3px}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__icon{bottom:18px}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new:after{display:none}::ng-deep .nas-filter-new__airport-select .nas-airport-select-new__input-line{display:none}::ng-deep .nas-filter-new__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter-new__airport-origin-select .nas-airport-select-new:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter-new__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter-new__airport-origin-select .nas-airport-select-new:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter-new__origin-combined{border-bottom:3px solid #c3c3c3;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter-new__origin-combined{display:flex;flex:none}::ng-deep .nas-filter-new__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter-new__subsidy-discount{order:3}::ng-deep .nas-filter-new__subsidy-discount .nas-subsidy-discount{margin-top:16px}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.AccordionComponent, selector: "nas-accordion", inputs: ["expanded", "title", "badge", "icon", "simple", "spaced", "small", "inverted", "containerOnToggle", "nopadding", "transparent", "approve", "primary", "warning", "badgeInfo", "badgeSuccess", "badgeWarning", "badgeError", "cssClass", "cssStyle"], outputs: ["toggleChange"] }, { kind: "component", type: i8.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.SubsidyDiscountComponent, selector: "nas-subsidy-discount", inputs: ["label", "icon", "selectedDiscount", "discounts"], outputs: ["infoButtonClick", "infoButtonKeydown", "discountSelectChange"] }, { kind: "component", type: i11.SuggestionsComponent, selector: "nas-suggestions", inputs: ["suggestions", "orLabel"], outputs: ["airportSelect"] }, { kind: "component", type: i12.AirportSelectNewComponent, selector: "nas-airport-select-new", inputs: ["airports", "airportRelations", "latestSearchesOrigin", "latestSearchesDestination", "closestAirports", "allowedOriginAiports", "allowedDestinationAirports", "displayLatestSearches", "displayClosestAirports", "combo", "useSwitch", "allAirportsLabel", "latestSearchesLabel", "closestAirportsLabel", "geolocationLabel", "geolocationBlockedLabel", "selectOriginFirstLabel", "invalidDestinationText", "labelOrigin", "placeholderOrigin", "labelDestination", "placeholderDestination", "keepSelection", "nasFormControlNameOrigin", "nasFormControlNameDestination", "nasFormGroup", "originAirportCode", "destinationAirportCode", "ariaLabelClear", "ariaLabelBackdrop"], outputs: ["originChange", "originOpenChange", "destinationChange", "destinationOpenChange", "focusOnNext", "positionChange"] }, { kind: "component", type: i13.DatepickerComboNewComponent, selector: "nas-datepicker-combo-new", inputs: ["ariaLabelBackdrop", "outboundOpen", "inboundOpen", "noAvailableFlightsLabel", "availableFlightsLabel", "disablePastSelection", "outboundDisabled", "inboundDisabled", "outboundOnly", "outboundLabel", "inboundLabel", "availability", "outboundAvailableDates", "inboundAvailableDates", "times", "dateDisplayFormat", "timeDisplayFormat", "locale", "compact", "nasFormGroup", "nasFormControlNameOutbound", "nasFormControlNameInbound", "outboundSelectedDate", "inboundSelectedDate", "disableBackdrop", "outboundSelectedTime", "inboundSelectedTime", "ariaLabelPreviousMonth", "ariaLabelNextMonth", "inboundLowerLimitDateOffset", "inlineFlex"], outputs: ["outboundSelectedDateChange", "inboundSelectedDateChange", "outboundOpenChange", "inboundOpenChange", "outboundMonthChange", "inboundMonthChange", "focusOnNextChange", "focusOnPreviousChange"] }, { kind: "component", type: i14.ButtonNewComponent, selector: "nas-button-new", inputs: ["primary", "secondary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange"] }, { kind: "component", type: i15.PassengerSelectNewComponent, selector: "nas-passenger-select-new", inputs: ["passengers", "maxPaxCount", "minAdultCount", "groupBookingLimit", "title", "adultsLabel", "childrenLabel", "infantsLabel", "youthsLabel", "youngAdultsLabel", "groupBookingLabel", "nasFormGroup", "nasFormControlGroupBooking", "ariaLabelSubtract", "ariaLabelAdd"], outputs: ["passengersChange", "focusOnNext", "focusOnPrevious"] }, { kind: "component", type: i16.RadioNewComponent, selector: "nas-radio-new", inputs: ["id", "value", "name", "error", "disabled", "strong", "block", "spaceless", "tabIndex", "required", "aria-label", "aria-describedby", "aria-labelledby", "checked", "nasFormControlName", "nasFormGroup"], outputs: ["checkedChange"] }] }); }
1067
+ }
1068
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: FilterNewComponent, decorators: [{
1069
+ type: Component,
1070
+ args: [{ selector: 'nas-filter-new', template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\"\n simple\n containerOnToggle\n transparent\n [expanded]=\"expandedAccordionMobile\"\n [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\"\n *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}</div>\n\n<ng-template #filterTemplate>\n <div #container\n [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized', maximize && 'maximize'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select-new *ngIf=\"airports && airportRelations && (enableDestinationSelect)\"\n #airportSelect\n combo\n [ariaLabelClear]=\"ariaLabelClear\" \n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\"\n [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select-new>\n <nas-airport-select-new *ngIf=\"airports && (!enableDestinationSelect)\"\n #airportSelect\n [ariaLabelClear]=\"ariaLabelClear\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\"\n [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\"\n [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\"\n [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\"\n [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\"\n [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\"\n [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\"\n [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\"\n (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select-new>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [nasClass]=\"getFilterClass('suggestions')\"\n [suggestions]=\"getSuggestions()\"\n [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <div [nasClass]=\"!enableDestinationSelect ? getClass('origin-combined') :\n getTravelDetailsClass('', ['combined', exists(enableDatepickers) && 'no-border', exists(minimize) && 'minimized'])\">\n <ng-container *ngIf=\"enablePassengersSelect\">\n <button (click)=\"onPassengerSelectOpen($event)\" [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\" [type]=\"'small'\"></nas-icon></div>\n </button>\n <!-- <nas-dropdown #passengerSelectDropdown\n *ngIf=\"passengers?.length > 0\"\n [nasClass]=\"getTravelDetailsClass('dropdown', 'passengers')\"\n [cssClass]=\"getTravelDetailsClass('dropdown')\"\n [label]=\"passengerSelectLabel\"\n [labelStyle]=\"{'width': '102px'}\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (openChange)=\"onPassengerSelectOpen($event)\"\n (keydown)=\"passengerKeyDown($event)\"> -->\n <div *ngIf=\"openPassengerSelect\">\n <nas-passenger-select-new\n [ariaLabelAdd]=\"ariaLabelAdd\"\n [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\"\n [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\"\n [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\"\n [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\"\n [title]=\"passengerSelectTitle\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\"\n [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\"\n (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select-new>\n <nas-button-new *ngIf=\"this.openPassengerSelect\" light block \n [disabled]=\"passengers[0].count === 0 && passengers[1].count === 0 && passengers[2].count === 0\" (click)=\"openPassengerSelect = false\">\n Done\n </nas-button-new>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTripSwitch\">\n <form [nasClass]=\"getClass('radio')\">\n <nas-radio-new #tripTypeRoundTrip [name]=\"'tripType'\" [value]=\"2\" [checked]=\"true\" (checkedChange)=\"onTripTypeChange(2)\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio-new>\n <nas-radio-new #tripTypeOneway [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\">\n {{tripSwitchOneWayLabel}}\n </nas-radio-new>\n </form>\n </ng-container>\n <div *ngIf=\"exists(enableDatepickers)\"\n [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo-new #datepickerCombo\n compact\n [inlineFlex]=\"inlineFlex\"\n [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\"\n [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\"\n [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\"\n [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\"\n [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\"\n [times]=\"times\"\n [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\"\n [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\"\n (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\"\n (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\"\n [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\"\n [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo-new>\n </div>\n <ng-container *ngIf=\"enableTransitSwitch\">\n <nas-button-new *ngIf=\"directOnlyLabel && directTransitLabel\"\n #transitSwitch\n block\n light\n [iconType]=\"'chevron-down'\"\n [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button-new>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type')\">\n <button [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\"\n type=\"button\"\n #transitTypeDirectOnly\n (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button type=\"button\"\n #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"subsidyDiscounts && subsidyDiscounts.length > 0\"\n [nasClass]=\"getFilterClass('subsidy-discount')\">\n <nas-subsidy-discount #subsidyDiscount\n [discounts]=\"subsidyDiscounts\"\n [selectedDiscount]=\"selectedSubsidyDiscount\"\n [label]=\"subsidyDiscountLabel\"\n (infoButtonClick)=\"onSubsidyDiscountInfoClick()\"\n (discountSelectChange)=\"onSubsidyDiscountSelectChange($event)\"\n (infoButtonKeydown)=\"onSubsidyDiscountInfoButtonKeydown($event)\"></nas-subsidy-discount>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter-new{position:relative;z-index:6}.nas-filter-new ::ng-deep .nas-filter-new__transit .nas-button-new__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter-new ::ng-deep .nas-filter-new__transit--active .nas-button-new__icon{transform:rotate(180deg)}.nas-filter-new ::ng-deep .nas-filter-new__transit--active .nas-button-new{background-color:#ebf4ff}.nas-filter-new__title{margin-top:24px;font-size:28px;line-height:34px}@media screen and (min-width: 640px){.nas-filter-new__title{font-size:32px;line-height:38px}}.nas-filter-new__title--md{margin-top:60px}.nas-filter-new__radio{display:flex;gap:24px;padding:12px}.nas-filter-new__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #6f6f6f;padding:9px 14px;width:100%}.nas-filter-new__passengers-button--active{background-color:#ebf4ff!important}.nas-filter-new__label{flex-direction:column;text-align:left}.nas-filter-new__label p{margin:0}.nas-filter-new__button-title{font-weight:700;font-size:14px}.nas-filter-new__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter-new__transit-type{border:2px solid #15273f}.nas-filter-new__transit-type button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter-new__filters{margin-top:12px}.nas-filter-new__filters .nas-filter-new__date-combo{order:2;flex:1;z-index:2}.nas-filter-new__filters--minimized .nas-filter-new__airport-select:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.nas-filter-new__filters--maximize .nas-filter-new__airport-select-new:after{display:none}.nas-filter-new__filters--md .nas-filter-new__date-combo{flex:0 0 100%}.nas-filter-new__filters--lg{align-items:stretch}.nas-filter-new__filters--lg .nas-filter-new__date-combo{order:3;flex:0 0 100%;z-index:1}.nas-filter-new__filters--lg .nas-filter-new__suggestions{order:3}.nas-filter-new__filters--lg .nas-filter-new__filters--minimized .nas-filter-new__airport-select{margin-right:0;flex:0 1 100%}.nas-filter-new__filters--lg .nas-filter-new__filters--maximize .nas-filter-new__airport-select{margin-right:3px;flex:auto}.nas-filter-new__filters--lg.nas-filter-new__filters--maximize .nas-filter-new__date-combo{border-bottom:3px solid #c3c3c3}.nas-filter-new__suggestions{flex-basis:100%;position:relative;margin-top:3px}.nas-filter-new__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter-new__airport-select--lg{width:0;margin:0 3px 0 0;flex:1 1 auto}.nas-filter-new__toggler{font-family:Apercu,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;font-size:18px;line-height:26px;color:#15273f;margin-top:6px;z-index:1}.nas-filter-new__toggler .nas-filter-new__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter-new__toggler .nas-filter-new__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #f1f1f1}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:26px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:26px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f8f8f8}.travel-details__action--border{border-bottom:2px solid #f1f1f1}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__dropdown--md.travel-details__dropdown--trip-type{order:2;flex:1;margin-right:3px}.travel-details__dropdown--md.travel-details__dropdown--transit-type{order:3;flex:1}.travel-details__dropdown--md.travel-details__dropdown--passengers{order:1;flex:1;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--trip-type{order:2;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg.travel-details__dropdown--transit-type{order:3;flex:1 1 auto}.travel-details__dropdown--lg.travel-details__dropdown--passengers{order:1;flex:1 1 auto;margin-right:3px}.travel-details__dropdown--lg:focus{outline:none}.travel-details__dropdown--lg:after{display:none}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}.travel-details--combined{order:3;flex:0 0 100%}.travel-details--combined.travel-details--md:after{content:\"\";position:absolute;bottom:-6px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--md .travel-details__dropdown{margin:0 3px 0 0}.travel-details--combined.travel-details--md .travel-details__dropdown:last-child{margin:0}.travel-details--combined.travel-details--md .dropdown__toggle{height:calc(100% - 3px);margin:0;padding-left:16px;padding-right:16px}.travel-details--combined.travel-details--lg{order:2;flex:0 0 auto;margin:0 0 0 -3px;padding-left:3px;z-index:2}.travel-details--combined.travel-details--lg:after{content:\"\";position:absolute;bottom:-3px;left:0px;width:100%;border-bottom:3px solid #c3c3c3}.travel-details--combined.travel-details--lg .dropdown__toggle{height:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-passenger-select-new__list-item{padding:6px 16px!important}::ng-deep .nas-radio-new{margin:0!important}::ng-deep .nas-button-new{margin-top:6px}::ng-deep .nas-checkbox-new{background-color:#f1f1f1;padding:12px;width:100%;padding-left:42px!important;margin-bottom:12px!important}::ng-deep .nas-checkbox-new__indicator{left:12px!important}::ng-deep .nas-filter-new__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter-new__filters .nas-filter-new__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-filter-new__date-combo--side-by-side .nas-datepicker-combo-new__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-airport-select-new__input-line{border-top:none!important}::ng-deep .nas-filter-new__filters .nas-airport-select-new-combo__separator{border-bottom:none!important}::ng-deep .nas-filter-new__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter-new__filters .nas-datepicker-combo-new__separator{display:none}::ng-deep .nas-filter-new__filters--lg .nas-dropdown__toggle{display:flex}::ng-deep .nas-filter-new__filters--lg .nas-filter-new__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:3px solid #c3c3c3}::ng-deep .nas-filter-new__filters--lg .nas-airport-select-new__input-line{border-top:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__filters--lg .nas-datepicker-combo-new__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__filters--lg .nas-airport-select-new-combo__separator{border-bottom:3px solid #c3c3c3!important}::ng-deep .nas-filter-new__rotate{transform:rotate(180deg)}::ng-deep .nas-filter-new__rotate-enter,::ng-deep .nas-filter-new__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter-new__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter-new__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__input-line{border-top:none}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new-combo__separator{border-top:none}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__results-wrapper{margin-top:0}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__results{top:-3px}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new__icon{bottom:18px}::ng-deep .nas-filter-new__airport-select--no-border .nas-airport-select-new:after{display:none}::ng-deep .nas-filter-new__airport-select .nas-airport-select-new__input-line{display:none}::ng-deep .nas-filter-new__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter-new__airport-origin-select .nas-airport-select-new:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter-new__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter-new__airport-origin-select .nas-airport-select-new:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter-new__origin-combined{border-bottom:3px solid #c3c3c3;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter-new__origin-combined{display:flex;flex:none}::ng-deep .nas-filter-new__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter-new__subsidy-discount{order:3}::ng-deep .nas-filter-new__subsidy-discount .nas-subsidy-discount{margin-top:16px}\n"] }]
1071
+ }], ctorParameters: function () { return [{ type: i1.DeviceHelper }, { type: i2.SortService }, { type: i3.AbandonedBasketService }, { type: i4.DateHelper }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { passengerSelectDropdown: [{
1072
+ type: ViewChild,
1073
+ args: ['passengerSelectDropdown']
1074
+ }], passengerSelect: [{
1075
+ type: ViewChild,
1076
+ args: ['passengerSelect']
1077
+ }], tripSwitch: [{
1078
+ type: ViewChild,
1079
+ args: ['tripSwitch']
1080
+ }], transitSwitch: [{
1081
+ type: ViewChild,
1082
+ args: ['transitSwitch']
1083
+ }], airportSelect: [{
1084
+ type: ViewChild,
1085
+ args: ['airportSelect']
1086
+ }], datepickerCombo: [{
1087
+ type: ViewChild,
1088
+ args: ['datepickerCombo']
1089
+ }], container: [{
1090
+ type: ViewChild,
1091
+ args: ['container']
1092
+ }], tripTypeOneway: [{
1093
+ type: ViewChild,
1094
+ args: ['tripTypeOneway']
1095
+ }], tripTypeRoundTrip: [{
1096
+ type: ViewChild,
1097
+ args: ['tripTypeRoundTrip']
1098
+ }], transitTypeDirectOnly: [{
1099
+ type: ViewChild,
1100
+ args: ['transitTypeDirectOnly']
1101
+ }], transitTypeTransit: [{
1102
+ type: ViewChild,
1103
+ args: ['transitTypeTransit']
1104
+ }], subsidyDiscount: [{
1105
+ type: ViewChild,
1106
+ args: ['subsidyDiscount']
1107
+ }], airportRelations: [{
1108
+ type: Input
1109
+ }], ariaLabelClear: [{
1110
+ type: Input
1111
+ }], ariaLabelSubtract: [{
1112
+ type: Input
1113
+ }], ariaLabelBackdrop: [{
1114
+ type: Input
1115
+ }], ariaLabelAdd: [{
1116
+ type: Input
1117
+ }], allowedOriginAirports: [{
1118
+ type: Input
1119
+ }], allowedDestinationAirports: [{
1120
+ type: Input
1121
+ }], displayLatestSearches: [{
1122
+ type: Input
1123
+ }], useSwitch: [{
1124
+ type: Input
1125
+ }], displayClosestAirports: [{
1126
+ type: Input
1127
+ }], originAirportCode: [{
1128
+ type: Input
1129
+ }], destinationAirportCode: [{
1130
+ type: Input
1131
+ }], passengerSelectLabel: [{
1132
+ type: Input
1133
+ }], maxPaxCount: [{
1134
+ type: Input
1135
+ }], passengers: [{
1136
+ type: Input
1137
+ }], minAdultCount: [{
1138
+ type: Input
1139
+ }], tripSwitchRoundTripLabel: [{
1140
+ type: Input
1141
+ }], tripSwitchOneWayLabel: [{
1142
+ type: Input
1143
+ }], directOnlyLabel: [{
1144
+ type: Input
1145
+ }], directTransitLabel: [{
1146
+ type: Input
1147
+ }], minimizeOnMobile: [{
1148
+ type: Input
1149
+ }], expandedAccordionMobile: [{
1150
+ type: Input
1151
+ }], defaultSummarySeparator: [{
1152
+ type: Input
1153
+ }], lastSummarySeparator: [{
1154
+ type: Input
1155
+ }], passengerSelectTitle: [{
1156
+ type: Input
1157
+ }], passengerSelectAdultsLabel: [{
1158
+ type: Input
1159
+ }], passengerSelectYouthsLabel: [{
1160
+ type: Input
1161
+ }], passengerSelectYoungAdultsLabel: [{
1162
+ type: Input
1163
+ }], passengerSelectChildrenLabel: [{
1164
+ type: Input
1165
+ }], passengerSelectInfantsLabel: [{
1166
+ type: Input
1167
+ }], groupBookingLabel: [{
1168
+ type: Input
1169
+ }], allAirportsLabel: [{
1170
+ type: Input
1171
+ }], latestSearchesLabel: [{
1172
+ type: Input
1173
+ }], closestAirportsLabel: [{
1174
+ type: Input
1175
+ }], selectOriginFirstLabel: [{
1176
+ type: Input
1177
+ }], labelOrigin: [{
1178
+ type: Input
1179
+ }], placeholderOrigin: [{
1180
+ type: Input
1181
+ }], labelDestination: [{
1182
+ type: Input
1183
+ }], geolocationLabel: [{
1184
+ type: Input
1185
+ }], geolocationBlockedLabel: [{
1186
+ type: Input
1187
+ }], placeholderDestination: [{
1188
+ type: Input
1189
+ }], keepSelection: [{
1190
+ type: Input
1191
+ }], editSearchTitle: [{
1192
+ type: Input
1193
+ }], nasFormGroup: [{
1194
+ type: Input
1195
+ }], nasFormControlNameOrigin: [{
1196
+ type: Input
1197
+ }], nasFormControlNameDestination: [{
1198
+ type: Input
1199
+ }], nasFormControlNameTripType: [{
1200
+ type: Input
1201
+ }], nasFormControlNameDirectOnly: [{
1202
+ type: Input
1203
+ }], nasFormControlNameOutbound: [{
1204
+ type: Input
1205
+ }], nasFormControlNameInbound: [{
1206
+ type: Input
1207
+ }], nasFormControlGroupBooking: [{
1208
+ type: Input
1209
+ }], nasFormControlNameSubsidyDiscount: [{
1210
+ type: Input
1211
+ }], overrideOrigin: [{
1212
+ type: Input
1213
+ }], enableSuggestions: [{
1214
+ type: Input
1215
+ }], closestAirports: [{
1216
+ type: Input
1217
+ }], minimize: [{
1218
+ type: Input
1219
+ }], airports: [{
1220
+ type: Input
1221
+ }], tripType: [{
1222
+ type: Input
1223
+ }], directOnly: [{
1224
+ type: Input
1225
+ }], groupBookingLimit: [{
1226
+ type: Input
1227
+ }], subsidyDiscounts: [{
1228
+ type: Input
1229
+ }], selectedSubsidyDiscount: [{
1230
+ type: Input
1231
+ }], subsidyDiscountLabel: [{
1232
+ type: Input
1233
+ }], ariaLabelPreviousMonth: [{
1234
+ type: Input
1235
+ }], ariaLabelNextMonth: [{
1236
+ type: Input
1237
+ }], originOpenChange: [{
1238
+ type: Output
1239
+ }], destinationOpenChange: [{
1240
+ type: Output
1241
+ }], passengerSelectOpenChange: [{
1242
+ type: Output
1243
+ }], originChange: [{
1244
+ type: Output
1245
+ }], destinationChange: [{
1246
+ type: Output
1247
+ }], passengersChange: [{
1248
+ type: Output
1249
+ }], tripTypeChange: [{
1250
+ type: Output
1251
+ }], directOnlyChange: [{
1252
+ type: Output
1253
+ }], noAvailableFlightsLabel: [{
1254
+ type: Input
1255
+ }], availableFlightsLabel: [{
1256
+ type: Input
1257
+ }], disablePastSelection: [{
1258
+ type: Input
1259
+ }], outboundLabel: [{
1260
+ type: Input
1261
+ }], inboundLabel: [{
1262
+ type: Input
1263
+ }], availability: [{
1264
+ type: Input
1265
+ }], outboundAvailableDates: [{
1266
+ type: Input
1267
+ }], inboundAvailableDates: [{
1268
+ type: Input
1269
+ }], times: [{
1270
+ type: Input
1271
+ }], dateDisplayFormat: [{
1272
+ type: Input
1273
+ }], timeDisplayFormat: [{
1274
+ type: Input
1275
+ }], locale: [{
1276
+ type: Input
1277
+ }], compact: [{
1278
+ type: Input
1279
+ }], outboundDisabled: [{
1280
+ type: Input
1281
+ }], inboundDisabled: [{
1282
+ type: Input
1283
+ }], enableDatepickers: [{
1284
+ type: Input
1285
+ }], minimizingLabel: [{
1286
+ type: Input
1287
+ }], maximizingLabel: [{
1288
+ type: Input
1289
+ }], directOnlyMobileLabel: [{
1290
+ type: Input
1291
+ }], orLabel: [{
1292
+ type: Input
1293
+ }], passengersTitleLabel: [{
1294
+ type: Input
1295
+ }], invalidDestinationText: [{
1296
+ type: Input
1297
+ }], outboundSelectedDate: [{
1298
+ type: Input
1299
+ }], inboundSelectedDate: [{
1300
+ type: Input
1301
+ }], enableDestinationSelect: [{
1302
+ type: Input
1303
+ }], enablePassengersSelect: [{
1304
+ type: Input
1305
+ }], enableTripSwitch: [{
1306
+ type: Input
1307
+ }], enableTransitSwitch: [{
1308
+ type: Input
1309
+ }], outboundSelectedDateChange: [{
1310
+ type: Output
1311
+ }], inboundSelectedDateChange: [{
1312
+ type: Output
1313
+ }], outboundOpenChange: [{
1314
+ type: Output
1315
+ }], inboundOpenChange: [{
1316
+ type: Output
1317
+ }], outboundMonthChange: [{
1318
+ type: Output
1319
+ }], inboundMonthChange: [{
1320
+ type: Output
1321
+ }], focusOnNextChange: [{
1322
+ type: Output
1323
+ }], positionChange: [{
1324
+ type: Output
1325
+ }], subsidyDiscountInfoClick: [{
1326
+ type: Output
1327
+ }] } });
1328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLW5ldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci1uZXcvZmlsdGVyLW5ldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci1uZXcvZmlsdGVyLW5ldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJ0RTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sa0JBQ1gsU0FBUSxnQkFBZ0I7SUE2QnhCLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFjO1FBQzdCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFD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aUI7c0JBQTFCLE1BQU07Z0JBT0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQU9HLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFPRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBT0csY0FBYztzQkFBdkIsTUFBTTtnQkFPRyx3QkFBd0I7c0JBQWpDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTm9yd2VnaWFuIEFpciBTaHV0dGxlLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmlwVHlwZSB9IGZyb20gJy4vZW51bXMvdHJpcC10eXBlLmVudW0nO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvYWJhbmRvbmVkLWJhc2tldC1pdGVtLm1vZGVsJztcbmltcG9ydCB7IENsYXNzTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9jbGFzcy5tb2RlbCc7XG5pbXBvcnQgeyBVdGNEYXRlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvdXRjLWRhdGUubW9kZWwnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYWJhbmRvbmVkLWJhc2tldC9hYmFuZG9uZWQtYmFza2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGF0ZS9kYXRlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IERldmljZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGV2aWNlL2RldmljZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvc29ydC9zb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWlycG9ydE1vZGVsIH0gZnJvbSAnLi4vYWlycG9ydC1zZWxlY3QtbmV3L21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhc3NlbmdlcnNNb2RlbCB9IGZyb20gJy4uL3Bhc3Nlbmdlci1zZWxlY3QvbW9kZWxzL3Bhc3NlbmdlcnMubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2lkeURpc2NvdW50TW9kZWwgfSBmcm9tICcuLi9zdWJzaWR5LWRpc2NvdW50L21vZGVscy9zdWJzaWR5LWRpc2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IFBhc3NlbmdlclNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3Bhc3Nlbmdlci1zZWxlY3QvcGFzc2VuZ2VyLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2lkeURpc2NvdW50Q29tcG9uZW50IH0gZnJvbSAnLi4vc3Vic2lkeS1kaXNjb3VudC9zdWJzaWR5LWRpc2NvdW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tYm9OZXdDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLWNvbWJvLW5ldy9kYXRlcGlja2VyLWNvbWJvLW5ldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWlycG9ydFNlbGVjdE5ld0NvbXBvbmVudCB9IGZyb20gJy4uL2FpcnBvcnQtc2VsZWN0LW5ldy9haXJwb3J0LXNlbGVjdC1uZXcuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE5vcndlZ2lhbiBGaWx0ZXIgQ29tcG9uZW50IHwgTmV3IGRlc2lnbiB8IEJldGFcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmFzLWZpbHRlci1uZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLW5ldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci1uZXcuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsdGVyTmV3Q29tcG9uZW50XG4gIGV4dGVuZHMgTmFzQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZFxue1xuICBAVmlld0NoaWxkKCdwYXNzZW5nZXJTZWxlY3REcm9wZG93bicpXG4gIHBhc3NlbmdlclNlbGVjdERyb3Bkb3duOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgncGFzc2VuZ2VyU2VsZWN0JykgcGFzc2VuZ2VyU2VsZWN0OiBQYXNzZW5nZXJTZWxlY3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBTd2l0Y2gnKSB0cmlwU3dpdGNoOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFN3aXRjaCcpIHRyYW5zaXRTd2l0Y2g6IERyb3Bkb3duQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgYWlycG9ydFNlbGVjdDogQWlycG9ydFNlbGVjdE5ld0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckNvbWJvJykgZGF0ZXBpY2tlckNvbWJvOiBEYXRlcGlja2VyQ29tYm9OZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVPbmV3YXknKSB0cmlwVHlwZU9uZXdheTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVSb3VuZFRyaXAnKSB0cmlwVHlwZVJvdW5kVHJpcDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFR5cGVEaXJlY3RPbmx5JykgdHJhbnNpdFR5cGVEaXJlY3RPbmx5OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0cmFuc2l0VHlwZVRyYW5zaXQnKSB0cmFuc2l0VHlwZVRyYW5zaXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNpZHlEaXNjb3VudCcpIHN1YnNpZHlEaXNjb3VudDogU3Vic2lkeURpc2NvdW50Q29tcG9uZW50O1xuXG4gIGxhdGVzdFNlYXJjaGVzT3JpZ2luOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBkaXNwbGF5U3VtbWFyeSA9IHRydWU7XG4gIG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBpbmJvdW5kTG93ZXJMaW1pdERhdGU6IFV0Y0RhdGU7XG4gIGNvbnRhaW5lcldpZHRoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBtYXhpbWl6ZSA9IGZhbHNlO1xuICBpc05hc0dyb3VwVmFsaWQgPSBmYWxzZTtcbiAgaW5saW5lRmxleCA9IDA7XG4gIG9wZW5QYXNzZW5nZXJTZWxlY3QgPSBmYWxzZTtcbiAgb3BlblRyYW5zaXRUeXBlU2VsZWN0ID0gZmFsc2U7XG5cbiAgZ2V0IG91dGJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZE9wZW5WYWx1ZTtcbiAgfVxuICBzZXQgb3V0Ym91bmRPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm91dGJvdW5kT3BlbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBpbmJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kT3BlblZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmluYm91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmluYm91bmRPcGVuVGltZW91dCBhcyBudW1iZXIpO1xuXG4gICAgdGhpcy5pbmJvdW5kT3BlblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZE9wZW5WYWx1ZSA9IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbmJvdW5kT3BlbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5ib3VuZE9wZW5UaW1lb3V0OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcmVjb3JkIGNvbnRhaW5pbmcga2V5cyB3aXRoIGFsbCBhaXJwb3J0IGNvZGVzIHdpdGggY29ycmVzcG9uZGluZyBhcnJheSBvZiBhaXJwb3J0IGNvZGVzIGNvbm5lY3RlZCB0byB0aGUga2V5LlxuICAgKi9cbiAgQElucHV0KCkgYWlycG9ydFJlbGF0aW9uczogUmVjb3JkPHN0cmluZywgQXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWRkcyAnYXJpYS1sYWJlbCcgb24gdGhlIGNsZWFyIGJ1dHRvbiBpbnNpZGUgdGhlIGFpcnBvcnQgc2VsZWN0IGlucHV0cy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIHN1YnRyYWN0IGJ1dHRvbnMuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxTdWJ0cmFjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgJ2FyaWEtbGFiZWwnIHRvIHRoZSBiYWNrZHJvcHMuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxCYWNrZHJvcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBhZGQgYnV0dG9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbEFkZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGlzdCBvZiBhaXJwb3J0cyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yaWdpbiBkcm9wZG93bi5cbiAgICogSWYgbm90IGluY2x1ZGVkLCBhbGwgYWlycG9ydHMgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd2VkT3JpZ2luQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gYXJyYXkgb2YgYWlycG9ydHMgdGhhdCBhcmUgcmVzdHJpY3RlZCBmb3IgZGVzdGluYXRpb24gYWlycG9ydHMuIEl0IHdpbGwgZGVmYXVsdCB0byBhaXJwb3J0cyBpZiBub3Qgc2V0LlxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dlZERlc3RpbmF0aW9uQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgYWlycG9ydHMgdGhhdCB0aGUgdXNlciBhbGxyZWFkeSBoYXMgc2VhcmggZm9yIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzcGxheSBzd2l0Y2ggVUkgdG8gaW50ZXJjaGFuZ2Ugb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBhaXJwb3J0LlxuICAgKi9cbiAgQElucHV0KCkgdXNlU3dpdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhaXJwb3J0cyB0aGF0IGFyZSBjbG9zZSB0byB0aGUgdXNlciBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheUNsb3Nlc3RBaXJwb3J0czogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgYWlycG9ydCBjb2RlIG9mIHRoZSBvcmlnaW4gYWlycG9ydC4gSXQgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIG9yaWdpbiBhaXJwb3J0IGJhc2VkIG9uIHRoaXMgdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKSBvcmlnaW5BaXJwb3J0Q29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBhaXJwb3J0IGNvZGUgb2YgdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQuIEl0IHdpbGwgc2V0IHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBhaXJwb3J0IGJhc2VkIG9uIHRoaXMgdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKSBkZXN0aW5hdGlvbkFpcnBvcnRDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0b3RhbCBtYXhpbXVtIGFtb3VudCBvZiBwYXNzZW5nZXJzIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWF4UGF4Q291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBhcnJheSBvZiBkaWZmZXJlbnQgcGFzc2VuZ2VyIHR5cGVzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcGFzc2VuZ2VycygpOiBBcnJheTxQYXNzZW5nZXJzTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5wYXNzZW5nZXJzVmFsdWU7XG4gIH1cbiAgc2V0IHBhc3NlbmdlcnModmFsdWU6IEFycmF5PFBhc3NlbmdlcnNNb2RlbD4pIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzZW5nZXJzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnBhc3NlbmdlcnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYWR1bHRzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWluQWR1bHRDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIHJvdW5kIHRyaXAgc2VsZWN0aW9uIGluIHRoZSB0cmlwIHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHRyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIG9uZSB3YXkgc2VsZWN0aW9uIGluIHRoZSB0cmlwIHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHRyaXBTd2l0Y2hPbmVXYXlMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIGRpcmVjdCBvbmx5IHNlbGVjdGlvbiBpbiB0aGUgdHJhbnNpdCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciBib3RoIGRpcmVjdCBhbmQgdHJhbnNpdCBzZWxlY3Rpb24gaW4gdGhlIHRyYW5zaXQgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0VHJhbnNpdExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIGJlIG1pbmltaXplZCBvbiBtb2JpbGUgc2NyZWVuIHNpemVzLlxuICAgKi9cbiAgQElucHV0KCkgbWluaW1pemVPbk1vYmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5kaWNhdGVzIGlmIHRoZSBlZGl0IHNlYXJjaCBvZiBhY2NvcmRpb24gc2hvdWxkIGJlIGV4cGVuZGVkIG9uIG1vYmlsZSBzY3JlZW4gc2l6ZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTtcbiAgfVxuICBzZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBzZXBhcmF0b3IgZm9yIHRoZSBmaWx0ZXIgc3VtbWFyeSB0aGF0IGlzIGRpc3BheWVkIGlmIG1pbmltaXplT25Nb2JpbGUgaXMgdHJ1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICogMSB0cmF2ZWxsZXIsIHJvdW5kIHRyaXAgYW5kIGRpcmVjdC90cmFuc2l0XG4gICAqL1xuICBASW5wdXQoKSBkZWZhdWx0U3VtbWFyeVNlcGFyYXRvciA9ICcnO1xuXG4gIC8qKlxuICAgKiBBIHNlcGFyYXRvciBmb3IgdGhlIGZpbHRlciBzdW1tYXJ5IGlzIGFyZSBkaXNwYXllZCBpZiBtaW5pbWl6ZU9uTW9iaWxlIGlzIHRydWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIDEgdHJhdmVsbGVyLCByb3VuZCB0cmlwIGFuZCBkaXJlY3QvdHJhbnNpdFxuICAgKi9cbiAgQElucHV0KCkgbGFzdFN1bW1hcnlTZXBhcmF0b3IgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRpdGxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdXRocyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdXRoc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdW5nIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdW5nQWR1bHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgY2hpbGRyZW4gcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RDaGlsZHJlbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGluZmFudHMgcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RJbmZhbnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgd2hlbiB0b3RhbCBudW1iZXIgb2Ygc2VsZWN0ZWQgcGFzc2VuZ2VycyBleGNlZWRzIHRoZSBncm91cCBib29raW5nIGxpbWl0XG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgYWxsIGFpcnBvcnRzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBhbGxBaXJwb3J0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgbGF0ZXN0IHNlYXJjaGVzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgY2xvc2VzdCBhaXJwb3J0cyBpbiB0aGUgYWlycG9ydCBzZWxlY3QgZHJvcCBkb3duIGxpc3RzLlxuICAgKi9cbiAgQElucHV0KCkgY2xvc2VzdEFpcnBvcnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGluIHRoZSBhaXJwb3J0IHNlbGVjdCwgaWYgdGhlXG4gICAqIHVzZXIgdHJpZXMgdG8gc2VsZWN0IGEgZGVzdGluYXRpb24gYWlycG9ydCB3aXRob3V0IHNlbGVjdGluZyBhbiBvcmlnaW4gYWlycG9ydC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE9yaWdpbkZpcnN0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbE9yaWdpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGFwcGVhciBvbiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlck9yaWdpbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBkZXN0aW5hdGlvbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxEZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBpbiBteSBsb2NhdGlvbiBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKSBnZW9sb2NhdGlvbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIGluIG15IGxvY2F0aW9uLCBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QgaWYgdXNlciBoYXMgZGVuaWVkIGdlb2xvY2F0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHBsYWNlaG9sZGVyIHRoYXQgd2lsbCBhcHBlYXIgb24gdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckRlc3RpbmF0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBtb2RpZmllciB0aGF0IHdpbGwgYWxsb3cgYWx3YXlzIGtlZXBpbmcgdGhlIHNlbGVjdGVkIGFpcnBvcnQuXG4gICAqIFRoZSBsYXN0IHNlbGVjdGVkIGFpcnBvcnQgd2lsbCBiZSBzaG93biBvbmNlIHVzZXIgY2xlYXJzIHRoZSBzZWxlY3Rpb24gYW5kIGJsdXIuXG4gICAqL1xuICBASW5wdXQoKSBrZWVwU2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdGl0bGUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGVkaXQgc2VhcmNoIGFjY29yZGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRTZWFyY2hUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgdGhlIHBhcmVudCdzIGZvcm0gZ3JvdXAuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IGlzIHJlcXVpZXJlZCB0byBiZSBmaWxsZWQgaWYgbmFzRm9ybUNvbnRyb2xOYW1lIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHk6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZUluYm91bmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1ha2UgbGF0ZXN0IHNlYXJjaGVzIGFuZCBnZW9sb2NhdGlvbiBvdmVycmlkZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBvcmlnaW4gYWlycG9ydCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlT3JpZ2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgZmlsdGVyIGRpc3BsYXkgc3VnZ2VzdGVkIGFpcnBvcnRzIGJhc2VkIG9uIGdlb2xvY2F0aW9uIGFuZCBsYXRlc3Qgc2VhcmNoZXMuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVTdWdnZXN0aW9ucz86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgZ2V0IGNsb3Nlc3RBaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZTtcbiAgfVxuICBzZXQgY2xvc2VzdEFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgaWYgKCFhaXJwb3J0cyB8fCBhaXJwb3J0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMub3ZlcnJpZGVPcmlnaW4pKSB7XG4gICAgICB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID0gYWlycG9ydHNbMF0uY29kZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgb25seSBkaXNwbGF5IGFpcnBvcnQgc2VsZWN0aW9uLiBXaGVuIGEgY2l0eSBwYWlyIGlzIHNlbGVjdGVkLCB0aGUgcmVzdCBvZiB0aGUgZmlsdGVyIHdpbGwgYmUgdmlzaWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXplPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWxsIGFpcnBvcnRzIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgaW50byB0aGUgZHJvcGRvd24gbGlzdHMuXG4gICAqIElmIGRpc3BsYXlMYXRlc3RTZWFyY2hlcyBpcyB0cnVlLCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIGxhdGVzdCBzZWFyY2hlcyBmcm9tIHRoZSBhYmFuZG9uZWQgYmFza2V0LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFpcnBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgdGhpcy5haXJwb3J0c1ZhbHVlID0gYWlycG9ydHM7XG5cbiAgICBpZiAodGhpcy5leGlzdHModGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMpKSB7XG4gICAgICBjb25zdCBhYmFuZG9uZWRCYXNrZXQgPSB0aGlzLmFiYW5kb25lZEJhc2tldFNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgICB0aGlzLnNldExhdGVzdFNlYXJjaGVzKGFiYW5kb25lZEJhc2tldCwgdGhpcy5haXJwb3J0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRyaXBUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlVmFsdWU7XG4gIH1cbiAgc2V0IHRyaXBUeXBlKHRyaXBUeXBlOiBUcmlwVHlwZSkge1xuICAgIGlmICh0cmlwVHlwZSA9PT0gdGhpcy50cmlwVHlwZVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlwVHlwZVZhbHVlID0gdHJpcFR5cGU7XG4gICAgdGhpcy50cmlwVHlwZUNoYW5nZS5lbWl0KHRoaXMudHJpcFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpcmVjdE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0T25seVZhbHVlO1xuICB9XG4gIHNldCBkaXJlY3RPbmx5KGRpcmVjdE9ubHk6IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0T25seSA9PT0gdGhpcy5kaXJlY3RPbmx5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpcmVjdE9ubHlWYWx1ZSA9IGRpcmVjdE9ubHk7XG4gICAgdGhpcy5kaXJlY3RPbmx5Q2hhbmdlLmVtaXQodGhpcy5kaXJlY3RPbmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBsaW1pdCBmb3Igd2hlbiB0aGUgdG90YWwgYW1vdW50IG9mIHBhc3NlbmdlcnMgZXhjZWVkcyB0byBiZSBhIGdyb3VwIGJvb2tpbmcuXG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMaW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN1YnNpZHkgZGlzY291bnRzXG4gICAqL1xuICBASW5wdXQoKSBzdWJzaWR5RGlzY291bnRzOiBBcnJheTxTdWJzaWR5RGlzY291bnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgc3Vic2lkeSBkaXNjb3VudFxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRTdWJzaWR5RGlzY291bnQ6IFN1YnNpZHlEaXNjb3VudE1vZGVsO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN1YnNpZHkgZGlzY291bnQgbGFiZWxcbiAgICovXG4gIEBJbnB1dCgpIHN1YnNpZHlEaXNjb3VudExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIHByZXZpb3VzIG1vbnRoIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxQcmV2aW91c01vbnRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIG5leHQgbW9udGggYnV0dG9uIGluIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbE5leHRNb250aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIG9yaWdpbiBkcm9wZG93biBzZWxlY3RvciBvcGVucyBvciBjbG9zZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgb3JpZ2luT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBvcmlnaW4gZHJvcGRvd24gc2VsZWN0b3Igb3BlbnMgb3IgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGRlc3RpbmF0aW9uT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duIG9wZW5zIG9yIGNsb3Nlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBwYXNzZW5nZXJTZWxlY3RPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIHNlbGVjdGVkIG9yaWdpbiBhaXJwb3J0IGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgb3JpZ2luQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBaXJwb3J0TW9kZWw+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24gYWlycG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGRlc3RpbmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBaXJwb3J0TW9kZWw+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSBhIHBhc3NlbmdlciBzZWxlY3Rpb24gY2hhbmdlIGlzIHBlcmZvcm1lZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwYXNzZW5nZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxQYXNzZW5nZXJzTW9kZWw+PigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGFuZCBnZXRzIHRoZSBzZWxlY3RlZCB0cmlwIHR5cGUuXG4gICAqL1xuICBAT3V0cHV0KCkgdHJpcFR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyaXBUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGFuZCBnZXRzIHdoZXRoZXIgdGhlIHNlbGVjdGVkIHRyYW5zaXQgdHlwZSBpcyBkaXJlY3Qgb25seSBvciBub3QuXG4gICAqL1xuICBAT3V0cHV0KCkgZGlyZWN0T25seUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3Igbm8gYXZhaWxhYmxlIGZsaWdodHMuXG4gICAqL1xuICBASW5wdXQoKSBub0F2YWlsYWJsZUZsaWdodHNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBhdmFpbGFibGUgZmxpZ2h0cy5cbiAgICovXG4gIEBJbnB1dCgpIGF2YWlsYWJsZUZsaWdodHNMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IGRhdGVzIGluIHRoZSBwYXN0LlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZVBhc3RTZWxlY3Rpb246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIG91dGJvdW5kIGRhdGVwaWNrZXIuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIGluYm91bmQgZGF0ZXBpY2tlci5cbiAgICovXG4gIEBJbnB1dCgpIGluYm91bmRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGRhdGVwaWNrZXJzIGluIGF2YWlsYWJpbGl0eSBtb2RlIHdoZXJlIGF2YWlsYWJsZSBkYXRlcyBjYW4gYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKSBhdmFpbGFiaWxpdHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXZhaWxhYmxlIGRhdGVzIGZvciBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIG91dGJvdW5kQXZhaWxhYmxlRGF0ZXM6IEFycmF5PFV0Y0RhdGU+O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEF2YWlsYWJsZSBkYXRlcyBmb3IgaW5ib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpIGluYm91bmRBdmFpbGFibGVEYXRlczogQXJyYXk8VXRjRGF0ZT47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSWYgc2V0LCBFbmFibGVzIHRoZSB0aW1lIGRyb3Bkb3duIHNlbGVjdG9yIGFsb25nc2lkZSBkYXRlcGlja2VyLlxuICAgKi9cbiAgQElucHV0KCkgdGltZXM6IEFycmF5PFV0Y0RhdGU+O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBkaXNwbGF5IGZvcm1hdCBvZiB0aGUgZGF0ZSB3aGVuIHVzZXIgaGFzIHNlbGVjdGVkIHRoZSBkYXRlIGFuZCBpdCBpcyBiZWluZyBzaG93biBpbiB0aGUgaW5wdXQgYm94IGZvciB0aGUgZGF0ZSBwaWNrZXIuXG4gICAqIFBsZWFzZSBsb29rIGF0IHRoZSBhbmd1bGFyIERhdGUgcGlwZSBmb3IgdmFsaWQgZm9ybWF0cyBhbmQgdmFyaWF0aW9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVEaXNwbGF5Rm9ybWF0ID0gJ0VFRSBkLCBNTU0nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0aW1lIGRpc3BsYXkgZm9ybWF0LlxuICAgKi9cbiAgQElucHV0KCkgdGltZURpc3BsYXlGb3JtYXQgPSAnSEg6bW0nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4gV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIExPQ0FMRV9JRCwgd2hpY2ggaXMgZW4tVVMgYnkgZGVmYXVsdC5cbiAgICogVGhpcyByZXF1aXJlcyB0aGF0IHJlZ2lzdGVyTG9jYWxlRGF0YSBpcyBjYWxsZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBsb2NhbGUuXG4gICAqL1xuICBASW5wdXQoKSBsb2NhbGUgPSAnZW4tR0InO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbW9kaWZpZXIgdG8gcmVtb3ZlIHRoZSBwYWRkaW5nIGFuZCBtYXJnaW5zIGFyb3VuZCB0aGUgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhY3Q6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzYWJsZSBwb3NzaWJpbGl0eSB0byBzZWxlY3Qgb3V0Ym91bmQgZGF0ZXMuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZERpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IGluYm91bmQgZGF0ZXMuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kRGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2hvdy9BZGQgZGF0ZSBwaWNrZXIgY29tYm8gaW50byB0aGUgZmlsdGVyIGlmIHNldCB0byB0cnVlLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlRGF0ZXBpY2tlcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciB0aGUgdG9nZ2xlIGljb24gZm9yIG1pbmltaXppbmcgZmlsdGVyLlxuICAgKi9cbiAgQElucHV0KCkgbWluaW1pemluZ0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciB0aGUgdG9nZ2xlIGljb24gZm9yIG1heGltaXppbmcgZmlsdGVyLlxuICAgKi9cbiAgQElucHV0KCkgbWF4aW1pemluZ0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciB0aGUgdG9nZ2xpbmcgdHJhbnNpdCB0eXBlIHdoZW4gZmlsdGVyIGlzIG1pbmltaXplZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdE9ubHlNb2JpbGVMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciAnb3InIGluIHRoZSBzdWdnZXN0aW9uZWQgYWlycG9ydHMuXG4gICAqL1xuICBASW5wdXQoKSBvckxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yICdUcmF2ZWxlcnMnIGluIHRoZSBwYXNzZW5nZXJzIHNlbGVjdCBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJzVGl0bGVMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGRlc3RpbmF0aW9ucyBkcm9wZG93biBsaXN0IHdoZW4gb3JpZ2luIGFpcnBvcnQgaXMgbm90IHNldC5cbiAgICovXG4gIEBJbnB1dCgpIGludmFsaWREZXN0aW5hdGlvblRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZWxlY3RlZCBkYXRlZm9yIG91dGJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG91dGJvdW5kU2VsZWN0ZWREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWU7XG4gIH1cbiAgc2V0IG91dGJvdW5kU2VsZWN0ZWREYXRlKGRhdGU6IFV0Y0RhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3V0Ym91bmRTZWxlY3RlZERhdGVWYWx1ZSA9IGRhdGU7XG4gICAgICB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZWxlY3RlZCBkYXRlZm9yIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaW5ib3VuZFNlbGVjdGVkRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRTZWxlY3RlZERhdGUoZGF0ZTogVXRjRGF0ZSkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgdGhlIGRlc3RpbmF0aW9uIGlucHV0LCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlRGVzdGluYXRpb25TZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdpbGwgZGlzcGxheSBwYXNzZW5nZXIgc2VsZWN0LCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlUGFzc2VuZ2Vyc1NlbGVjdCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSB0cmlwIHN3aXRjaCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVRyaXBTd2l0Y2ggPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdpbGwgZGlzcGxheSB0aGUgdHJhbnNpdCBzd2l0Y2gsIHNldCB0aGlzIHRvIGZhbHNlIHRvIHJlbW92ZSBpdC4gSXQncyB0cnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVUcmFuc2l0U3dpdGNoID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBzZWxlY3RlZCBkYXRlaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgb3V0Ym91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRTZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gc2VsZWN0ZWQgZGF0ZWhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgZGF0ZXBpY2tlciBpcyBvcGVuIG9yIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBvdXRib3VuZE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluYm91bmQgZGF0ZXBpY2tlciBpcyBvcGVuIG9yIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBpbmJvdW5kT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgY2FsZW5kYXIgY2hhbmdlcyBtb250aC5cbiAgICovXG4gIEBPdXRwdXQoKSBvdXRib3VuZE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmJvdW5kIGNhbGVuZGFyIGNoYW5nZXMgbW9udGguXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaGVuIGEgdXNlciBoYXMgYWN0aXZlbHkgY2hhbmdlZCB0aGUgZGF0ZS5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2N1c09uTmV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGdlb2xvY2F0aW9uIG9mIHRoZSB1c2VyLiBXaWxsIGJlIGVtaXR0ZWQgaWYgJ2VuYWJsZVN1Z2dlc3Rpb25zJyBpcyB0cnVlLlxuICAgKi9cbiAgQE91dHB1dCgpIHBvc2l0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9sb2NhdGlvblBvc2l0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVuIHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgaW5mbyBidXR0b24gb24gdGhlIHN1YnNpZHkgZGlzY291bnQgaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBzdWJzaWR5RGlzY291bnRJbmZvQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZ2V0IGluYm91bmRTZWxlY3RlZE1vbnRoKCk6IFV0Y0RhdGUge1xuICAgIHJldHVybiB0aGlzLmluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRTZWxlY3RlZE1vbnRoKG1vbnRoOiBVdGNEYXRlKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVNlcnZpY2UuaXNTYW1lTW9udGgobW9udGgsIHRoaXMuaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICAgICAgdGhpcy5pbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlID0gbW9udGg7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlOiBVdGNEYXRlO1xuICBwcml2YXRlIGluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgYWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSB0cmlwVHlwZVZhbHVlOiBUcmlwVHlwZTtcbiAgcHJpdmF0ZSBkaXJlY3RPbmx5VmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBvdXRib3VuZE9wZW5WYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIGluYm91bmRPcGVuVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYXNzZW5nZXJzVmFsdWUgPSBuZXcgQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPigpO1xuICBwcml2YXRlIGZvY3VzQXN5bmNUaW1vdXQ6IGFueTtcbiAgcHJpdmF0ZSB0cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgdHJpcFN3aXRjaEZvY3VzVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkZXZpY2VIZWxwZXI6IERldmljZUhlbHBlcixcbiAgICBwcml2YXRlIHNvcnRTZXJ2aWNlOiBTb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGFiYW5kb25lZEJhc2tldFNlcnZpY2U6IEFiYW5kb25lZEJhc2tldFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlU2VydmljZTogRGF0ZUhlbHBlcixcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcignbmFzLWZpbHRlci1uZXcnKTtcbiAgICB0aGlzLm5hdGl2ZUVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uYXNGb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTmFzR3JvdXBWYWxpZCA9IC90cnVlL2kudGVzdCh4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgZGlyZWN0T25seUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVjdE9ubHlDb250cm9sKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0T25seSA9IGRpcmVjdE9ubHlDb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlKSB7XG4gICAgICBjb25zdCB0cmlwVHlwZUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGVcbiAgICAgICk7XG5cbiAgICAgIGlmICh0cmlwVHlwZUNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy50cmlwVHlwZSA9IHRyaXBUeXBlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5pbmJvdW5kRGlzYWJsZWQgPSB0cmlwVHlwZUNvbnRyb2wudmFsdWUgPT09IFRyaXBUeXBlLm9uZVdheTtcblxuICAgICAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kKSB7XG4gICAgICAgICAgY29uc3QgaW5ib3VuZENvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZUluYm91bmRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGluYm91bmRDb250cm9sICYmIHRoaXMuaW5ib3VuZERpc2FibGVkKSB7XG4gICAgICAgICAgICBpbmJvdW5kQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJpcFR5cGVDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBUcmlwVHlwZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5ib3VuZERpc2FibGVkID0gdmFsdWUgPT09IFRyaXBUeXBlLm9uZVdheTtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpIHtcbiAgICAgIGNvbnN0IGRpcmVjdE9ubHlDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHlcbiAgICAgICk7XG4gICAgICBpZiAoZGlyZWN0T25seUNvbnRyb2wpIHtcbiAgICAgICAgZGlyZWN0T25seUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLmRpcmVjdE9ubHkgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGgubmV4dChcbiAgICAgICh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aFxuICAgICk7XG5cbiAgICB3aW5kb3cub25yZXNpemUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRhaW5lcldpZHRoLm5leHQoXG4gICAgICAgICh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aFxuICAgICAgKTtcbiAgICB9O1xuICAgIHRoaXMuc2V0SW5saW5lRmxleFdpZHRoKCk7XG4gIH1cblxuICBvblN1YnNpZHlEaXNjb3VudEluZm9DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNpZHlEaXNjb3VudEluZm9DbGljay5lbWl0KCk7XG4gIH1cblxuICBvblN1YnNpZHlEaXNjb3VudFNlbGVjdENoYW5nZShtb2RlbDogU3Vic2lkeURpc2NvdW50TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNpZHlEaXNjb3VudENvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVN1YnNpZHlEaXNjb3VudFxuICAgICk7XG4gICAgc3Vic2lkeURpc2NvdW50Q29udHJvbC5wYXRjaFZhbHVlKG1vZGVsKTtcbiAgfVxuXG4gIGdldENsb3Nlc3RBaXJwb3J0cyhwb3NpdGlvbjogR2VvbG9jYXRpb25Qb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25DaGFuZ2UuZW1pdChwb3NpdGlvbik7XG4gIH1cblxuICBnZXRGaWx0ZXJDbGFzcyhlbGVtZW50Pzogc3RyaW5nLCBtb2RpZmllcnNJbnB1dD86IGFueSk6IENsYXNzTW9kZWwge1xuICAgIGxldCBtb2RpZmllcnMgPSBtb2RpZmllcnNJbnB1dCB8fCBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1vZGlmaWVyc0lucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgbW9kaWZpZXJzSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmdcbiAgICApIHtcbiAgICAgIG1vZGlmaWVycyA9IFttb2RpZmllcnNJbnB1dF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGhzID0gW107XG5cbiAgICBpZiAodGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpKSB7XG4gICAgICB3aWR0aHMucHVzaCgnbWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aERlc2t0b3AodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSkge1xuICAgICAgd2lkdGhzLnB1c2goJ2xnJyk7XG4gICAgfVxuXG4gICAgbW9kaWZpZXJzID0gWy4uLm1vZGlmaWVycywgLi4ud2lkdGhzXTtcblxuICAgIHJldHVybiB0aGlzLmdldENsYXNzKGVsZW1lbnQsIG1vZGlmaWVycyk7XG4gIH1cblxuICBnZXRBaXJwb3J0U2VsZWN0Q2xhc3MoKTogQ2xhc3NNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoJ2FpcnBvcnQtc2VsZWN0LW5ldycsIFtcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ2xnJyxcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSAmJiAnbWQnLFxuICAgICAgdGhpcy5leGlzdHModGhpcy5lbmFibGVEYXRlcGlja2VycykgJiYgJ25vLWJvcmRlcicsXG4gICAgXSk7XG4gIH1cblxuICBnZXRTdWdnZXN0aW9ucygpOiBBcnJheTxBaXJwb3J0TW9kZWw+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgLi4uKHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW5cbiAgICAgICAgICA/IHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4uZmlsdGVyKFxuICAgICAgICAgICAgICAoeCkgPT4geC5jb2RlICE9PSB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLih0aGlzLmNsb3Nlc3RBaXJwb3J0c1xuICAgICAgICAgID8gdGhpcy5jbG9zZXN0QWlycG9ydHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoeCkgPT4geC5jb2RlICE9PSB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdKVxuICAgICk7XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnMuc2xpY2UoMCwgMyk7XG4gIH1cblxuICBnZXREYXRlUGlja2Vyc0NsYXNzKCk6IENsYXNzTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckNsYXNzKCdkYXRlLWNvbWJvLW5ldycsIFtcbiAgICAgIHRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpICYmICdtaW5pbWl6ZWQnLFxuICAgICAgdGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpID4gNTAwICYmICdzaWRlLWJ5LXNpZGUnLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKGVsZW1lbnQ/OiBzdHJpbmcsIG1vZGlmaWVyc0lucHV0PzogYW55KTogQ2xhc3NNb2RlbCB7XG4gICAgbGV0IG1vZGlmaWVycyA9IG1vZGlmaWVyc0lucHV0IHx8IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kaWZpZXJzSW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICBtb2RpZmllcnNJbnB1dCBpbnN0YW5jZW9mIFN0cmluZ1xuICAgICkge1xuICAgICAgbW9kaWZpZXJzID0gW21vZGlmaWVyc0lucHV0XTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aHMgPSBbXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ21kJyxcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ2xnJyxcbiAgICBdO1xuXG4gICAgbW9kaWZpZXJzID0gWy4uLm1vZGlmaWVycywgLi4ud2lkdGhzXTtcblxuICAgIGNvbnN0IHRyYXZlbERldGFpbHNCYXNlID0gbmV3IE5hc0NvbXBvbmVudEJhc2UoJ3RyYXZlbC1kZXRhaWxzJyk7XG4gICAgcmV0dXJuIHRyYXZlbERldGFpbHNCYXNlLmdldENsYXNzKGVsZW1lbnQsIG1vZGlmaWVycyk7XG4gIH1cblxuICBvbkluYm91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuaW5ib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICB9XG4gIG9uT3V0Ym91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMub3V0Ym91bmRNb250aENoYW5nZS5lbWl0KG1vbnRoKTtcbiAgfVxuXG4gIG9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25QcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYWJsZXREaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0UHJldmlvdXNDb250cm9sKCk7XG4gICAgfVxuICB9XG5cbiAgcGFzc2VuZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSB8fCB0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgIGlmICh0aGlzLnN1YnNpZHlEaXNjb3VudHMgJiYgdGhpcy5zdWJzaWR5RGlzY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2lkeURpc2NvdW50LmluZm9CdXR0b24uYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dENoYW5nZS5lbWl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgdGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PVxuICAgICAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25QYXNzZW5nZXJTZWxlY3RPcGVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudChcbiAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25UcmlwU3dpdGNoS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpIHx8ICF0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFByZXZpb3VzQ29udHJvbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gub3Blbikge1xuICAgICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4oZmFsc2UpO1xuICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNpdEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyYW5zaXRUeXBlVHJhbnNpdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0VHlwZURpcmVjdE9ubHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJhbnNpdFR5cGVEaXJlY3RPbmx5Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKDxhbnk+dGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3BlbighdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzaWR5RGlzY291bnRzICYmIHRoaXMuc3Vic2lkeURpc2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3Vic2lkeURpc2NvdW50LmluZm9CdXR0b24uYnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHRDaGFuZ2UuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKGZhbHNlKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudCh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uU3Vic2lkeURpc2NvdW50SW5mb0J1dHRvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmFuc2l0U3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25OZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmMoPGFueT50aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNBc3luYyhyZWZFbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNBc3luY1RpbW91dCk7XG5cbiAgICB0aGlzLmZvY3VzQXN5bmNUaW1vdXQgPSBzZXRUaW1lb3V0KCgpID0+XG4gICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHJlZkVsZW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckZvY3VzT25QcmV2aW91cyhldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5mb2N1c09uQWlycG9ydFNlbGVjdEJhY2t3YXJkcygpO1xuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNDb250cm9sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT25seSkge1xuICAgICAgICB0aGlzLm91dGJvdW5kT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluYm91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuYWlycG9ydFNlbGVjdC5jb21ibykpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uRGVzdGluYXRpb25PcGVuKHRydWUpO1xuICAgICAgICBpZiAoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmZvY3VzQXN5bmMoXG4gICAgICAgICAgICAoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24pLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uT3JpZ2luT3Blbih0cnVlKTtcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bk9yaWdpbikge1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyhcbiAgICAgICAgICAgICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRm9jdXNPbk5leHRDaGFuZ2UoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkgJiYgdGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KFxuICAgICAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNNb2JpbGVEaXNwbGF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoTW9iaWxlKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSk7XG4gIH1cblxuICBpc1RhYmxldERpc3BsYXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIG9uT3JpZ2luT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCAmJiAhdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlTWF4aW1pemUoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbk9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgdmFsaWRhdGVBaXJwb3J0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpblNuYXBzaG90ID0gdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblNuYXBzaG90ID0gdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uO1xuICAgIGlmIChcbiAgICAgIG9yaWdpblNuYXBzaG90ICYmXG4gICAgICBkZXN0aW5hdGlvblNuYXBzaG90ICYmXG4gICAgICBvcmlnaW5TbmFwc2hvdC5jb2RlICYmXG4gICAgICBvcmlnaW5TbmFwc2hvdC5jb2RlLmxlbmd0aCAmJlxuICAgICAgZGVzdGluYXRpb25TbmFwc2hvdC5jb2RlICYmXG4gICAgICBkZXN0aW5hdGlvblNuYXBzaG90LmNvZGUubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlTWF4aW1pemUoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1heGltaXplID0gdGhpcy52YWxpZGF0ZUFpcnBvcnRWYWx1ZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGVzdGluYXRpb25PcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICF0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heGltaXplKCk7XG4gICAgfVxuICAgIHRoaXMuZGVzdGluYXRpb25PcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gIH1cblxuICBvblBhc3NlbmdlclNlbGVjdE9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGFzc2VuZ2VyU2VsZWN0ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3Blbikge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3Blbikge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhc3NlbmdlclNlbGVjdE9wZW5DaGFuZ2UuZW1pdCh0aGlzLm9wZW5QYXNzZW5nZXJTZWxlY3QpO1xuXG4gICAgaWYgKHRoaXMub3BlblBhc3NlbmdlclNlbGVjdCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdD8ubnVtYmVyRmllbGRzLmZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3QubnVtYmVyRmllbGRzLmZpcnN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMzAwKTtcbiAgICB9XG4gIH1cblxuICBvblRyaXBTd2l0Y2hPcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50cmlwU3dpdGNoRm9jdXNUaW1lb3V0KTtcblxuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBvcGVuO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaEZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2l0U3dpdGNoT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3QgPSAhdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3Q7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudHJhbnNpdFN3aXRjaEZvY3VzVGltZW91dCk7XG5cbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gb3BlbjtcbiAgICB9XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25PcmlnaW5DaGFuZ2UoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5vcmlnaW5DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkT3JpZ2luQWlycG9ydChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIWFpcnBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uT3JpZ2luQ2hhbmdlKGFpcnBvcnQpO1xuXG4gICAgaWYgKHRoaXMub3JpZ2luQWlycG9ydENvZGUgPT09IGFpcnBvcnQuY29kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkRlc3RpbmF0aW9uQ2hhbmdlKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdGluYXRpb25DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldEZvY3VzT25QYXNzZW5nZXJTZWxlY3QoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1pbmltaXplID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKCg8YW55PnRoaXMuZGF0ZXBpY2tlckNvbWJvLmRhdGVwaWNrZXJPdXRib3VuZCkuaW5wdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSAmJiB0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudFJlZiA9IHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KGN1cnJlbnRFbGVtZW50UmVmKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRGb2N1c09uTmF0aXZlRWxlbWVudChlbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblRyaXBUeXBlQ2hhbmdlKHRyaXBUeXBlOiBUcmlwVHlwZSk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy50cmlwVHlwZSA9IHRyaXBUeXBlO1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpIHtcbiAgICAgIGNvbnN0IHRyaXBTd2l0Y2hDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlXG4gICAgICApO1xuICAgICAgdHJpcFN3aXRjaENvbnRyb2wucGF0Y2hWYWx1ZSh0cmlwVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2l0Q2hhbmdlKGRpcmVjdE9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZGlyZWN0T25seSA9IGRpcmVjdE9ubHk7XG5cbiAgICBpZiAodGhpcy5uYXNGb3JtR3JvdXAgJiYgdGhpcy5uYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5KSB7XG4gICAgICBjb25zdCB0cmlwVHlwZUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seVxuICAgICAgKTtcbiAgICAgIHRyaXBUeXBlQ29udHJvbC5wYXRjaFZhbHVlKGRpcmVjdE9ubHkpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5UcmFuc2l0VHlwZVNlbGVjdCA9ICF0aGlzLm9wZW5UcmFuc2l0VHlwZVNlbGVjdDtcbiAgfVxuXG4gIGdldFRyYXZlbERldGFpbHNUcmlwU3dpdGNoSWNvbkNsYXNzKG1vZGlmaWVycz86IGFueSk6IEFycmF5PENsYXNzTW9kZWw+IHtcbiAgICBjb25zdCBpY29uTWVkaXVtQmFzZSA9IG5ldyBOYXNDb21wb25lbnRCYXNlKCdpY29uLW1lZGl1bScpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGljb25NZWRpdW1CYXNlLmdldENsYXNzKCcnLCBtb2RpZmllcnMpLFxuICAgICAgdGhpcy5nZXRUcmF2ZWxEZXRhaWxzQ2xhc3MoJ2ljb24nKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0VHJpcFN3aXRjaExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJpcFR5cGUgPT09IFRyaXBUeXBlLnR3b1dheVJldHVyblxuICAgICAgPyB0aGlzLnRyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbFxuICAgICAgOiB0aGlzLnRyaXBTd2l0Y2hPbmVXYXlMYWJlbDtcbiAgfVxuXG4gIGdldFRyYW5zaXRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdE9ubHkgPyB0aGlzLmRpcmVjdE9ubHlMYWJlbCA6IHRoaXMuZGlyZWN0VHJhbnNpdExhYmVsO1xuICB9XG5cbiAgb25BY2NvcmRpb25Ub2dnbGVDaGFuZ2UoZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdW1tYXJ5ID0gIWV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0U3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBgJHt0aGlzLnBhc3NlbmdlclNlbGVjdExhYmVsfSR7dGhpcy5kZWZhdWx0U3VtbWFyeVNlcGFyYXRvcn1gICtcbiAgICAgIGAke3RoaXMuZ2V0VHJpcFN3aXRjaExhYmVsKCkudG9Mb3dlckNhc2UoKX0ke1xuICAgICAgICB0aGlzLmxhc3RTdW1tYXJ5U2VwYXJhdG9yXG4gICAgICB9JHt0aGlzLmdldFRyYW5zaXRMYWJlbCgpLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gIH1cblxuICBzaG91bGRNYXhpbWl6ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0ICYmXG4gICAgICB0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGUgJiZcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbiAmJlxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICF0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICh0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiB8fCB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW1pemU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSkge1xuICAgICAgaWYgKHRoaXMubWF4aW1pemUpIHtcbiAgICAgICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNOYXNHcm91cFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNPbkFpcnBvcnRTZWxlY3RCYWNrd2FyZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuYWlycG9ydFNlbGVjdC5jb21ibykpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbkRlc3RpbmF0aW9uT3Blbih0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24uaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uT3JpZ2luT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyhcbiAgICAgICAgKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bk9yaWdpbikuaW5wdXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYXRlc3RTZWFyY2hlcyhcbiAgICBhYmFuZG9uZWRCYXNrZXQ6IEFycmF5PEFiYW5kb25lZEJhc2tldEl0ZW1Nb2RlbD4sXG4gICAgYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCFhYmFuZG9uZWRCYXNrZXQgfHwgIWFpcnBvcnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IEFycmF5PEFiYW5kb25lZEJhc2tldEl0ZW1Nb2RlbD4oKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhYmFuZG9uZWRCYXNrZXQpIHtcbiAgICAgIGlmICghdW5pcXVlLnNvbWUoKHgpID0+IHguZGVzdGluYXRpb25Db2RlID09PSBpdGVtLmRlc3RpbmF0aW9uQ29kZSkpIHtcbiAgICAgICAgdW5pcXVlLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luQ29kZXMgPSB1bmlxdWUubWFwKCh4KSA9PiB4Lm9yaWdpbkNvZGUpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29kZXMgPSB1bmlxdWUubWFwKCh4KSA9PiB4LmRlc3RpbmF0aW9uQ29kZSk7XG5cbiAgICBjb25zdCBsYXRlc3RTZWFyY2hlc09yaWdpbiA9IGFpcnBvcnRzLmZpbHRlcigoYWlycG9ydCkgPT5cbiAgICAgIHVuaXF1ZS5zb21lKFxuICAgICAgICAoeCkgPT4geC5vcmlnaW5Db2RlLnRvTG93ZXJDYXNlKCkgPT09IGFpcnBvcnQuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24gPSBhaXJwb3J0cy5maWx0ZXIoKGFpcnBvcnQpID0+XG4gICAgICB1bmlxdWUuc29tZShcbiAgICAgICAgKHgpID0+IHguZGVzdGluYXRpb25Db2RlLnRvTG93ZXJDYXNlKCkgPT09IGFpcnBvcnQuY29kZS50b0xvd2VyQ2FzZSgpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGNvZGUgPSAnY29kZSc7XG4gICAgdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbiA9IHRoaXMuc29ydFNlcnZpY2VcbiAgICAgIC5zb3J0QnlPYmplY3QobGF0ZXN0U2VhcmNoZXNPcmlnaW4sIG9yaWdpbkNvZGVzLCBjb2RlKVxuICAgICAgLnNsaWNlKDAsIDMpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbiAmJlxuICAgICAgdGhpcy5sYXRlc3RTZWFyY2hlc09yaWdpbi5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmV4aXN0cyh0aGlzLm92ZXJyaWRlT3JpZ2luKVxuICAgICkge1xuICAgICAgdGhpcy5vcmlnaW5BaXJwb3J0Q29kZSA9IHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW5bMF0uY29kZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24gPSB0aGlzLnNvcnRTZXJ2aWNlXG4gICAgICAuc29ydEJ5T2JqZWN0KGxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb24sIGRlc3RpbmF0aW9uQ29kZXMsIGNvZGUpXG4gICAgICAuc2xpY2UoMCwgMyk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRHJvcGRvd25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbmxpbmVGbGV4V2lkdGgoKSB7XG4gICAgdGhpcy5pbmxpbmVGbGV4ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA+IDI5MCA/IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggOiAwO1xuICB9XG59XG4iLCI8bmFzLWFjY29yZGlvbiAqbmdJZj1cImRldmljZUhlbHBlcj8uaXNNb2JpbGUoKSAmJiBleGlzdHMobWluaW1pemVPbk1vYmlsZSk7IGVsc2UgZmlsdGVyVGVtcGxhdGVcIlxuICBzaW1wbGVcbiAgY29udGFpbmVyT25Ub2dnbGVcbiAgdHJhbnNwYXJlbnRcbiAgW2V4cGFuZGVkXT1cImV4cGFuZGVkQWNjb3JkaW9uTW9iaWxlXCJcbiAgW3RpdGxlXT1cImVkaXRTZWFyY2hUaXRsZVwiXG4gICh0b2dnbGVDaGFuZ2UpPVwib25BY2NvcmRpb25Ub2dnbGVDaGFuZ2UoJGV2ZW50KVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmFzLWFjY29yZGlvbj5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIlxuICAqbmdJZj1cImRldmljZUhlbHBlcj8uaXNNb2JpbGUoKSAmJiBleGlzdHMobWluaW1pemVPbk1vYmlsZSkgJiYgZGlzcGxheVN1bW1hcnlcIj57e2dldFN1bW1hcnkoKX19PC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyVGVtcGxhdGU+XG4gIDxkaXYgI2NvbnRhaW5lclxuICAgIFtuYXNDbGFzc109XCJnZXRDb250YWluZXJDbGFzcygpXCI+XG4gICAgPGRpdiBbbmFzQ2xhc3NdPVwiZ2V0RmlsdGVyQ2xhc3MoJ2ZpbHRlcnMnLCBbZXhpc3RzKG1pbmltaXplKSAmJiAnbWluaW1pemVkJywgbWF4aW1pemUgJiYgJ21heGltaXplJ10pXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWlycG9ydHM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPG5hcy1haXJwb3J0LXNlbGVjdC1uZXcgKm5nSWY9XCJhaXJwb3J0cyAmJiBhaXJwb3J0UmVsYXRpb25zICYmIChlbmFibGVEZXN0aW5hdGlvblNlbGVjdClcIlxuICAgICAgICAgICNhaXJwb3J0U2VsZWN0XG4gICAgICAgICAgY29tYm9cbiAgICAgICAgICBbYXJpYUxhYmVsQ2xlYXJdPVwiYXJpYUxhYmVsQ2xlYXJcIiBcbiAgICAgICAgICBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICAgICAgICAgIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luXT1cIm5hc0Zvcm1Db250cm9sTmFtZU9yaWdpblwiXG4gICAgICAgICAgW25hc0Zvcm1Db250cm9sTmFtZURlc3RpbmF0aW9uXT1cIm5hc0Zvcm1Db250cm9sTmFtZURlc3RpbmF0aW9uXCJcbiAgICAgICAgICBbdXNlU3dpdGNoXT1cInVzZVN3aXRjaFwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldEFpcnBvcnRTZWxlY3RDbGFzcygpXCJcbiAgICAgICAgICBbYWlycG9ydHNdPVwiYWlycG9ydHNcIlxuICAgICAgICAgIFthbGxvd2VkT3JpZ2luQWlwb3J0c109XCJhbGxvd2VkT3JpZ2luQWlycG9ydHNcIlxuICAgICAgICAgIFthbGxvd2VkRGVzdGluYXRpb25BaXJwb3J0c109XCJhbGxvd2VkRGVzdGluYXRpb25BaXJwb3J0c1wiXG4gICAgICAgICAgW2FpcnBvcnRSZWxhdGlvbnNdPVwiYWlycG9ydFJlbGF0aW9uc1wiXG4gICAgICAgICAgW2xhdGVzdFNlYXJjaGVzT3JpZ2luXT1cImxhdGVzdFNlYXJjaGVzT3JpZ2luXCJcbiAgICAgICAgICBbbGF0ZXN0U2VhcmNoZXNEZXN0aW5hdGlvbl09XCJsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uXCJcbiAgICAgICAgICBbZGlzcGxheUxhdGVzdFNlYXJjaGVzXT1cImRpc3BsYXlMYXRlc3RTZWFyY2hlc1wiXG4gICAgICAgICAgW2Rpc3BsYXlDbG9zZXN0QWlycG9ydHNdPVwiZGlzcGxheUNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgICAgW29yaWdpbkFpcnBvcnRDb2RlXT1cIm9yaWdpbkFpcnBvcnRDb2RlXCJcbiAgICAgICAgICBbZGVzdGluYXRpb25BaXJwb3J0Q29kZV09XCJkZXN0aW5hdGlvbkFpcnBvcnRDb2RlXCJcbiAgICAgICAgICBbYWxsQWlycG9ydHNMYWJlbF09XCJhbGxBaXJwb3J0c0xhYmVsXCJcbiAgICAgICAgICBbbGF0ZXN0U2VhcmNoZXNMYWJlbF09XCJsYXRlc3RTZWFyY2hlc0xhYmVsXCJcbiAgICAgICAgICBbY2xvc2VzdEFpcnBvcnRzTGFiZWxdPVwiY2xvc2VzdEFpcnBvcnRzTGFiZWxcIlxuICAgICAgICAgIFtjbG9zZXN0QWlycG9ydHNdPVwiY2xvc2VzdEFpcnBvcnRzXCJcbiAgICAgICAgICBbc2VsZWN0T3JpZ2luRmlyc3RMYWJlbF09XCJzZWxlY3RPcmlnaW5GaXJzdExhYmVsXCJcbiAgICAgICAgICBbbGFiZWxPcmlnaW5dPVwibGFiZWxPcmlnaW5cIlxuICAgICAgICAgIFtwbGFjZWhvbGRlck9yaWdpbl09XCJwbGFjZWhvbGRlck9yaWdpblwiXG4gICAgICAgICAgW2xhYmVsRGVzdGluYXRpb25dPVwibGFiZWxEZXN0aW5hdGlvblwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uTGFiZWxdPVwiZ2VvbG9jYXRpb25MYWJlbFwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uQmxvY2tlZExhYmVsXT1cImdlb2xvY2F0aW9uQmxvY2tlZExhYmVsXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJEZXN0aW5hdGlvbl09XCJwbGFjZWhvbGRlckRlc3RpbmF0aW9uXCJcbiAgICAgICAgICBba2VlcFNlbGVjdGlvbl09XCJrZWVwU2VsZWN0aW9uXCJcbiAgICAgICAgICBbaW52YWxpZERlc3RpbmF0aW9uVGV4dF09XCJpbnZhbGlkRGVzdGluYXRpb25UZXh0XCJcbiAgICAgICAgICAob3JpZ2luQ2hhbmdlKT1cInNldFNlbGVjdGVkT3JpZ2luQWlycG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAoZGVzdGluYXRpb25DaGFuZ2UpPVwib25EZXN0aW5hdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZm9jdXNPbk5leHQpPVwic2V0Rm9jdXNPblBhc3NlbmdlclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAob3JpZ2luT3BlbkNoYW5nZSk9XCJvbk9yaWdpbk9wZW4oJGV2ZW50KVwiXG4gICAgICAgICAgKGRlc3RpbmF0aW9uT3BlbkNoYW5nZSk9XCJvbkRlc3RpbmF0aW9uT3BlbigkZXZlbnQpXCJcbiAgICAgICAgICAocG9zaXRpb25DaGFuZ2UpPVwiZ2V0Q2xvc2VzdEFpcnBvcnRzKCRldmVudClcIj48L25hcy1haXJwb3J0LXNlbGVjdC1uZXc+XG4gICAgICAgIDxuYXMtYWlycG9ydC1zZWxlY3QtbmV3ICpuZ0lmPVwiYWlycG9ydHMgJiYgKCFlbmFibGVEZXN0aW5hdGlvblNlbGVjdClcIlxuICAgICAgICAgICNhaXJwb3J0U2VsZWN0XG4gICAgICAgICAgW2FyaWFMYWJlbENsZWFyXT1cImFyaWFMYWJlbENsZWFyXCJcbiAgICAgICAgICBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICAgICAgICAgIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luXT1cIm5hc0Zvcm1Db250cm9sTmFtZU9yaWdpblwiXG4gICAgICAgICAgW3VzZVN3aXRjaF09XCJ1c2VTd2l0Y2hcIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnYWlycG9ydC1vcmlnaW4tc2VsZWN0JylcIlxuICAgICAgICAgIFthaXJwb3J0c109XCJhaXJwb3J0c1wiXG4gICAgICAgICAgW2FsbG93ZWRPcmlnaW5BaXBvcnRzXT1cImFsbG93ZWRPcmlnaW5BaXJwb3J0c1wiXG4gICAgICAgICAgW2FpcnBvcnRSZWxhdGlvbnNdPVwiYWlycG9ydFJlbGF0aW9uc1wiXG4gICAgICAgICAgW2xhdGVzdFNlYXJjaGVzT3JpZ2luXT1cImxhdGVzdFNlYXJjaGVzT3JpZ2luXCJcbiAgICAgICAgICBbZGlzcGxheUxhdGVzdFNlYXJjaGVzXT1cImRpc3BsYXlMYXRlc3RTZWFyY2hlc1wiXG4gICAgICAgICAgW2Rpc3BsYXlDbG9zZXN0QWlycG9ydHNdPVwiZGlzcGxheUNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgICAgW29yaWdpbkFpcnBvcnRDb2RlXT1cIm9yaWdpbkFpcnBvcnRDb2RlXCJcbiAgICAgICAgICBbYWxsQWlycG9ydHNMYWJlbF09XCJhbGxBaXJwb3J0c0xhYmVsXCJcbiAgICAgICAgICBbbGF0ZXN0U2VhcmNoZXNMYWJlbF09XCJsYXRlc3RTZWFyY2hlc0xhYmVsXCJcbiAgICAgICAgICBbY2xvc2VzdEFpcnBvcnRzTGFiZWxdPVwiY2xvc2VzdEFpcnBvcnRzTGFiZWxcIlxuICAgICAgICAgIFtjbG9zZXN0QWlycG9ydHNdPVwiY2xvc2VzdEFpcnBvcnRzXCJcbiAgICAgICAgICBbc2VsZWN0T3JpZ2luRmlyc3RMYWJlbF09XCJzZWxlY3RPcmlnaW5GaXJzdExhYmVsXCJcbiAgICAgICAgICBbbGFiZWxPcmlnaW5dPVwibGFiZWxPcmlnaW5cIlxuICAgICAgICAgIFtwbGFjZWhvbGRlck9yaWdpbl09XCJwbGFjZWhvbGRlck9yaWdpblwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uTGFiZWxdPVwiZ2VvbG9jYXRpb25MYWJlbFwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uQmxvY2tlZExhYmVsXT1cImdlb2xvY2F0aW9uQmxvY2tlZExhYmVsXCJcbiAgICAgICAgICBba2VlcFNlbGVjdGlvbl09XCJrZWVwU2VsZWN0aW9uXCJcbiAgICAgICAgICAob3JpZ2luQ2hhbmdlKT1cInNldFNlbGVjdGVkT3JpZ2luQWlycG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAoZm9jdXNPbk5leHQpPVwic2V0Rm9jdXNPblBhc3NlbmdlclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAob3JpZ2luT3BlbkNoYW5nZSk9XCJvbk9yaWdpbk9wZW4oJGV2ZW50KVwiXG4gICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cImdldENsb3Nlc3RBaXJwb3J0cygkZXZlbnQpXCI+PC9uYXMtYWlycG9ydC1zZWxlY3QtbmV3PlxuICAgICAgICA8bmFzLXN1Z2dlc3Rpb25zICpuZ0lmPVwiKGNsb3Nlc3RBaXJwb3J0cyB8fCBsYXRlc3RTZWFyY2hlc09yaWdpbikgJiYgZXhpc3RzKGVuYWJsZVN1Z2dlc3Rpb25zKVwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldEZpbHRlckNsYXNzKCdzdWdnZXN0aW9ucycpXCJcbiAgICAgICAgICBbc3VnZ2VzdGlvbnNdPVwiZ2V0U3VnZ2VzdGlvbnMoKVwiXG4gICAgICAgICAgW29yTGFiZWxdPVwib3JMYWJlbFwiXG4gICAgICAgICAgKGFpcnBvcnRTZWxlY3QpPVwic2V0U2VsZWN0ZWRPcmlnaW5BaXJwb3J0KCRldmVudClcIj48L25hcy1zdWdnZXN0aW9ucz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZE1heGltaXplKClcIj5cbiAgICAgICAgPGRpdiBbbmFzQ2xhc3NdPVwiIWVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ID8gZ2V0Q2xhc3MoJ29yaWdpbi1jb21iaW5lZCcpIDpcbiAgICAgICAgICBnZXRUcmF2ZWxEZXRhaWxzQ2xhc3MoJycsIFsnY29tYmluZWQnLCBleGlzdHMoZW5hYmxlRGF0ZXBpY2tlcnMpICYmICduby1ib3JkZXInLCBleGlzdHMobWluaW1pemUpICYmICdtaW5pbWl6ZWQnXSlcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFzc2VuZ2Vyc1NlbGVjdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25QYXNzZW5nZXJTZWxlY3RPcGVuKCRldmVudClcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3Bhc3NlbmdlcnMtYnV0dG9uJywgb3BlblBhc3NlbmdlclNlbGVjdCAmJiAnYWN0aXZlJylcIj5cbiAgICAgICAgICAgICAgPGRpdiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xhYmVsJylcIj5cbiAgICAgICAgICAgICAgICA8cCBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2J1dHRvbi10aXRsZScpXCI+e3twYXNzZW5nZXJzVGl0bGVMYWJlbH19PC9wPlxuICAgICAgICAgICAgICAgIDxwPnt7cGFzc2VuZ2VyU2VsZWN0TGFiZWx9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmF2ZWxlci1pY29uJylcIj48bmFzLWljb24gW2ljb25dPVwiJ215LXByb2ZpbGUtY29tcGFjdCdcIiBbdHlwZV09XCInc21hbGwnXCI+PC9uYXMtaWNvbj48L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPCEtLSA8bmFzLWRyb3Bkb3duICNwYXNzZW5nZXJTZWxlY3REcm9wZG93blxuICAgICAgICAgICAgICAqbmdJZj1cInBhc3NlbmdlcnM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdkcm9wZG93bicsICdwYXNzZW5nZXJzJylcIlxuICAgICAgICAgICAgICBbY3NzQ2xhc3NdPVwiZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdkcm9wZG93bicpXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInBhc3NlbmdlclNlbGVjdExhYmVsXCJcbiAgICAgICAgICAgICAgW2xhYmVsU3R5bGVdPVwieyd3aWR0aCc6ICcxMDJweCd9XCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCJcbiAgICAgICAgICAgICAgKG9wZW5DaGFuZ2UpPVwib25QYXNzZW5nZXJTZWxlY3RPcGVuKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJwYXNzZW5nZXJLZXlEb3duKCRldmVudClcIj4gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3BlblBhc3NlbmdlclNlbGVjdFwiPlxuICAgICAgICAgICAgICA8bmFzLXBhc3Nlbmdlci1zZWxlY3QtbmV3XG4gICAgICAgICAgICAgICAgW2FyaWFMYWJlbEFkZF09XCJhcmlhTGFiZWxBZGRcIlxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxTdWJ0cmFjdF09XCJhcmlhTGFiZWxTdWJ0cmFjdFwiXG4gICAgICAgICAgICAgICAgW2FkdWx0c0xhYmVsXT1cInBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsXCJcbiAgICAgICAgICAgICAgICBbeW91dGhzTGFiZWxdPVwicGFzc2VuZ2VyU2VsZWN0WW91dGhzTGFiZWxcIlxuICAgICAgICAgICAgICAgIFt5b3VuZ0FkdWx0c0xhYmVsXT1cInBhc3NlbmdlclNlbGVjdFlvdW5nQWR1bHRzTGFiZWxcIlxuICAgICAgICAgICAgICAgIFtjaGlsZHJlbkxhYmVsXT1cInBhc3NlbmdlclNlbGVjdENoaWxkcmVuTGFiZWxcIlxuICAgICAgICAgICAgICAgIFtpbmZhbnRzTGFiZWxdPVwicGFzc2VuZ2VyU2VsZWN0SW5mYW50c0xhYmVsXCJcbiAgICAgICAgICAgICAgICBbbWF4UGF4Q291bnRdPVwibWF4UGF4Q291bnRcIlxuICAgICAgICAgICAgICAgIFttaW5BZHVsdENvdW50XT1cIm1pbkFkdWx0Q291bnRcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJwYXNzZW5nZXJTZWxlY3RUaXRsZVwiXG4gICAgICAgICAgICAgICAgW25hc0Zvcm1Hcm91cF09XCJuYXNGb3JtR3JvdXBcIlxuICAgICAgICAgICAgICAgIFtuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZ109XCJuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZ1wiXG4gICAgICAgICAgICAgICAgW2dyb3VwQm9va2luZ0xhYmVsXT1cImdyb3VwQm9va2luZ0xhYmVsXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBCb29raW5nTGltaXRdPVwiZ3JvdXBCb29raW5nTGltaXRcIlxuICAgICAgICAgICAgICAgIChmb2N1c09uTmV4dCk9XCJvblBhc3NlbmdlcnNTZWxlY3RGb2N1c09uTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAoZm9jdXNPblByZXZpb3VzKT1cIm9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25QcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICBbKHBhc3NlbmdlcnMpXT1cInBhc3NlbmdlcnNcIj48L25hcy1wYXNzZW5nZXItc2VsZWN0LW5ldz5cbiAgICAgICAgICAgICAgICA8bmFzLWJ1dHRvbi1uZXcgKm5nSWY9XCJ0aGlzLm9wZW5QYXNzZW5nZXJTZWxlY3RcIiBsaWdodCBibG9jayBcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwYXNzZW5nZXJzWzBdLmNvdW50ID09PSAwICYmIHBhc3NlbmdlcnNbMV0uY291bnQgPT09IDAgJiYgcGFzc2VuZ2Vyc1syXS5jb3VudCA9PT0gMFwiIChjbGljayk9XCJvcGVuUGFzc2VuZ2VyU2VsZWN0ID0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgICA8L25hcy1idXR0b24tbmV3PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlVHJpcFN3aXRjaFwiPlxuICAgICAgICAgICAgPGZvcm0gW25hc0NsYXNzXT1cImdldENsYXNzKCdyYWRpbycpXCI+XG4gICAgICAgICAgICAgIDxuYXMtcmFkaW8tbmV3ICN0cmlwVHlwZVJvdW5kVHJpcCBbbmFtZV09XCIndHJpcFR5cGUnXCIgW3ZhbHVlXT1cIjJcIiBbY2hlY2tlZF09XCJ0cnVlXCIgKGNoZWNrZWRDaGFuZ2UpPVwib25UcmlwVHlwZUNoYW5nZSgyKVwiPlxuICAgICAgICAgICAgICAgIHt7dHJpcFN3aXRjaFJvdW5kVHJpcExhYmVsfX1cbiAgICAgICAgICAgICAgPC9uYXMtcmFkaW8tbmV3PlxuICAgICAgICAgICAgICA8bmFzLXJhZGlvLW5ldyAjdHJpcFR5cGVPbmV3YXkgW25hbWVdPVwiJ3RyaXBUeXBlJ1wiIFt2YWx1ZV09XCIxXCIgKGNoZWNrZWRDaGFuZ2UpPVwib25UcmlwVHlwZUNoYW5nZSgxKVwiPlxuICAgICAgICAgICAgICAgIHt7dHJpcFN3aXRjaE9uZVdheUxhYmVsfX1cbiAgICAgICAgICAgICAgPC9uYXMtcmFkaW8tbmV3PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJleGlzdHMoZW5hYmxlRGF0ZXBpY2tlcnMpXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0RGF0ZVBpY2tlcnNDbGFzcygpXCI+XG4gICAgICAgICAgPG5hcy1kYXRlcGlja2VyLWNvbWJvLW5ldyAjZGF0ZXBpY2tlckNvbWJvXG4gICAgICAgICAgICBjb21wYWN0XG4gICAgICAgICAgICBbaW5saW5lRmxleF09XCJpbmxpbmVGbGV4XCJcbiAgICAgICAgICAgIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICAgIFtuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZF09XCJuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZFwiXG4gICAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZF09XCJuYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kXCJcbiAgICAgICAgICAgIFthdmFpbGFiaWxpdHldPVwiYXZhaWxhYmlsaXR5XCJcbiAgICAgICAgICAgIFthdmFpbGFibGVGbGlnaHRzTGFiZWxdPVwiYXZhaWxhYmxlRmxpZ2h0c0xhYmVsXCJcbiAgICAgICAgICAgIFtkYXRlRGlzcGxheUZvcm1hdF09XCJkYXRlRGlzcGxheUZvcm1hdFwiXG4gICAgICAgICAgICBbZGlzYWJsZVBhc3RTZWxlY3Rpb25dPVwiZGlzYWJsZVBhc3RTZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGVcIlxuICAgICAgICAgICAgW25vQXZhaWxhYmxlRmxpZ2h0c0xhYmVsXT1cIm5vQXZhaWxhYmxlRmxpZ2h0c0xhYmVsXCJcbiAgICAgICAgICAgIFtpbmJvdW5kQXZhaWxhYmxlRGF0ZXNdPVwiaW5ib3VuZEF2YWlsYWJsZURhdGVzXCJcbiAgICAgICAgICAgIFtpbmJvdW5kTGFiZWxdPVwiaW5ib3VuZExhYmVsXCJcbiAgICAgICAgICAgIFtub0F2YWlsYWJsZUZsaWdodHNMYWJlbF09XCJub0F2YWlsYWJsZUZsaWdodHNMYWJlbFwiXG4gICAgICAgICAgICBbb3V0Ym91bmRBdmFpbGFibGVEYXRlc109XCJvdXRib3VuZEF2YWlsYWJsZURhdGVzXCJcbiAgICAgICAgICAgIFtvdXRib3VuZExhYmVsXT1cIm91dGJvdW5kTGFiZWxcIlxuICAgICAgICAgICAgW3RpbWVEaXNwbGF5Rm9ybWF0XT1cInRpbWVEaXNwbGF5Rm9ybWF0XCJcbiAgICAgICAgICAgIFt0aW1lc109XCJ0aW1lc1wiXG4gICAgICAgICAgICBbb3V0Ym91bmREaXNhYmxlZF09XCJvdXRib3VuZERpc2FibGVkXCJcbiAgICAgICAgICAgIFtpbmJvdW5kRGlzYWJsZWRdPVwiaW5ib3VuZERpc2FibGVkXCJcbiAgICAgICAgICAgIFtvdXRib3VuZE9ubHldPVwidHJpcFR5cGUgPT09IDFcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxQcmV2aW91c01vbnRoXT1cImFyaWFMYWJlbFByZXZpb3VzTW9udGhcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbE5leHRNb250aF09XCJhcmlhTGFiZWxOZXh0TW9udGhcIlxuICAgICAgICAgICAgKGZvY3VzT25OZXh0Q2hhbmdlKT1cIm9uRm9jdXNPbk5leHRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZm9jdXNPblByZXZpb3VzQ2hhbmdlKT1cIm9uRGF0ZXBpY2tlckZvY3VzT25QcmV2aW91cygkZXZlbnQpXCJcbiAgICAgICAgICAgIChpbmJvdW5kTW9udGhDaGFuZ2UpPVwib25JbmJvdW5kTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3V0Ym91bmRNb250aENoYW5nZSk9XCJvbk91dGJvdW5kTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbKG91dGJvdW5kT3BlbildPVwib3V0Ym91bmRPcGVuXCJcbiAgICAgICAgICAgIFsoaW5ib3VuZE9wZW4pXT1cImluYm91bmRPcGVuXCJcbiAgICAgICAgICAgIFsoaW5ib3VuZFNlbGVjdGVkRGF0ZSldPVwiaW5ib3VuZFNlbGVjdGVkRGF0ZVwiXG4gICAgICAgICAgICBbKG91dGJvdW5kU2VsZWN0ZWREYXRlKV09XCJvdXRib3VuZFNlbGVjdGVkRGF0ZVwiPlxuICAgICAgICAgIDwvbmFzLWRhdGVwaWNrZXItY29tYm8tbmV3PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVRyYW5zaXRTd2l0Y2hcIj5cbiAgICAgICAgICA8bmFzLWJ1dHRvbi1uZXcgKm5nSWY9XCJkaXJlY3RPbmx5TGFiZWwgJiYgZGlyZWN0VHJhbnNpdExhYmVsXCJcbiAgICAgICAgICAgICN0cmFuc2l0U3dpdGNoXG4gICAgICAgICAgICBibG9ja1xuICAgICAgICAgICAgbGlnaHRcbiAgICAgICAgICAgIFtpY29uVHlwZV09XCInY2hldnJvbi1kb3duJ1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwiZ2V0VHJhbnNpdExhYmVsKClcIlxuICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmFuc2l0Jywgb3BlblRyYW5zaXRUeXBlU2VsZWN0ICYmICdhY3RpdmUnKVwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVHJhbnNpdFN3aXRjaE9wZW4oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJ0cmFuc2l0S2V5RG93bigkZXZlbnQpXCI+e3sgZ2V0VHJhbnNpdExhYmVsKCkgfX1cbiAgICAgICAgICA8L25hcy1idXR0b24tbmV3PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcGVuVHJhbnNpdFR5cGVTZWxlY3RcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3RyYW5zaXQtdHlwZScpXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFtuYXNDbGFzc109XCJnZXRUcmF2ZWxEZXRhaWxzQ2xhc3MoJ2FjdGlvbicsIGRpcmVjdE9ubHkgJiYgJ2FjdGl2ZScpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICN0cmFuc2l0VHlwZURpcmVjdE9ubHlcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVHJhbnNpdENoYW5nZSh0cnVlKVwiPnt7IGRpcmVjdE9ubHlMYWJlbCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAjdHJhbnNpdFR5cGVUcmFuc2l0XG4gICAgICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRUcmF2ZWxEZXRhaWxzQ2xhc3MoJ2FjdGlvbicsICFkaXJlY3RPbmx5ICYmICdhY3RpdmUnKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRyYW5zaXRDaGFuZ2UoZmFsc2UpXCI+e3sgZGlyZWN0VHJhbnNpdExhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic3Vic2lkeURpc2NvdW50cyAmJiBzdWJzaWR5RGlzY291bnRzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRGaWx0ZXJDbGFzcygnc3Vic2lkeS1kaXNjb3VudCcpXCI+XG4gICAgICAgICAgPG5hcy1zdWJzaWR5LWRpc2NvdW50ICNzdWJzaWR5RGlzY291bnRcbiAgICAgICAgICAgIFtkaXNjb3VudHNdPVwic3Vic2lkeURpc2NvdW50c1wiXG4gICAgICAgICAgICBbc2VsZWN0ZWREaXNjb3VudF09XCJzZWxlY3RlZFN1YnNpZHlEaXNjb3VudFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwic3Vic2lkeURpc2NvdW50TGFiZWxcIlxuICAgICAgICAgICAgKGluZm9CdXR0b25DbGljayk9XCJvblN1YnNpZHlEaXNjb3VudEluZm9DbGljaygpXCJcbiAgICAgICAgICAgIChkaXNjb3VudFNlbGVjdENoYW5nZSk9XCJvblN1YnNpZHlEaXNjb3VudFNlbGVjdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChpbmZvQnV0dG9uS2V5ZG93bik9XCJvblN1YnNpZHlEaXNjb3VudEluZm9CdXR0b25LZXlkb3duKCRldmVudClcIj48L25hcy1zdWJzaWR5LWRpc2NvdW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19