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

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 (50) hide show
  1. package/esm2022/lib/components/almatar-aside/aside.component.mjs +6 -7
  2. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +2 -2
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +2 -2
  4. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +13 -4
  5. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
  6. package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
  7. package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
  8. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
  9. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
  10. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
  11. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
  12. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
  13. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
  14. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
  15. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
  16. package/esm2022/lib/config/dashboard.config.mjs +3 -1
  17. package/esm2022/lib/models/reissue.types.mjs +2 -0
  18. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
  19. package/esm2022/lib/services/reissue.service.mjs +142 -0
  20. package/esm2022/lib/services/toast.service.mjs +15 -7
  21. package/esm2022/lib/utils/reissue-format.mjs +64 -0
  22. package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
  23. package/esm2022/public-api.mjs +3 -1
  24. package/fesm2022/almatar-smart-booking-dashboard.mjs +1919 -25
  25. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  26. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  27. package/lib/components/almatar-aside/aside.component.d.ts +1 -2
  28. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +1 -1
  29. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -0
  30. package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
  31. package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
  32. package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
  33. package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
  34. package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
  35. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
  36. package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
  37. package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
  38. package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
  39. package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
  40. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  41. package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
  42. package/lib/config/dashboard.config.d.ts +29 -0
  43. package/lib/models/reissue.types.d.ts +147 -0
  44. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
  45. package/lib/services/reissue.service.d.ts +45 -0
  46. package/lib/services/toast.service.d.ts +14 -1
  47. package/lib/utils/reissue-format.d.ts +28 -0
  48. package/lib/utils/reissue-url.builder.d.ts +24 -0
  49. package/package.json +9 -7
  50. package/public-api.d.ts +5 -1
@@ -0,0 +1,349 @@
1
+ import { Injectable, computed, inject, signal } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { EMPTY, Subject, of, throwError } from 'rxjs';
4
+ import { catchError, debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';
5
+ import { SBD_CONFIG } from '../../config/dashboard.config';
6
+ import { SbdReissueService } from '../../services/reissue.service';
7
+ import { buildReissueBookingContext, buildReissueSearchUrl } from '../../utils/reissue-url.builder';
8
+ import { destinationAirport, formatReissueDate, formatShortDate, formatTime, isLegFlown, legTitle, originAirport, todayIso, } from '../../utils/reissue-format';
9
+ import * as i0 from "@angular/core";
10
+ export function buildLegRow(leg, available, selected, unavailableReason = 'offline') {
11
+ const flown = isLegFlown(leg);
12
+ return {
13
+ leg,
14
+ direction: leg.direction,
15
+ from: leg.originCode,
16
+ to: leg.destinationCode,
17
+ dateLabel: formatShortDate(leg.departure),
18
+ depTime: formatTime(leg.departure),
19
+ arrTime: formatTime(leg.arrival),
20
+ stopsLabel: leg.stops > 0 ? `${leg.stops} stop${leg.stops > 1 ? 's' : ''}` : 'Direct',
21
+ airlineLine: [leg.airline, leg.flightNo].filter(Boolean).join(' · '),
22
+ flown,
23
+ available: available && !flown,
24
+ reason: flown ? 'flown' : available ? null : unavailableReason,
25
+ selected: selected && !flown,
26
+ };
27
+ }
28
+ const START_ERROR = 'Could not start the reissue request.';
29
+ const AVAILABILITY_ERROR = 'Could not check availability for this booking.';
30
+ /** `base (HTTP 500: message from the backend)` — so the agent (and we, while the APIs are new) can see why it failed. */
31
+ function describeHttpError(base, e) {
32
+ const err = e;
33
+ // The backend sends both: `error` (the real reason, e.g. "Unauthorized!") and a generic `message`.
34
+ const body = typeof err?.error === 'string' ? [err.error] : [err?.error?.error, err?.error?.message];
35
+ const text = body.filter(Boolean).join(' — ').slice(0, 200);
36
+ const detail = [err?.status ? `HTTP ${err.status}` : '', text].filter(Boolean).join(': ');
37
+ return detail ? `${base} (${detail})` : base;
38
+ }
39
+ /**
40
+ * State + rules of the Reissue dialog (one instance per dialog, provided by the dialog component).
41
+ * The step components are presentational: they get view models from here through the dialog shell.
42
+ */
43
+ export class SbdReissueStore {
44
+ constructor() {
45
+ this.api = inject(SbdReissueService);
46
+ this.config = inject(SBD_CONFIG);
47
+ this.today = todayIso();
48
+ // ── state ─────────────────────────────────────────────────────────────────
49
+ this.booking = signal(null);
50
+ this.step = signal('service');
51
+ this.loading = signal(false);
52
+ this.error = signal(null);
53
+ this.postBookingId = signal('');
54
+ this.service = signal(null);
55
+ /** Raw upgrade-class response; `null` when not loaded / not offered. Read by `SbdReissueUpgradeStore`. */
56
+ this.upgradeOptions = signal(null);
57
+ this.upgradeAvailable = computed(() => this.api.hasUpgradeOptions(this.upgradeOptions()));
58
+ this.availableIds = signal(new Set());
59
+ /** The availability call answered (so "no leg available" is a real answer, not "still loading"). */
60
+ this.availabilityLoaded = signal(false);
61
+ this.selectedLegIds = signal([]);
62
+ /** The "select flight" step was skipped (one-way): Back from the edit step returns to the service list. */
63
+ this.legsStepSkipped = signal(false);
64
+ this.dateEdits = signal({});
65
+ this.routeEdits = signal({});
66
+ this.searchedAirports = signal([]);
67
+ this.load$ = new Subject();
68
+ this.airportTerm$ = new Subject();
69
+ // ── derived ───────────────────────────────────────────────────────────────
70
+ this.ctx = computed(() => {
71
+ const b = this.booking();
72
+ return b ? buildReissueBookingContext(b.data, b.id) : null;
73
+ });
74
+ this.legs = computed(() => this.ctx()?.legs ?? []);
75
+ this.selectedSet = computed(() => new Set(this.selectedLegIds()));
76
+ this.selectedLegs = computed(() => this.legs().filter(l => this.selectedSet().has(l.legId)));
77
+ this.legRows = computed(() => this.legs().map(leg => buildLegRow(leg, this.availableIds().has(leg.legId), this.selectedSet().has(leg.legId))));
78
+ /** `false` = a round trip must be upgraded as a whole (availability's `allowCustomerToSelectSingleLeg`). */
79
+ this.allowSingleLegSelection = signal(true);
80
+ this.anyAvailable = computed(() => this.legRows().some(r => r.available));
81
+ /**
82
+ * No leg can be reissued online (offline, or already flown): the dialog shows this message instead of the options,
83
+ * like the cancel dialog does for a booking it cannot auto-cancel. `null` while loading or when any leg is available.
84
+ */
85
+ this.blocked = computed(() => {
86
+ const rows = this.legRows();
87
+ if (!this.availabilityLoaded() || !rows.length || rows.some(r => r.available))
88
+ return null;
89
+ return rows.every(r => r.flown)
90
+ ? { title: 'All flights of this booking have already departed.', text: 'There is nothing left to reissue.' }
91
+ : {
92
+ title: 'This booking doesn’t support online reissue.',
93
+ text: 'Please escalate to the relevant team for manual handling.',
94
+ };
95
+ });
96
+ this.canContinue = computed(() => this.selectedLegIds().length > 0);
97
+ /** A leg's date after the change: the new one when the agent is changing it, the original otherwise. */
98
+ this.dateRows = computed(() => {
99
+ const legs = this.legs();
100
+ const selected = this.selectedSet();
101
+ const edits = this.dateEdits();
102
+ const effective = (l) => (selected.has(l.legId) ? (edits[l.legId] ?? '') : l.departure.slice(0, 10));
103
+ return legs.flatMap((leg, i) => {
104
+ if (!selected.has(leg.legId))
105
+ return [];
106
+ const prev = i > 0 ? effective(legs[i - 1]) : '';
107
+ return [
108
+ {
109
+ leg,
110
+ title: legTitle(leg),
111
+ current: formatReissueDate(leg.departure),
112
+ value: edits[leg.legId] ?? '',
113
+ // Never before today or the previous leg; never after the next leg (same day is fine).
114
+ min: prev > this.today ? prev : this.today,
115
+ max: i < legs.length - 1 ? effective(legs[i + 1]) : '',
116
+ },
117
+ ];
118
+ });
119
+ });
120
+ this.routeRows = computed(() => {
121
+ const edits = this.routeEdits();
122
+ return this.selectedLegs().map(leg => ({
123
+ leg,
124
+ title: legTitle(leg),
125
+ current: formatReissueDate(leg.departure),
126
+ origin: edits[leg.legId]?.origin ?? originAirport(leg),
127
+ destination: edits[leg.legId]?.destination ?? destinationAirport(leg),
128
+ }));
129
+ });
130
+ this.airportOptions = computed(() => {
131
+ const byId = new Map();
132
+ // Order matters (later wins): the booking's own airports, the search results, then what is already picked.
133
+ for (const l of this.legs()) {
134
+ byId.set(l.originCode, originAirport(l));
135
+ byId.set(l.destinationCode, destinationAirport(l));
136
+ }
137
+ for (const a of this.searchedAirports())
138
+ byId.set(a.id, a);
139
+ for (const e of Object.values(this.routeEdits())) {
140
+ byId.set(e.origin.id, e.origin);
141
+ byId.set(e.destination.id, e.destination);
142
+ }
143
+ return [...byId.values()].map(a => ({ ...a, label: `${a.city_name} (${a.id}) – ${a.name}` }));
144
+ });
145
+ this.validationError = computed(() => {
146
+ const service = this.service();
147
+ if (!service || !this.selectedLegIds().length)
148
+ return 'Select at least one leg.';
149
+ if (service === 'change_date') {
150
+ for (const { leg, value, min, max } of this.dateRows()) {
151
+ const who = leg.direction || 'This leg';
152
+ if (!value)
153
+ return 'Pick a new date for every selected leg.';
154
+ if (value < this.today)
155
+ return 'The new date cannot be in the past.';
156
+ if (value < min)
157
+ return `${who} cannot depart before the previous flight (${min}).`;
158
+ if (max && value > max)
159
+ return `${who} cannot depart after the next flight (${max}).`;
160
+ }
161
+ return null;
162
+ }
163
+ let changed = false;
164
+ for (const { leg, origin, destination } of this.routeRows()) {
165
+ if (origin.id === destination.id)
166
+ return 'Origin and destination must be different.';
167
+ if (origin.id !== leg.originCode || destination.id !== leg.destinationCode)
168
+ changed = true;
169
+ }
170
+ return changed ? null : 'Change at least one airport.';
171
+ });
172
+ this.load$.pipe(switchMap(() => this.loadFlow()), takeUntilDestroyed()).subscribe();
173
+ // Debounced typeahead: one request per pause in typing, older in-flight ones are dropped.
174
+ this.airportTerm$
175
+ .pipe(debounceTime(250), distinctUntilChanged(), switchMap(term => this.api.searchAirports(term)), takeUntilDestroyed())
176
+ .subscribe(list => this.searchedAirports.set(list));
177
+ }
178
+ /** The leg came back online from the availability check. */
179
+ isLegOnline(legId) {
180
+ return this.availableIds().has(legId);
181
+ }
182
+ // ── actions ───────────────────────────────────────────────────────────────
183
+ /** (Re)starts the dialog for a booking: clears every choice, then loads post-booking + availability. */
184
+ open(data, id) {
185
+ this.booking.set({ data, id });
186
+ this.step.set('service');
187
+ this.service.set(null);
188
+ this.selectedLegIds.set([]);
189
+ this.dateEdits.set({});
190
+ this.routeEdits.set({});
191
+ this.searchedAirports.set([]);
192
+ this.postBookingId.set('');
193
+ this.availableIds.set(new Set());
194
+ this.availabilityLoaded.set(false);
195
+ this.upgradeOptions.set(null);
196
+ this.load();
197
+ }
198
+ load() {
199
+ this.load$.next();
200
+ }
201
+ chooseService(service) {
202
+ if (this.loading() || this.error())
203
+ return;
204
+ this.service.set(service);
205
+ // A one-way with its only leg online has nothing to choose: skip "select flight" and go straight to editing.
206
+ // (An offline one-way still shows the step, so the agent sees why it cannot be changed.)
207
+ const rows = this.legRows();
208
+ if (rows.length === 1 && rows[0].available) {
209
+ this.selectedLegIds.set([rows[0].leg.legId]);
210
+ this.legsStepSkipped.set(true);
211
+ this.goToEdit();
212
+ return;
213
+ }
214
+ this.legsStepSkipped.set(false);
215
+ this.selectedLegIds.set([]);
216
+ this.step.set('legs');
217
+ }
218
+ toggleLeg(legId) {
219
+ if (!this.availableIds().has(legId))
220
+ return;
221
+ this.selectedLegIds.update(ids => (ids.includes(legId) ? ids.filter(i => i !== legId) : [...ids, legId]));
222
+ }
223
+ /** Legs -> edit: seed each selected leg with its current date / airports. */
224
+ goToEdit() {
225
+ if (!this.canContinue())
226
+ return;
227
+ if (this.service() === 'change_date') {
228
+ this.dateEdits.update(edits => {
229
+ const next = { ...edits };
230
+ for (const l of this.selectedLegs())
231
+ next[l.legId] ??= l.departure.slice(0, 10);
232
+ return next;
233
+ });
234
+ }
235
+ else {
236
+ this.routeEdits.update(edits => {
237
+ const next = { ...edits };
238
+ for (const l of this.selectedLegs()) {
239
+ next[l.legId] ??= { origin: originAirport(l), destination: destinationAirport(l) };
240
+ }
241
+ return next;
242
+ });
243
+ }
244
+ this.step.set('edit');
245
+ }
246
+ goTo(step) {
247
+ this.step.set(step);
248
+ }
249
+ back() {
250
+ const previous = {
251
+ service: 'service',
252
+ legs: 'service',
253
+ edit: this.legsStepSkipped() ? 'service' : 'legs',
254
+ 'upgrade-legs': 'service',
255
+ upgrade: 'service', // the upgrade store overrides this when the leg step was shown
256
+ confirm: 'upgrade',
257
+ };
258
+ this.step.update(s => previous[s]);
259
+ }
260
+ setDate(legId, date) {
261
+ this.dateEdits.update(edits => ({ ...edits, [legId]: date }));
262
+ }
263
+ setAirport(legId, side, airport) {
264
+ if (!airport)
265
+ return;
266
+ const current = this.routeRows().find(r => r.leg.legId === legId);
267
+ if (!current)
268
+ return;
269
+ this.routeEdits.update(edits => ({
270
+ ...edits,
271
+ [legId]: { origin: current.origin, destination: current.destination, [side]: airport },
272
+ }));
273
+ }
274
+ /** Swaps a leg's origin and destination (the arrow between the two pickers). */
275
+ swapAirports(legId) {
276
+ const current = this.routeRows().find(r => r.leg.legId === legId);
277
+ if (!current)
278
+ return;
279
+ this.routeEdits.update(edits => ({
280
+ ...edits,
281
+ [legId]: { origin: current.destination, destination: current.origin },
282
+ }));
283
+ }
284
+ searchAirports(term) {
285
+ this.airportTerm$.next(term ?? '');
286
+ }
287
+ /** The web search URL for the current choices, or `null` when they are not valid yet. */
288
+ searchUrl() {
289
+ const ctx = this.ctx();
290
+ const service = this.service();
291
+ if (!ctx || !service || service === 'upgrade_class' || this.validationError())
292
+ return null;
293
+ const selection = {
294
+ service,
295
+ legs: service === 'change_date'
296
+ ? this.dateRows().map(r => ({ legId: r.leg.legId, departDate: r.value }))
297
+ : this.routeRows().map(r => ({ legId: r.leg.legId, origin: r.origin, destination: r.destination })),
298
+ };
299
+ return buildReissueSearchUrl(this.config.webBaseUrl, ctx, selection, this.postBookingId());
300
+ }
301
+ // ── loading: post-booking -> availability -> upgrade options (once per dialog visit) ─────────
302
+ loadFlow() {
303
+ const ctx = this.ctx();
304
+ if (!ctx) {
305
+ this.error.set('This booking has no leg data to reissue.');
306
+ return EMPTY;
307
+ }
308
+ this.loading.set(true);
309
+ this.error.set(null);
310
+ return this.api.createPostBooking(ctx.bookingId).pipe(switchMap(postBookingId => {
311
+ if (!postBookingId)
312
+ return throwError(() => START_ERROR);
313
+ this.postBookingId.set(postBookingId);
314
+ return this.api.getAvailability(ctx.bookingId, postBookingId, ctx).pipe(catchError(e => throwError(() => describeHttpError(AVAILABILITY_ERROR, e))), tap(res => {
315
+ // A leg that already flew can never be changed, whatever availability says: treat it as offline.
316
+ const flown = new Set(ctx.legs.filter(isLegFlown).map(l => l.legId));
317
+ this.availableIds.set(new Set((res?.data?.legs ?? []).filter(l => l.available && !flown.has(l.legId)).map(l => l.legId)));
318
+ this.allowSingleLegSelection.set(res?.data?.allowCustomerToSelectSingleLeg ?? true);
319
+ this.availabilityLoaded.set(true);
320
+ }), switchMap(() => this.offersUpgrade(ctx.tripType, ctx.legs, postBookingId)));
321
+ }), tap(options => {
322
+ this.upgradeOptions.set(options);
323
+ this.loading.set(false);
324
+ }), catchError((e) => {
325
+ this.error.set(typeof e === 'string' ? e : describeHttpError(START_ERROR, e));
326
+ this.loading.set(false);
327
+ return EMPTY;
328
+ }));
329
+ }
330
+ /**
331
+ * The upgrade-class options (same rule as the web for listing "Upgrade Class"): skipped for a one-way whose
332
+ * only leg is offline; a failing call just yields `null` (option hidden) instead of blocking the dialog.
333
+ */
334
+ offersUpgrade(tripType, legs, postBookingId) {
335
+ const ctx = this.ctx();
336
+ const oneWayOffline = tripType === 'OneWay' && !this.availableIds().has(legs[0]?.legId);
337
+ if (!ctx || !legs.length || oneWayOffline)
338
+ return of(null);
339
+ return this.api
340
+ .getUpgradeClassOptions(ctx.bookingId, postBookingId, ctx)
341
+ .pipe(catchError(() => of(null)));
342
+ }
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
344
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore }); }
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueStore, decorators: [{
347
+ type: Injectable
348
+ }], ctorParameters: () => [] });
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9yZWlzc3VlLWRpYWxvZy9yZWlzc3VlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBTyxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBUW5FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BHLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxHQUNULE1BQU0sNEJBQTRCLENBQUM7O0FBMkJwQyxNQUFNLFVBQVUsV0FBVyxDQUN6QixHQUFlLEVBQ2YsU0FBa0IsRUFDbEIsUUFBaUIsRUFDakIsb0JBQThDLFNBQVM7SUFFdkQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLE9BQU87UUFDTCxHQUFHO1FBQ0gsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFT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cnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU0JEX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcbmltcG9ydCB7IFNiZFJlaXNzdWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVpc3N1ZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFJlaXNzdWVBaXJwb3J0LFxuICBSZWlzc3VlTGVnLFxuICBSZWlzc3VlU2VsZWN0aW9uLFxuICBSZWlzc3VlU2VydmljZUtleSxcbiAgUmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UsXG59IGZyb20gJy4uLy4uL21vZGVscy9yZWlzc3VlLnR5cGVzJztcbmltcG9ydCB7IGJ1aWxkUmVpc3N1ZUJvb2tpbmdDb250ZXh0LCBidWlsZFJlaXNzdWVTZWFyY2hVcmwgfSBmcm9tICcuLi8uLi91dGlscy9yZWlzc3VlLXVybC5idWlsZGVyJztcbmltcG9ydCB7XG4gIGRlc3RpbmF0aW9uQWlycG9ydCxcbiAgZm9ybWF0UmVpc3N1ZURhdGUsXG4gIGZvcm1hdFNob3J0RGF0ZSxcbiAgZm9ybWF0VGltZSxcbiAgaXNMZWdGbG93bixcbiAgbGVnVGl0bGUsXG4gIG9yaWdpbkFpcnBvcnQsXG4gIHRvZGF5SXNvLFxufSBmcm9tICcuLi8uLi91dGlscy9yZWlzc3VlLWZvcm1hdCc7XG5cbi8qKiBgbGVnc2AgKyBgZWRpdGAgc2VydmUgY2hhbmdlIGRhdGUgLyByb3V0ZTsgYHVwZ3JhZGUtbGVnc2AgKyBgdXBncmFkZWAgKyBgY29uZmlybWAgc2VydmUgVXBncmFkZSBDbGFzcy4gKi9cbmV4cG9ydCB0eXBlIFJlaXNzdWVTdGVwID0gJ3NlcnZpY2UnIHwgJ2xlZ3MnIHwgJ2VkaXQnIHwgJ3VwZ3JhZGUtbGVncycgfCAndXBncmFkZScgfCAnY29uZmlybSc7XG5leHBvcnQgdHlwZSBBaXJwb3J0U2lkZSA9ICdvcmlnaW4nIHwgJ2Rlc3RpbmF0aW9uJztcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVFZGl0IHsgb3JpZ2luOiBSZWlzc3VlQWlycG9ydDsgZGVzdGluYXRpb246IFJlaXNzdWVBaXJwb3J0IH1cbmV4cG9ydCB0eXBlIEFpcnBvcnRPcHRpb24gPSBSZWlzc3VlQWlycG9ydCAmIHsgbGFiZWw6IHN0cmluZyB9O1xuXG4vKiogVmlldyBtb2RlbHM6IGV2ZXJ5dGhpbmcgdGhlIHRlbXBsYXRlcyBuZWVkIGlzIGNvbXB1dGVkIGhlcmUsIHNvIHRoZSB0ZW1wbGF0ZXMgY2FsbCBubyBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWlzc3VlTGVnUm93IHtcbiAgbGVnOiBSZWlzc3VlTGVnO1xuICBkaXJlY3Rpb246IHN0cmluZztcbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xuICBkYXRlTGFiZWw6IHN0cmluZztcbiAgZGVwVGltZTogc3RyaW5nO1xuICBhcnJUaW1lOiBzdHJpbmc7XG4gIHN0b3BzTGFiZWw6IHN0cmluZztcbiAgYWlybGluZUxpbmU6IHN0cmluZztcbiAgLyoqIFRoZSBsZWcgYWxyZWFkeSBkZXBhcnRlZCAoXCJVc2VkIEZsaWdodFwiKTogbmV2ZXIgc2VsZWN0YWJsZS4gKi9cbiAgZmxvd246IGJvb2xlYW47XG4gIGF2YWlsYWJsZTogYm9vbGVhbjtcbiAgLyoqIFdoeSBhIGxlZyBjYW5ub3QgYmUgcGlja2VkOiBpdCBhbHJlYWR5IGZsZXcsIGl0IGlzIG9mZmxpbmUgKG5vIG9ubGluZSByZWlzc3VlKSwgb3IgaXQgaGFzIG5vIHVwZ3JhZGUgb3B0aW9ucy4gKi9cbiAgcmVhc29uOiAnZmxvd24nIHwgJ29mZmxpbmUnIHwgJ25vLW9wdGlvbnMnIHwgbnVsbDtcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExlZ1JvdyhcbiAgbGVnOiBSZWlzc3VlTGVnLFxuICBhdmFpbGFibGU6IGJvb2xlYW4sXG4gIHNlbGVjdGVkOiBib29sZWFuLFxuICB1bmF2YWlsYWJsZVJlYXNvbjogJ29mZmxpbmUnIHwgJ25vLW9wdGlvbnMnID0gJ29mZmxpbmUnLFxuKTogUmVpc3N1ZUxlZ1JvdyB7XG4gIGNvbnN0IGZsb3duID0gaXNMZWdGbG93bihsZWcpO1xuICByZXR1cm4ge1xuICAgIGxlZyxcbiAgICBkaXJlY3Rpb246IGxlZy5kaXJlY3Rpb24sXG4gICAgZnJvbTogbGVnLm9yaWdpbkNvZGUsXG4gICAgdG86IGxlZy5kZXN0aW5hdGlvbkNvZGUsXG4gICAgZGF0ZUxhYmVsOiBmb3JtYXRTaG9ydERhdGUobGVnLmRlcGFydHVyZSksXG4gICAgZGVwVGltZTogZm9ybWF0VGltZShsZWcuZGVwYXJ0dXJlKSxcbiAgICBhcnJUaW1lOiBmb3JtYXRUaW1lKGxlZy5hcnJpdmFsKSxcbiAgICBzdG9wc0xhYmVsOiBsZWcuc3RvcHMgPiAwID8gYCR7bGVnLnN0b3BzfSBzdG9wJHtsZWcuc3RvcHMgPiAxID8gJ3MnIDogJyd9YCA6ICdEaXJlY3QnLFxuICAgIGFpcmxpbmVMaW5lOiBbbGVnLmFpcmxpbmUsIGxlZy5mbGlnaHROb10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKSxcbiAgICBmbG93bixcbiAgICBhdmFpbGFibGU6IGF2YWlsYWJsZSAmJiAhZmxvd24sXG4gICAgcmVhc29uOiBmbG93biA/ICdmbG93bicgOiBhdmFpbGFibGUgPyBudWxsIDogdW5hdmFpbGFibGVSZWFzb24sXG4gICAgc2VsZWN0ZWQ6IHNlbGVjdGVkICYmICFmbG93bixcbiAgfTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVpc3N1ZURhdGVSb3cgeyBsZWc6IFJlaXNzdWVMZWc7IHRpdGxlOiBzdHJpbmc7IGN1cnJlbnQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgbWluOiBzdHJpbmc7IG1heDogc3RyaW5nIH1cbmV4cG9ydCBpbnRlcmZhY2UgUmVpc3N1ZVJvdXRlUm93IHsgbGVnOiBSZWlzc3VlTGVnOyB0aXRsZTogc3RyaW5nOyBjdXJyZW50OiBzdHJpbmc7IG9yaWdpbjogUmVpc3N1ZUFpcnBvcnQ7IGRlc3RpbmF0aW9uOiBSZWlzc3VlQWlycG9ydCB9XG5cbmNvbnN0IFNUQVJUX0VSUk9SID0gJ0NvdWxkIG5vdCBzdGFydCB0aGUgcmVpc3N1ZSByZXF1ZXN0Lic7XG5jb25zdCBBVkFJTEFCSUxJVFlfRVJST1IgPSAnQ291bGQgbm90IGNoZWNrIGF2YWlsYWJpbGl0eSBmb3IgdGhpcyBib29raW5nLic7XG5cbi8qKiBgYmFzZSAoSFRUUCA1MDA6IG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZClgIOKAlCBzbyB0aGUgYWdlbnQgKGFuZCB3ZSwgd2hpbGUgdGhlIEFQSXMgYXJlIG5ldykgY2FuIHNlZSB3aHkgaXQgZmFpbGVkLiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVIdHRwRXJyb3IoYmFzZTogc3RyaW5nLCBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyID0gZSBhcyB7IHN0YXR1cz86IG51bWJlcjsgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0gfCBzdHJpbmcgfSB8IG51bGw7XG4gIC8vIFRoZSBiYWNrZW5kIHNlbmRzIGJvdGg6IGBlcnJvcmAgKHRoZSByZWFsIHJlYXNvbiwgZS5nLiBcIlVuYXV0aG9yaXplZCFcIikgYW5kIGEgZ2VuZXJpYyBgbWVzc2FnZWAuXG4gIGNvbnN0IGJvZHkgPVxuICAgIHR5cGVvZiBlcnI/LmVycm9yID09PSAnc3RyaW5nJyA/IFtlcnIuZXJyb3JdIDogW2Vycj8uZXJyb3I/LmVycm9yLCBlcnI/LmVycm9yPy5tZXNzYWdlXTtcbiAgY29uc3QgdGV4dCA9IGJvZHkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDigJQgJykuc2xpY2UoMCwgMjAwKTtcbiAgY29uc3QgZGV0YWlsID0gW2Vycj8uc3RhdHVzID8gYEhUVFAgJHtlcnIuc3RhdHVzfWAgOiAnJywgdGV4dF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJzogJyk7XG4gIHJldHVybiBkZXRhaWwgPyBgJHtiYXNlfSAoJHtkZXRhaWx9KWAgOiBiYXNlO1xufVxuXG4vKipcbiAqIFN0YXRlICsgcnVsZXMgb2YgdGhlIFJlaXNzdWUgZGlhbG9nIChvbmUgaW5zdGFuY2UgcGVyIGRpYWxvZywgcHJvdmlkZWQgYnkgdGhlIGRpYWxvZyBjb21wb25lbnQpLlxuICogVGhlIHN0ZXAgY29tcG9uZW50cyBhcmUgcHJlc2VudGF0aW9uYWw6IHRoZXkgZ2V0IHZpZXcgbW9kZWxzIGZyb20gaGVyZSB0aHJvdWdoIHRoZSBkaWFsb2cgc2hlbGwuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTYmRSZWlzc3VlU3RvcmUge1xuICBwcml2YXRlIGFwaSA9IGluamVjdChTYmRSZWlzc3VlU2VydmljZSk7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KFNCRF9DT05GSUcpO1xuXG4gIHJlYWRvbmx5IHRvZGF5ID0gdG9kYXlJc28oKTtcblxuICAvLyDilIDilIAgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgYm9va2luZyA9IHNpZ25hbDx7IGRhdGE6IHVua25vd247IGlkOiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzdGVwID0gc2lnbmFsPFJlaXNzdWVTdGVwPignc2VydmljZScpO1xuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHBvc3RCb29raW5nSWQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBzZXJ2aWNlID0gc2lnbmFsPFJlaXNzdWVTZXJ2aWNlS2V5IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBSYXcgdXBncmFkZS1jbGFzcyByZXNwb25zZTsgYG51bGxgIHdoZW4gbm90IGxvYWRlZCAvIG5vdCBvZmZlcmVkLiBSZWFkIGJ5IGBTYmRSZWlzc3VlVXBncmFkZVN0b3JlYC4gKi9cbiAgcmVhZG9ubHkgdXBncmFkZU9wdGlvbnMgPSBzaWduYWw8UmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdXBncmFkZUF2YWlsYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXBpLmhhc1VwZ3JhZGVPcHRpb25zKHRoaXMudXBncmFkZU9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgYXZhaWxhYmxlSWRzID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQoKSk7XG4gIC8qKiBUaGUgYXZhaWxhYmlsaXR5IGNhbGwgYW5zd2VyZWQgKHNvIFwibm8gbGVnIGF2YWlsYWJsZVwiIGlzIGEgcmVhbCBhbnN3ZXIsIG5vdCBcInN0aWxsIGxvYWRpbmdcIikuICovXG4gIHByaXZhdGUgYXZhaWxhYmlsaXR5TG9hZGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZExlZ0lkcyA9IHNpZ25hbDxyZWFkb25seSBzdHJpbmdbXT4oW10pO1xuICAvKiogVGhlIFwic2VsZWN0IGZsaWdodFwiIHN0ZXAgd2FzIHNraXBwZWQgKG9uZS13YXkpOiBCYWNrIGZyb20gdGhlIGVkaXQgc3RlcCByZXR1cm5zIHRvIHRoZSBzZXJ2aWNlIGxpc3QuICovXG4gIHByaXZhdGUgbGVnc1N0ZXBTa2lwcGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBkYXRlRWRpdHMgPSBzaWduYWw8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KHt9KTtcbiAgcHJpdmF0ZSByb3V0ZUVkaXRzID0gc2lnbmFsPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJvdXRlRWRpdD4+Pih7fSk7XG4gIHByaXZhdGUgc2VhcmNoZWRBaXJwb3J0cyA9IHNpZ25hbDxyZWFkb25seSBSZWlzc3VlQWlycG9ydFtdPihbXSk7XG5cbiAgcHJpdmF0ZSBsb2FkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgYWlycG9ydFRlcm0kID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9hZCQucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5sb2FkRmxvdygpKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gRGVib3VuY2VkIHR5cGVhaGVhZDogb25lIHJlcXVlc3QgcGVyIHBhdXNlIGluIHR5cGluZywgb2xkZXIgaW4tZmxpZ2h0IG9uZXMgYXJlIGRyb3BwZWQuXG4gICAgdGhpcy5haXJwb3J0VGVybSRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKHRlcm0gPT4gdGhpcy5hcGkuc2VhcmNoQWlycG9ydHModGVybSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobGlzdCA9PiB0aGlzLnNlYXJjaGVkQWlycG9ydHMuc2V0KGxpc3QpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkZXJpdmVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICByZWFkb25seSBjdHggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYiA9IHRoaXMuYm9va2luZygpO1xuICAgIHJldHVybiBiID8gYnVpbGRSZWlzc3VlQm9va2luZ0NvbnRleHQoYi5kYXRhLCBiLmlkKSA6IG51bGw7XG4gIH0pO1xuICByZWFkb25seSBsZWdzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdHgoKT8ubGVncyA/PyBbXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRTZXQgPSBjb21wdXRlZCgoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRMZWdJZHMoKSkpO1xuICBwcml2YXRlIHNlbGVjdGVkTGVncyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGVncygpLmZpbHRlcihsID0+IHRoaXMuc2VsZWN0ZWRTZXQoKS5oYXMobC5sZWdJZCkpKTtcblxuICByZWFkb25seSBsZWdSb3dzID0gY29tcHV0ZWQ8UmVpc3N1ZUxlZ1Jvd1tdPigoKSA9PlxuICAgIHRoaXMubGVncygpLm1hcChsZWcgPT4gYnVpbGRMZWdSb3cobGVnLCB0aGlzLmF2YWlsYWJsZUlkcygpLmhhcyhsZWcubGVnSWQpLCB0aGlzLnNlbGVjdGVkU2V0KCkuaGFzKGxlZy5sZWdJZCkpKSxcbiAgKTtcblxuICAvKiogVGhlIGxlZyBjYW1lIGJhY2sgb25saW5lIGZyb20gdGhlIGF2YWlsYWJpbGl0eSBjaGVjay4gKi9cbiAgaXNMZWdPbmxpbmUobGVnSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUlkcygpLmhhcyhsZWdJZCk7XG4gIH1cblxuICAvKiogYGZhbHNlYCA9IGEgcm91bmQgdHJpcCBtdXN0IGJlIHVwZ3JhZGVkIGFzIGEgd2hvbGUgKGF2YWlsYWJpbGl0eSdzIGBhbGxvd0N1c3RvbWVyVG9TZWxlY3RTaW5nbGVMZWdgKS4gKi9cbiAgcmVhZG9ubHkgYWxsb3dTaW5nbGVMZWdTZWxlY3Rpb24gPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IGFueUF2YWlsYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGVnUm93cygpLnNvbWUociA9PiByLmF2YWlsYWJsZSkpO1xuXG4gIC8qKlxuICAgKiBObyBsZWcgY2FuIGJlIHJlaXNzdWVkIG9ubGluZSAob2ZmbGluZSwgb3IgYWxyZWFkeSBmbG93bik6IHRoZSBkaWFsb2cgc2hvd3MgdGhpcyBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIG9wdGlvbnMsXG4gICAqIGxpa2UgdGhlIGNhbmNlbCBkaWFsb2cgZG9lcyBmb3IgYSBib29raW5nIGl0IGNhbm5vdCBhdXRvLWNhbmNlbC4gYG51bGxgIHdoaWxlIGxvYWRpbmcgb3Igd2hlbiBhbnkgbGVnIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGJsb2NrZWQgPSBjb21wdXRlZDx7IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9IHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmxlZ1Jvd3MoKTtcbiAgICBpZiAoIXRoaXMuYXZhaWxhYmlsaXR5TG9hZGVkKCkgfHwgIXJvd3MubGVuZ3RoIHx8IHJvd3Muc29tZShyID0+IHIuYXZhaWxhYmxlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJvd3MuZXZlcnkociA9PiByLmZsb3duKVxuICAgICAgPyB7IHRpdGxlOiAnQWxsIGZsaWdodHMgb2YgdGhpcyBib29raW5nIGhhdmUgYWxyZWFkeSBkZXBhcnRlZC4nLCB0ZXh0OiAnVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlaXNzdWUuJyB9XG4gICAgICA6IHtcbiAgICAgICAgICB0aXRsZTogJ1RoaXMgYm9va2luZyBkb2VzbuKAmXQgc3VwcG9ydCBvbmxpbmUgcmVpc3N1ZS4nLFxuICAgICAgICAgIHRleHQ6ICdQbGVhc2UgZXNjYWxhdGUgdG8gdGhlIHJlbGV2YW50IHRlYW0gZm9yIG1hbnVhbCBoYW5kbGluZy4nLFxuICAgICAgICB9O1xuICB9KTtcbiAgcmVhZG9ubHkgY2FuQ29udGludWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkTGVnSWRzKCkubGVuZ3RoID4gMCk7XG5cbiAgLyoqIEEgbGVnJ3MgZGF0ZSBhZnRlciB0aGUgY2hhbmdlOiB0aGUgbmV3IG9uZSB3aGVuIHRoZSBhZ2VudCBpcyBjaGFuZ2luZyBpdCwgdGhlIG9yaWdpbmFsIG90aGVyd2lzZS4gKi9cbiAgcmVhZG9ubHkgZGF0ZVJvd3MgPSBjb21wdXRlZDxSZWlzc3VlRGF0ZVJvd1tdPigoKSA9PiB7XG4gICAgY29uc3QgbGVncyA9IHRoaXMubGVncygpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFNldCgpO1xuICAgIGNvbnN0IGVkaXRzID0gdGhpcy5kYXRlRWRpdHMoKTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSAobDogUmVpc3N1ZUxlZykgPT4gKHNlbGVjdGVkLmhhcyhsLmxlZ0lkKSA/IChlZGl0c1tsLmxlZ0lkXSA/PyAnJykgOiBsLmRlcGFydHVyZS5zbGljZSgwLCAxMCkpO1xuXG4gICAgcmV0dXJuIGxlZ3MuZmxhdE1hcCgobGVnLCBpKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkLmhhcyhsZWcubGVnSWQpKSByZXR1cm4gW107XG4gICAgICBjb25zdCBwcmV2ID0gaSA+IDAgPyBlZmZlY3RpdmUobGVnc1tpIC0gMV0pIDogJyc7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgbGVnLFxuICAgICAgICAgIHRpdGxlOiBsZWdUaXRsZShsZWcpLFxuICAgICAgICAgIGN1cnJlbnQ6IGZvcm1hdFJlaXNzdWVEYXRlKGxlZy5kZXBhcnR1cmUpLFxuICAgICAgICAgIHZhbHVlOiBlZGl0c1tsZWcubGVnSWRdID8/ICcnLFxuICAgICAgICAgIC8vIE5ldmVyIGJlZm9yZSB0b2RheSBvciB0aGUgcHJldmlvdXMgbGVnOyBuZXZlciBhZnRlciB0aGUgbmV4dCBsZWcgKHNhbWUgZGF5IGlzIGZpbmUpLlxuICAgICAgICAgIG1pbjogcHJldiA+IHRoaXMudG9kYXkgPyBwcmV2IDogdGhpcy50b2RheSxcbiAgICAgICAgICBtYXg6IGkgPCBsZWdzLmxlbmd0aCAtIDEgPyBlZmZlY3RpdmUobGVnc1tpICsgMV0pIDogJycsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSByb3V0ZVJvd3MgPSBjb21wdXRlZDxSZWlzc3VlUm91dGVSb3dbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRzID0gdGhpcy5yb3V0ZUVkaXRzKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMZWdzKCkubWFwKGxlZyA9PiAoe1xuICAgICAgbGVnLFxuICAgICAgdGl0bGU6IGxlZ1RpdGxlKGxlZyksXG4gICAgICBjdXJyZW50OiBmb3JtYXRSZWlzc3VlRGF0ZShsZWcuZGVwYXJ0dXJlKSxcbiAgICAgIG9yaWdpbjogZWRpdHNbbGVnLmxlZ0lkXT8ub3JpZ2luID8/IG9yaWdpbkFpcnBvcnQobGVnKSxcbiAgICAgIGRlc3RpbmF0aW9uOiBlZGl0c1tsZWcubGVnSWRdPy5kZXN0aW5hdGlvbiA/PyBkZXN0aW5hdGlvbkFpcnBvcnQobGVnKSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFpcnBvcnRPcHRpb25zID0gY29tcHV0ZWQ8QWlycG9ydE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgYnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWlzc3VlQWlycG9ydD4oKTtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIChsYXRlciB3aW5zKTogdGhlIGJvb2tpbmcncyBvd24gYWlycG9ydHMsIHRoZSBzZWFyY2ggcmVzdWx0cywgdGhlbiB3aGF0IGlzIGFscmVhZHkgcGlja2VkLlxuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLmxlZ3MoKSkge1xuICAgICAgYnlJZC5zZXQobC5vcmlnaW5Db2RlLCBvcmlnaW5BaXJwb3J0KGwpKTtcbiAgICAgIGJ5SWQuc2V0KGwuZGVzdGluYXRpb25Db2RlLCBkZXN0aW5hdGlvbkFpcnBvcnQobCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGEgb2YgdGhpcy5zZWFyY2hlZEFpcnBvcnRzKCkpIGJ5SWQuc2V0KGEuaWQsIGEpO1xuICAgIGZvciAoY29uc3QgZSBvZiBPYmplY3QudmFsdWVzKHRoaXMucm91dGVFZGl0cygpKSkge1xuICAgICAgYnlJZC5zZXQoZS5vcmlnaW4uaWQsIGUub3JpZ2luKTtcbiAgICAgIGJ5SWQuc2V0KGUuZGVzdGluYXRpb24uaWQsIGUuZGVzdGluYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmJ5SWQudmFsdWVzKCldLm1hcChhID0+ICh7IC4uLmEsIGxhYmVsOiBgJHthLmNpdHlfbmFtZX0gKCR7YS5pZH0pIOKAkyAke2EubmFtZX1gIH0pKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yID0gY29tcHV0ZWQ8c3RyaW5nIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2UoKTtcbiAgICBpZiAoIXNlcnZpY2UgfHwgIXRoaXMuc2VsZWN0ZWRMZWdJZHMoKS5sZW5ndGgpIHJldHVybiAnU2VsZWN0IGF0IGxlYXN0IG9uZSBsZWcuJztcblxuICAgIGlmIChzZXJ2aWNlID09PSAnY2hhbmdlX2RhdGUnKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbGVnLCB2YWx1ZSwgbWluLCBtYXggfSBvZiB0aGlzLmRhdGVSb3dzKCkpIHtcbiAgICAgICAgY29uc3Qgd2hvID0gbGVnLmRpcmVjdGlvbiB8fCAnVGhpcyBsZWcnO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gJ1BpY2sgYSBuZXcgZGF0ZSBmb3IgZXZlcnkgc2VsZWN0ZWQgbGVnLic7XG4gICAgICAgIGlmICh2YWx1ZSA8IHRoaXMudG9kYXkpIHJldHVybiAnVGhlIG5ldyBkYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4nO1xuICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHJldHVybiBgJHt3aG99IGNhbm5vdCBkZXBhcnQgYmVmb3JlIHRoZSBwcmV2aW91cyBmbGlnaHQgKCR7bWlufSkuYDtcbiAgICAgICAgaWYgKG1heCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIGAke3dob30gY2Fubm90IGRlcGFydCBhZnRlciB0aGUgbmV4dCBmbGlnaHQgKCR7bWF4fSkuYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB7IGxlZywgb3JpZ2luLCBkZXN0aW5hdGlvbiB9IG9mIHRoaXMucm91dGVSb3dzKCkpIHtcbiAgICAgIGlmIChvcmlnaW4uaWQgPT09IGRlc3RpbmF0aW9uLmlkKSByZXR1cm4gJ09yaWdpbiBhbmQgZGVzdGluYXRpb24gbXVzdCBiZSBkaWZmZXJlbnQuJztcbiAgICAgIGlmIChvcmlnaW4uaWQgIT09IGxlZy5vcmlnaW5Db2RlIHx8IGRlc3RpbmF0aW9uLmlkICE9PSBsZWcuZGVzdGluYXRpb25Db2RlKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQgPyBudWxsIDogJ0NoYW5nZSBhdCBsZWFzdCBvbmUgYWlycG9ydC4nO1xuICB9KTtcblxuICAvLyDilIDilIAgYWN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogKFJlKXN0YXJ0cyB0aGUgZGlhbG9nIGZvciBhIGJvb2tpbmc6IGNsZWFycyBldmVyeSBjaG9pY2UsIHRoZW4gbG9hZHMgcG9zdC1ib29raW5nICsgYXZhaWxhYmlsaXR5LiAqL1xuICBvcGVuKGRhdGE6IHVua25vd24sIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJvb2tpbmcuc2V0KHsgZGF0YSwgaWQgfSk7XG4gICAgdGhpcy5zdGVwLnNldCgnc2VydmljZScpO1xuICAgIHRoaXMuc2VydmljZS5zZXQobnVsbCk7XG4gICAgdGhpcy5zZWxlY3RlZExlZ0lkcy5zZXQoW10pO1xuICAgIHRoaXMuZGF0ZUVkaXRzLnNldCh7fSk7XG4gICAgdGhpcy5yb3V0ZUVkaXRzLnNldCh7fSk7XG4gICAgdGhpcy5zZWFyY2hlZEFpcnBvcnRzLnNldChbXSk7XG4gICAgdGhpcy5wb3N0Qm9va2luZ0lkLnNldCgnJyk7XG4gICAgdGhpcy5hdmFpbGFibGVJZHMuc2V0KG5ldyBTZXQoKSk7XG4gICAgdGhpcy5hdmFpbGFiaWxpdHlMb2FkZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnVwZ3JhZGVPcHRpb25zLnNldChudWxsKTtcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkJC5uZXh0KCk7XG4gIH1cblxuICBjaG9vc2VTZXJ2aWNlKHNlcnZpY2U6IFJlaXNzdWVTZXJ2aWNlS2V5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGluZygpIHx8IHRoaXMuZXJyb3IoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZS5zZXQoc2VydmljZSk7XG4gICAgLy8gQSBvbmUtd2F5IHdpdGggaXRzIG9ubHkgbGVnIG9ubGluZSBoYXMgbm90aGluZyB0byBjaG9vc2U6IHNraXAgXCJzZWxlY3QgZmxpZ2h0XCIgYW5kIGdvIHN0cmFpZ2h0IHRvIGVkaXRpbmcuXG4gICAgLy8gKEFuIG9mZmxpbmUgb25lLXdheSBzdGlsbCBzaG93cyB0aGUgc3RlcCwgc28gdGhlIGFnZW50IHNlZXMgd2h5IGl0IGNhbm5vdCBiZSBjaGFuZ2VkLilcbiAgICBjb25zdCByb3dzID0gdGhpcy5sZWdSb3dzKCk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAxICYmIHJvd3NbMF0uYXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGVnSWRzLnNldChbcm93c1swXS5sZWcubGVnSWRdKTtcbiAgICAgIHRoaXMubGVnc1N0ZXBTa2lwcGVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZ29Ub0VkaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sZWdzU3RlcFNraXBwZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnNlbGVjdGVkTGVnSWRzLnNldChbXSk7XG4gICAgdGhpcy5zdGVwLnNldCgnbGVncycpO1xuICB9XG5cbiAgdG9nZ2xlTGVnKGxlZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXZhaWxhYmxlSWRzKCkuaGFzKGxlZ0lkKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWRMZWdJZHMudXBkYXRlKGlkcyA9PiAoaWRzLmluY2x1ZGVzKGxlZ0lkKSA/IGlkcy5maWx0ZXIoaSA9PiBpICE9PSBsZWdJZCkgOiBbLi4uaWRzLCBsZWdJZF0pKTtcbiAgfVxuXG4gIC8qKiBMZWdzIC0+IGVkaXQ6IHNlZWQgZWFjaCBzZWxlY3RlZCBsZWcgd2l0aCBpdHMgY3VycmVudCBkYXRlIC8gYWlycG9ydHMuICovXG4gIGdvVG9FZGl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5Db250aW51ZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2VydmljZSgpID09PSAnY2hhbmdlX2RhdGUnKSB7XG4gICAgICB0aGlzLmRhdGVFZGl0cy51cGRhdGUoZWRpdHMgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0geyAuLi5lZGl0cyB9O1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgdGhpcy5zZWxlY3RlZExlZ3MoKSkgbmV4dFtsLmxlZ0lkXSA/Pz0gbC5kZXBhcnR1cmUuc2xpY2UoMCwgMTApO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlRWRpdHMudXBkYXRlKGVkaXRzID0+IHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHsgLi4uZWRpdHMgfTtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIHRoaXMuc2VsZWN0ZWRMZWdzKCkpIHtcbiAgICAgICAgICBuZXh0W2wubGVnSWRdID8/PSB7IG9yaWdpbjogb3JpZ2luQWlycG9ydChsKSwgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uQWlycG9ydChsKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RlcC5zZXQoJ2VkaXQnKTtcbiAgfVxuXG4gIGdvVG8oc3RlcDogUmVpc3N1ZVN0ZXApOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXAuc2V0KHN0ZXApO1xuICB9XG5cbiAgYmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91czogUmVjb3JkPFJlaXNzdWVTdGVwLCBSZWlzc3VlU3RlcD4gPSB7XG4gICAgICBzZXJ2aWNlOiAnc2VydmljZScsXG4gICAgICBsZWdzOiAnc2VydmljZScsXG4gICAgICBlZGl0OiB0aGlzLmxlZ3NTdGVwU2tpcHBlZCgpID8gJ3NlcnZpY2UnIDogJ2xlZ3MnLFxuICAgICAgJ3VwZ3JhZGUtbGVncyc6ICdzZXJ2aWNlJyxcbiAgICAgIHVwZ3JhZGU6ICdzZXJ2aWNlJywgLy8gdGhlIHVwZ3JhZGUgc3RvcmUgb3ZlcnJpZGVzIHRoaXMgd2hlbiB0aGUgbGVnIHN0ZXAgd2FzIHNob3duXG4gICAgICBjb25maXJtOiAndXBncmFkZScsXG4gICAgfTtcbiAgICB0aGlzLnN0ZXAudXBkYXRlKHMgPT4gcHJldmlvdXNbc10pO1xuICB9XG5cbiAgc2V0RGF0ZShsZWdJZDogc3RyaW5nLCBkYXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVFZGl0cy51cGRhdGUoZWRpdHMgPT4gKHsgLi4uZWRpdHMsIFtsZWdJZF06IGRhdGUgfSkpO1xuICB9XG5cbiAgc2V0QWlycG9ydChsZWdJZDogc3RyaW5nLCBzaWRlOiBBaXJwb3J0U2lkZSwgYWlycG9ydDogUmVpc3N1ZUFpcnBvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFhaXJwb3J0KSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm91dGVSb3dzKCkuZmluZChyID0+IHIubGVnLmxlZ0lkID09PSBsZWdJZCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgdGhpcy5yb3V0ZUVkaXRzLnVwZGF0ZShlZGl0cyA9PiAoe1xuICAgICAgLi4uZWRpdHMsXG4gICAgICBbbGVnSWRdOiB7IG9yaWdpbjogY3VycmVudC5vcmlnaW4sIGRlc3RpbmF0aW9uOiBjdXJyZW50LmRlc3RpbmF0aW9uLCBbc2lkZV06IGFpcnBvcnQgfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogU3dhcHMgYSBsZWcncyBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uICh0aGUgYXJyb3cgYmV0d2VlbiB0aGUgdHdvIHBpY2tlcnMpLiAqL1xuICBzd2FwQWlycG9ydHMobGVnSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvdXRlUm93cygpLmZpbmQociA9PiByLmxlZy5sZWdJZCA9PT0gbGVnSWQpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHRoaXMucm91dGVFZGl0cy51cGRhdGUoZWRpdHMgPT4gKHtcbiAgICAgIC4uLmVkaXRzLFxuICAgICAgW2xlZ0lkXTogeyBvcmlnaW46IGN1cnJlbnQuZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uOiBjdXJyZW50Lm9yaWdpbiB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHNlYXJjaEFpcnBvcnRzKHRlcm06IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWlycG9ydFRlcm0kLm5leHQodGVybSA/PyAnJyk7XG4gIH1cblxuICAvKiogVGhlIHdlYiBzZWFyY2ggVVJMIGZvciB0aGUgY3VycmVudCBjaG9pY2VzLCBvciBgbnVsbGAgd2hlbiB0aGV5IGFyZSBub3QgdmFsaWQgeWV0LiAqL1xuICBzZWFyY2hVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHgoKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlKCk7XG4gICAgaWYgKCFjdHggfHwgIXNlcnZpY2UgfHwgc2VydmljZSA9PT0gJ3VwZ3JhZGVfY2xhc3MnIHx8IHRoaXMudmFsaWRhdGlvbkVycm9yKCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9uOiBSZWlzc3VlU2VsZWN0aW9uID0ge1xuICAgICAgc2VydmljZSxcbiAgICAgIGxlZ3M6XG4gICAgICAgIHNlcnZpY2UgPT09ICdjaGFuZ2VfZGF0ZSdcbiAgICAgICAgICA/IHRoaXMuZGF0ZVJvd3MoKS5tYXAociA9PiAoeyBsZWdJZDogci5sZWcubGVnSWQsIGRlcGFydERhdGU6IHIudmFsdWUgfSkpXG4gICAgICAgICAgOiB0aGlzLnJvdXRlUm93cygpLm1hcChyID0+ICh7IGxlZ0lkOiByLmxlZy5sZWdJZCwgb3JpZ2luOiByLm9yaWdpbiwgZGVzdGluYXRpb246IHIuZGVzdGluYXRpb24gfSkpLFxuICAgIH07XG4gICAgcmV0dXJuIGJ1aWxkUmVpc3N1ZVNlYXJjaFVybCh0aGlzLmNvbmZpZy53ZWJCYXNlVXJsLCBjdHgsIHNlbGVjdGlvbiwgdGhpcy5wb3N0Qm9va2luZ0lkKCkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvYWRpbmc6IHBvc3QtYm9va2luZyAtPiBhdmFpbGFiaWxpdHkgLT4gdXBncmFkZSBvcHRpb25zIChvbmNlIHBlciBkaWFsb2cgdmlzaXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgbG9hZEZsb3coKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHgoKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoJ1RoaXMgYm9va2luZyBoYXMgbm8gbGVnIGRhdGEgdG8gcmVpc3N1ZS4nKTtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGVQb3N0Qm9va2luZyhjdHguYm9va2luZ0lkKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHBvc3RCb29raW5nSWQgPT4ge1xuICAgICAgICBpZiAoIXBvc3RCb29raW5nSWQpIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IFNUQVJUX0VSUk9SKTtcbiAgICAgICAgdGhpcy5wb3N0Qm9va2luZ0lkLnNldChwb3N0Qm9va2luZ0lkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmdldEF2YWlsYWJpbGl0eShjdHguYm9va2luZ0lkLCBwb3N0Qm9va2luZ0lkLCBjdHgpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcihlID0+IHRocm93RXJyb3IoKCkgPT4gZGVzY3JpYmVIdHRwRXJyb3IoQVZBSUxBQklMSVRZX0VSUk9SLCBlKSkpLFxuICAgICAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICAgICAgLy8gQSBsZWcgdGhhdCBhbHJlYWR5IGZsZXcgY2FuIG5ldmVyIGJlIGNoYW5nZWQsIHdoYXRldmVyIGF2YWlsYWJpbGl0eSBzYXlzOiB0cmVhdCBpdCBhcyBvZmZsaW5lLlxuICAgICAgICAgICAgY29uc3QgZmxvd24gPSBuZXcgU2V0KGN0eC5sZWdzLmZpbHRlcihpc0xlZ0Zsb3duKS5tYXAobCA9PiBsLmxlZ0lkKSk7XG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUlkcy5zZXQoXG4gICAgICAgICAgICAgIG5ldyBTZXQoKHJlcz8uZGF0YT8ubGVncyA/PyBbXSkuZmlsdGVyKGwgPT4gbC5hdmFpbGFibGUgJiYgIWZsb3duLmhhcyhsLmxlZ0lkKSkubWFwKGwgPT4gbC5sZWdJZCkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dTaW5nbGVMZWdTZWxlY3Rpb24uc2V0KHJlcz8uZGF0YT8uYWxsb3dDdXN0b21lclRvU2VsZWN0U2luZ2xlTGVnID8/IHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hdmFpbGFiaWxpdHlMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9mZmVyc1VwZ3JhZGUoY3R4LnRyaXBUeXBlLCBjdHgubGVncywgcG9zdEJvb2tpbmdJZCkpLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICB0YXAob3B0aW9ucyA9PiB7XG4gICAgICAgIHRoaXMudXBncmFkZU9wdGlvbnMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yLnNldCh0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBlIDogZGVzY3JpYmVIdHRwRXJyb3IoU1RBUlRfRVJST1IsIGUpKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVwZ3JhZGUtY2xhc3Mgb3B0aW9ucyAoc2FtZSBydWxlIGFzIHRoZSB3ZWIgZm9yIGxpc3RpbmcgXCJVcGdyYWRlIENsYXNzXCIpOiBza2lwcGVkIGZvciBhIG9uZS13YXkgd2hvc2VcbiAgICogb25seSBsZWcgaXMgb2ZmbGluZTsgYSBmYWlsaW5nIGNhbGwganVzdCB5aWVsZHMgYG51bGxgIChvcHRpb24gaGlkZGVuKSBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBkaWFsb2cuXG4gICAqL1xuICBwcml2YXRlIG9mZmVyc1VwZ3JhZGUoXG4gICAgdHJpcFR5cGU6IHN0cmluZyxcbiAgICBsZWdzOiByZWFkb25seSBSZWlzc3VlTGVnW10sXG4gICAgcG9zdEJvb2tpbmdJZDogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFJlaXNzdWVVcGdyYWRlT3B0aW9uc1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4KCk7XG4gICAgY29uc3Qgb25lV2F5T2ZmbGluZSA9IHRyaXBUeXBlID09PSAnT25lV2F5JyAmJiAhdGhpcy5hdmFpbGFibGVJZHMoKS5oYXMobGVnc1swXT8ubGVnSWQpO1xuICAgIGlmICghY3R4IHx8ICFsZWdzLmxlbmd0aCB8fCBvbmVXYXlPZmZsaW5lKSByZXR1cm4gb2YobnVsbCk7XG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAuZ2V0VXBncmFkZUNsYXNzT3B0aW9ucyhjdHguYm9va2luZ0lkLCBwb3N0Qm9va2luZ0lkLCBjdHgpXG4gICAgICAucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,45 @@
1
+ import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SbdReissueDateStepComponent {
4
+ constructor() {
5
+ this.rows = input.required();
6
+ this.changed = output();
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDateStepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdReissueDateStepComponent, isStandalone: true, selector: "app-sbd-reissue-date-step", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { changed: "changed" }, host: { classAttribute: "sbd-rdate" }, ngImport: i0, template: `
10
+ @for (row of rows(); track row.leg.legId) {
11
+ <div class="sbd-rdate__card">
12
+ <div class="sbd-rdate__head">
13
+ <span class="sbd-rdate__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
14
+ <span class="sbd-rdate__current">Currently {{ row.current }}</span>
15
+ </div>
16
+ <label class="sbd-rdate__field">
17
+ <span>New departure date</span>
18
+ <input type="date" class="sbd-rdate__input"
19
+ [value]="row.value" [min]="row.min" [attr.max]="row.max || null"
20
+ (input)="changed.emit({ legId: row.leg.legId, date: $any($event.target).value })" />
21
+ </label>
22
+ </div>
23
+ }
24
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rdate__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rdate__head{display:flex;flex-direction:column;gap:2px}.sbd-rdate__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rdate__current{font-size:13px;color:#64748b}.sbd-rdate__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rdate__input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rdate__input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueDateStepComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 'app-sbd-reissue-date-step', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
29
+ @for (row of rows(); track row.leg.legId) {
30
+ <div class="sbd-rdate__card">
31
+ <div class="sbd-rdate__head">
32
+ <span class="sbd-rdate__name">{{ row.leg.originCode }} to {{ row.leg.destinationCode }}</span>
33
+ <span class="sbd-rdate__current">Currently {{ row.current }}</span>
34
+ </div>
35
+ <label class="sbd-rdate__field">
36
+ <span>New departure date</span>
37
+ <input type="date" class="sbd-rdate__input"
38
+ [value]="row.value" [min]="row.min" [attr.max]="row.max || null"
39
+ (input)="changed.emit({ legId: row.leg.legId, date: $any($event.target).value })" />
40
+ </label>
41
+ </div>
42
+ }
43
+ `, host: { class: 'sbd-rdate' }, styles: [":host{display:flex;flex-direction:column;gap:12px}.sbd-rdate__card{border:1.5px solid #e2e8f0;border-radius:16px;background:#fff;transition:border-color .15s,box-shadow .15s;padding:16px;display:flex;flex-direction:column;gap:14px}.sbd-rdate__head{display:flex;flex-direction:column;gap:2px}.sbd-rdate__name{font-size:15px;font-weight:700;color:#1e2e4a}.sbd-rdate__current{font-size:13px;color:#64748b}.sbd-rdate__field{display:flex;flex-direction:column;gap:6px;min-width:0;font-size:12.5px;font-weight:600;color:#475569}.sbd-rdate__input{height:40px;padding:0 12px;border:1.5px solid #e2e8f0;border-radius:10px;background:#fff;font-size:13px;font-family:inherit;color:#1e2e4a}.sbd-rdate__input:focus{outline:none;border-color:var(--sbd-accent, #6d4aff)}\n"] }]
44
+ }] });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1kYXRlLXN0ZXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL3JlaXNzdWUtZGlhbG9nL3N0ZXBzL3JlaXNzdWUtZGF0ZS1zdGVwL3JlaXNzdWUtZGF0ZS1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBMEJsRixNQUFNLE9BQU8sMkJBQTJCO0lBdkJ4QztRQXdCRSxTQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztRQUMxQyxZQUFPLEdBQUcsTUFBTSxFQUFtQyxDQUFDO0tBQ3JEOytHQUhZLDJCQUEyQjttR0FBM0IsMkJBQTJCLDZSQW5CNUI7Ozs7Ozs7Ozs7Ozs7OztHQWVUOzs0RkFJVSwyQkFBMkI7a0JBdkJ2QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7OztHQWVULFFBRUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVpc3N1ZURhdGVSb3cgfSBmcm9tICcuLi8uLi9yZWlzc3VlLnN0b3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNiZC1yZWlzc3VlLWRhdGUtc3RlcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBmb3IgKHJvdyBvZiByb3dzKCk7IHRyYWNrIHJvdy5sZWcubGVnSWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtcmRhdGVfX2NhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1yZGF0ZV9faGVhZFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXJkYXRlX19uYW1lXCI+e3sgcm93LmxlZy5vcmlnaW5Db2RlIH19IHRvIHt7IHJvdy5sZWcuZGVzdGluYXRpb25Db2RlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLXJkYXRlX19jdXJyZW50XCI+Q3VycmVudGx5IHt7IHJvdy5jdXJyZW50IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2JkLXJkYXRlX19maWVsZFwiPlxuICAgICAgICAgIDxzcGFuPk5ldyBkZXBhcnR1cmUgZGF0ZTwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cInNiZC1yZGF0ZV9faW5wdXRcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy52YWx1ZVwiIFttaW5dPVwicm93Lm1pblwiIFthdHRyLm1heF09XCJyb3cubWF4IHx8IG51bGxcIlxuICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZWQuZW1pdCh7IGxlZ0lkOiByb3cubGVnLmxlZ0lkLCBkYXRlOiAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlIH0pXCIgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3JlaXNzdWUtZGF0ZS1zdGVwLmNvbXBvbmVudC5zY3NzJyxcbiAgaG9zdDogeyBjbGFzczogJ3NiZC1yZGF0ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgU2JkUmVpc3N1ZURhdGVTdGVwQ29tcG9uZW50IHtcbiAgcm93cyA9IGlucHV0LnJlcXVpcmVkPFJlaXNzdWVEYXRlUm93W10+KCk7XG4gIGNoYW5nZWQgPSBvdXRwdXQ8eyBsZWdJZDogc3RyaW5nOyBkYXRlOiBzdHJpbmcgfT4oKTtcbn1cbiJdfQ==