@almatar/smart-booking-dashboard 0.0.1

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/esm2022/almatar-smart-booking-dashboard.mjs +5 -0
  4. package/esm2022/lib/components/action-card/action-card.component.mjs +19 -0
  5. package/esm2022/lib/components/action-dialog/action-dialog.component.mjs +177 -0
  6. package/esm2022/lib/components/action-grid/action-grid.component.mjs +18 -0
  7. package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +62 -0
  8. package/esm2022/lib/components/booking-input/booking-input.component.mjs +43 -0
  9. package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +1441 -0
  10. package/esm2022/lib/components/data-search/data-search.component.mjs +84 -0
  11. package/esm2022/lib/components/flight-itinerary-card/flight-itinerary-card.component.mjs +73 -0
  12. package/esm2022/lib/components/result-panel/result-panel.component.mjs +46 -0
  13. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +19 -0
  14. package/esm2022/lib/config/dashboard.config.mjs +16 -0
  15. package/esm2022/lib/config/flight-actions.config.mjs +906 -0
  16. package/esm2022/lib/config/hotel-actions.config.mjs +53 -0
  17. package/esm2022/lib/config/labels.ar.mjs +116 -0
  18. package/esm2022/lib/models/action.types.mjs +2 -0
  19. package/esm2022/lib/models/booking.types.mjs +2 -0
  20. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +145 -0
  21. package/esm2022/lib/services/booking.service.mjs +65 -0
  22. package/esm2022/lib/services/toast.service.mjs +19 -0
  23. package/esm2022/lib/smart-booking-dashboard.module.mjs +17 -0
  24. package/esm2022/lib/smart-booking-dashboard.routes.mjs +7 -0
  25. package/esm2022/public-api.mjs +9 -0
  26. package/fesm2022/almatar-smart-booking-dashboard.mjs +3259 -0
  27. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -0
  28. package/index.d.ts +5 -0
  29. package/lib/components/action-card/action-card.component.d.ts +10 -0
  30. package/lib/components/action-dialog/action-dialog.component.d.ts +26 -0
  31. package/lib/components/action-grid/action-grid.component.d.ts +10 -0
  32. package/lib/components/add-note-dialog/add-note-dialog.component.d.ts +25 -0
  33. package/lib/components/booking-input/booking-input.component.d.ts +23 -0
  34. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +395 -0
  35. package/lib/components/data-search/data-search.component.d.ts +21 -0
  36. package/lib/components/flight-itinerary-card/flight-itinerary-card.component.d.ts +17 -0
  37. package/lib/components/result-panel/result-panel.component.d.ts +14 -0
  38. package/lib/components/workflow-actions/workflow-actions.component.d.ts +7 -0
  39. package/lib/config/dashboard.config.d.ts +15 -0
  40. package/lib/config/flight-actions.config.d.ts +2 -0
  41. package/lib/config/hotel-actions.config.d.ts +2 -0
  42. package/lib/config/labels.ar.d.ts +2 -0
  43. package/lib/models/action.types.d.ts +34 -0
  44. package/lib/models/booking.types.d.ts +6 -0
  45. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +43 -0
  46. package/lib/services/booking.service.d.ts +22 -0
  47. package/lib/services/toast.service.d.ts +10 -0
  48. package/lib/smart-booking-dashboard.module.d.ts +7 -0
  49. package/lib/smart-booking-dashboard.routes.d.ts +2 -0
  50. package/package.json +50 -0
  51. package/public-api.d.ts +5 -0
@@ -0,0 +1,906 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ const na = (v) => v != null && v !== '' ? String(v) : 'Not available';
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ const bi = (data) => data?.data?.booking_info;
5
+ const fmtMins = (mins) => mins != null ? `${Math.floor(mins / 60)}h ${mins % 60}m` : 'Not available';
6
+ const fmtDate = (dt) => {
7
+ if (!dt)
8
+ return 'Not available';
9
+ try {
10
+ return new Date(dt).toLocaleString('en-GB', {
11
+ day: '2-digit', month: 'short', year: 'numeric',
12
+ hour: '2-digit', minute: '2-digit',
13
+ });
14
+ }
15
+ catch {
16
+ return dt;
17
+ }
18
+ };
19
+ const dirIcon = (dir) => (dir === 'Return' || dir === 'return') ? '←' : '→';
20
+ /**
21
+ * Format a baggage allowance object (CabinBaggage / CheckedBaggage / UnderSeatBaggage).
22
+ * Negative values (-1) indicate the allowance is not applicable.
23
+ */
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ const fmtBag = (bag) => {
26
+ if (!bag)
27
+ return 'Not included';
28
+ const { Pieces, Weight, Unit, Dimension, Remark } = bag;
29
+ // Negative Pieces = not applicable (e.g. Pieces: -1, Weight: -1)
30
+ if (Pieces != null && Pieces < 0 && (Weight == null || Weight < 0))
31
+ return 'Not included';
32
+ // Zero across the board = not included
33
+ if (Pieces === 0 && (Weight === 0 || Weight == null))
34
+ return 'Not included';
35
+ const parts = [];
36
+ if (Pieces != null && Pieces > 0)
37
+ parts.push(`${Pieces} pc${Pieces > 1 ? 's' : ''}`);
38
+ if (Weight != null && Weight > 0)
39
+ parts.push(`${Weight} ${Unit ?? 'KG'}`);
40
+ if (Dimension)
41
+ parts.push(Dimension);
42
+ if (Remark)
43
+ parts.push(Remark);
44
+ return parts.length > 0 ? parts.join(' · ') : 'Not available';
45
+ };
46
+ /**
47
+ * Resolve pnr_info to a flat array regardless of shape.
48
+ * New BE format: [{pnr, LegDirectionality}, ...]
49
+ * Legacy format: {pnr: '...'} or null
50
+ */
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ const resolvePnrList = (pnrRaw) => {
53
+ if (Array.isArray(pnrRaw))
54
+ return pnrRaw;
55
+ if (pnrRaw?.pnr)
56
+ return [{ pnr: pnrRaw.pnr, LegDirectionality: 'Departure' }];
57
+ return [];
58
+ };
59
+ export const FLIGHT_ACTIONS = [
60
+ // ── Booking Overview ──────────────────────────────────────────────────────
61
+ {
62
+ key: 'booking_info',
63
+ type: 'flight',
64
+ label: 'Booking Overview',
65
+ subtitle: 'Route · Class · Fare',
66
+ icon: 'pi pi-file',
67
+ apiField: 'booking_info',
68
+ formatter: (data) => {
69
+ const d = bi(data);
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ const legs = d?.leg_info ?? [];
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ const airlines = d?.airline_info ?? [];
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ const passengers = d?.passenger_info?.passengers ?? [];
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ const baggage = d?.baggage;
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ const dur = d?.duration;
80
+ const ps = d?.payment_status;
81
+ const cp = d?.cancellation_policy;
82
+ const pnrList = resolvePnrList(d?.pnr_info);
83
+ const pnrDep = pnrList.find((p) => p.LegDirectionality === 'Departure')?.pnr ?? pnrList[0]?.pnr;
84
+ const pnrRet = pnrList.find((p) => p.LegDirectionality === 'Return')?.pnr;
85
+ const origin = legs[0]?.LegDepartureAirportCode;
86
+ const dest = legs[legs.length - 1]?.LegArrivalAirportCode;
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ const sections = [];
89
+ // ── Booking Reference ────────────────────────────────────────────────
90
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
+ const refRows = [];
92
+ if (pnrList.length > 1) {
93
+ pnrList.forEach((p) => refRows.push({ label: `PNR (${p.LegDirectionality})`, value: na(p.pnr) }));
94
+ }
95
+ else {
96
+ refRows.push({ label: 'PNR', value: na(pnrDep) });
97
+ }
98
+ refRows.push({ label: 'Booking ID', value: na(cp?.bookingId) }, { label: 'Supplier ref', value: na(cp?.supplierBookingId) }, { label: 'Supplier', value: na(cp?.supplierName ?? legs[0]?.supplierName) });
99
+ sections.push({ title: 'Booking Reference', rows: refRows });
100
+ // ── Per-leg sections ─────────────────────────────────────────────────
101
+ legs.forEach((l, i) => {
102
+ const dir = l.LegDirectionality ?? '';
103
+ const from = l.LegDepartureAirportCode;
104
+ const to = l.LegArrivalAirportCode;
105
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
+ const segs = airlines[i]?.Segments ?? [];
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ const durSegs = dur?.legs?.[i]?.Segments ?? [];
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ const stops = l.Stops ?? [];
111
+ const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
112
+ const flightNos = segs.map((s) => `${s.AirlineCode}${s.FlightNumber}`).filter(Boolean).join(', ');
113
+ sections.push({
114
+ title: `${dirIcon(dir)} ${dir || `Leg ${i + 1}`} · ${from} → ${to}`,
115
+ rows: [
116
+ { label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
117
+ { label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
118
+ { label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
119
+ { label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
120
+ { label: 'Flight no.', value: na(flightNos) },
121
+ { label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
122
+ { label: 'Fare brand', value: na(l.fareBrand?.name) },
123
+ {
124
+ label: 'Stops',
125
+ value: stops.length === 0
126
+ ? 'Non-stop'
127
+ : stops.map((s) => `${s.StopAirportCity ?? s.StopAirport} (${fmtMins(s.LayoverDuration)})`).join(', '),
128
+ },
129
+ ],
130
+ });
131
+ });
132
+ // ── Passengers ───────────────────────────────────────────────────────
133
+ const paxTypeLabel = { ADT: 'Adult', CNN: 'Child', INF: 'Infant' };
134
+ passengers.forEach((p, i) => {
135
+ const fullName = [p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ');
136
+ const phone = p?.phone ?? (p?.contactNumber?.phoneNumber
137
+ ? `${p.contactNumber.countryCode ?? ''}${p.contactNumber.phoneNumber}` : null);
138
+ sections.push({
139
+ title: `Passenger ${i + 1} · ${fullName || na(null)}`,
140
+ rows: [
141
+ { label: 'Type', value: na(paxTypeLabel[p?.type] ?? p?.type) },
142
+ { label: 'Gender', value: na(p?.gender) },
143
+ { label: 'Date of birth', value: na(p?.dateOfBirth) },
144
+ { label: 'Passport', value: na(p?.identity?.number) },
145
+ { label: 'Nationality', value: na(p?.identity?.nationality) },
146
+ { label: 'Passport exp.', value: na(p?.identity?.expirationDate) },
147
+ { label: 'Issue country', value: na(p?.identity?.issueCountry) },
148
+ { label: 'Doc type', value: na(p?.identity?.type) },
149
+ { label: 'Email', value: na(p?.email) },
150
+ { label: 'Phone', value: na(phone) },
151
+ ],
152
+ });
153
+ });
154
+ // ── Payment ──────────────────────────────────────────────────────────
155
+ if (ps) {
156
+ const statusName = ps?.status?.name ?? ps?.status?.key;
157
+ const paid = ps?.amountInPaidCurrency != null && ps?.paidCurrency
158
+ ? `${ps.amountInPaidCurrency} ${ps.paidCurrency}` : null;
159
+ sections.push({
160
+ title: 'Payment',
161
+ rows: [
162
+ { label: 'Status', value: na(statusName) },
163
+ { label: 'Amount', value: ps?.amount != null ? `${ps.amount} ${na(ps.currency)}` : 'Not available' },
164
+ { label: 'Paid amount', value: na(paid) },
165
+ { label: 'Payment method', value: na(ps?.method) },
166
+ { label: 'Date', value: fmtDate(ps?.date) },
167
+ ],
168
+ });
169
+ }
170
+ // ── Baggage per route (full detail) ──────────────────────────────────
171
+ const baggageInfo = baggage?.baggage_info ?? [];
172
+ baggageInfo.forEach((entry) => {
173
+ const route = Object.keys(entry)[0];
174
+ if (!route)
175
+ return;
176
+ const paxTypes = entry[route] ?? {};
177
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
178
+ const rows = [];
179
+ Object.entries(paxTypes).forEach(([paxType, pd]) => {
180
+ const label = paxType === 'ADT' ? 'Adult' : paxType === 'CNN' ? 'Child' : paxType === 'INF' ? 'Infant' : paxType;
181
+ const cabin = pd.CabinBaggage;
182
+ const checked = pd.CheckedBaggage;
183
+ const underSeat = pd.UnderSeatBaggage;
184
+ rows.push({ label: `${label} · Cabin`, value: fmtBag(cabin) }, { label: `${label} · Checked`, value: fmtBag(checked) });
185
+ if (underSeat)
186
+ rows.push({ label: `${label} · Under Seat`, value: fmtBag(underSeat) });
187
+ });
188
+ sections.push({ title: `Baggage · ${route}`, rows });
189
+ });
190
+ // ── Terminal Info summary ────────────────────────────────────────────
191
+ const terminalData = d?.terminal ?? [];
192
+ terminalData.forEach((tl, li) => {
193
+ const legMeta = legs[li];
194
+ const legLabel = legMeta
195
+ ? `Terminal · ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
196
+ : `Terminal · Leg ${li + 1}`;
197
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
+ const termRows = [];
199
+ (tl.Segments ?? []).forEach((s, si) => {
200
+ const airlineSeg = airlines[li]?.Segments?.[si];
201
+ const flightNo = airlineSeg ? `${airlineSeg.AirlineCode}${airlineSeg.FlightNumber}` : `Seg ${si + 1}`;
202
+ const depTerm = s.DepartureAirportTerminalID ? `T${s.DepartureAirportTerminalID}` : '—';
203
+ const arrTerm = s.ArrivalAirportTerminalID ? `T${s.ArrivalAirportTerminalID}` : '—';
204
+ termRows.push({
205
+ label: flightNo,
206
+ value: `${na(s.DepartureAirportCode)} ${depTerm} → ${na(s.ArrivalAirportCode)} ${arrTerm}`,
207
+ });
208
+ });
209
+ if (termRows.length > 0)
210
+ sections.push({ title: legLabel, rows: termRows });
211
+ });
212
+ // ── Cancellation Policy summary ──────────────────────────────────────
213
+ const cpLegs = cp?.legs ?? [];
214
+ cpLegs.forEach((leg) => {
215
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
216
+ const cpRows = [];
217
+ (leg.passengerPenalties ?? []).forEach((pp) => {
218
+ const typeLabel = pp.type === 'ADT' ? 'Adult' : pp.type === 'CNN' ? 'Child' : 'Infant';
219
+ const bDep = pp.penalties?.beforeDeparture;
220
+ const refund = bDep?.refund;
221
+ const exchange = bDep?.exchange;
222
+ const refundStr = refund?.isActionable ? `Refund: ${refund.fee} ${refund.currency}` : 'No refund';
223
+ const exchangeStr = exchange?.isActionable ? `Exchange: ${exchange.fee} ${exchange.currency}` : 'No exchange';
224
+ cpRows.push({ label: typeLabel, value: `${refundStr} · ${exchangeStr}` });
225
+ });
226
+ if (cpRows.length > 0) {
227
+ sections.push({
228
+ title: `Cancellation and Change Policy · ${leg.direction} (${leg.from} → ${leg.to})`,
229
+ rows: cpRows,
230
+ });
231
+ }
232
+ });
233
+ return {
234
+ title: origin ? `${origin} → ${dest}` : 'Flight Booking',
235
+ subtitle: pnrDep
236
+ ? `PNR: ${pnrDep}${pnrRet ? ' / ' + pnrRet : ''} · ${legs.length} leg${legs.length !== 1 ? 's' : ''} · ${passengers.length} pax`
237
+ : `${legs.length} leg${legs.length !== 1 ? 's' : ''} · ${passengers.length} pax`,
238
+ sections,
239
+ };
240
+ },
241
+ },
242
+ // ── Terminal Info ─────────────────────────────────────────────────────────
243
+ {
244
+ key: 'terminal',
245
+ type: 'flight',
246
+ label: 'Terminal Info',
247
+ subtitle: 'Gate · Check-in',
248
+ icon: 'pi pi-send',
249
+ apiField: 'booking_info',
250
+ formatter: (data) => {
251
+ const d = bi(data);
252
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
253
+ const terminalLegs = d?.terminal ?? [];
254
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
255
+ const legInfos = d?.leg_info ?? [];
256
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
257
+ const airlines = d?.airline_info ?? [];
258
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
+ const sections = [];
260
+ terminalLegs.forEach((tl, li) => {
261
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
262
+ const segs = tl.Segments ?? [];
263
+ const legMeta = legInfos[li];
264
+ const legLabel = legMeta
265
+ ? `${dirIcon(legMeta.LegDirectionality)} ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
266
+ : `Leg ${li + 1}`;
267
+ // Leg-level times as fallback when segment-level times are absent
268
+ const legDepTime = legMeta?.LegDepartureDateTime;
269
+ const legArrTime = legMeta?.LegArrivalDateTime;
270
+ segs.forEach((s, si) => {
271
+ const airlineSeg = airlines[li]?.Segments?.[si];
272
+ // Resolve flight number: terminal seg → airline_info seg
273
+ const flightNo = s.FlightNumber
274
+ ? `${s.AirlineCode ?? ''}${s.FlightNumber}`
275
+ : airlineSeg ? `${airlineSeg.AirlineCode}${airlineSeg.FlightNumber}` : null;
276
+ // Resolve times: terminal seg → airline_info seg → leg-level fallback
277
+ const depTime = s.DepartureDateTime
278
+ ?? airlineSeg?.DepartureDateTime
279
+ ?? (si === 0 ? legDepTime : null);
280
+ const arrTime = s.ArrivalDateTime
281
+ ?? airlineSeg?.ArrivalDateTime
282
+ ?? (si === segs.length - 1 ? legArrTime : null);
283
+ sections.push({
284
+ title: `${legLabel} · ${flightNo ?? `Seg ${si + 1}`}`,
285
+ rows: [
286
+ { label: 'Departure airport', value: s.DepartureAirportName ? `${s.DepartureAirportName} (${s.DepartureAirportCode})` : na(s.DepartureAirportCode) },
287
+ { label: 'Dep. terminal', value: na(s.DepartureAirportTerminalID) },
288
+ { label: 'Arrival airport', value: s.ArrivalAirportName ? `${s.ArrivalAirportName} (${s.ArrivalAirportCode})` : na(s.ArrivalAirportCode) },
289
+ { label: 'Arr. terminal', value: na(s.ArrivalAirportTerminalID) },
290
+ { label: 'Flight', value: na(flightNo) },
291
+ { label: 'Departure time', value: fmtDate(depTime) },
292
+ { label: 'Arrival time', value: fmtDate(arrTime) },
293
+ ],
294
+ });
295
+ });
296
+ });
297
+ const totalSegs = sections.length;
298
+ return {
299
+ title: 'Terminal Details',
300
+ subtitle: `${totalSegs} segment${totalSegs !== 1 ? 's' : ''}`,
301
+ sections: sections.length
302
+ ? sections
303
+ : [{ title: 'Info', rows: [{ label: 'Status', value: 'No terminal data available' }] }],
304
+ };
305
+ },
306
+ },
307
+ // ── Payment Status ────────────────────────────────────────────────────────
308
+ {
309
+ key: 'payment_status',
310
+ type: 'flight',
311
+ hidden: true,
312
+ label: 'Payment Status',
313
+ subtitle: 'Charges · Receipt',
314
+ icon: 'pi pi-credit-card',
315
+ apiField: 'booking_info',
316
+ formatter: (data) => {
317
+ const ps = bi(data)?.payment_status;
318
+ const statusName = ps?.status?.name ?? ps?.status?.key;
319
+ const paid = ps?.amountInPaidCurrency != null && ps?.paidCurrency
320
+ ? `${ps.amountInPaidCurrency} ${ps.paidCurrency}` : null;
321
+ const isSuccess = ps?.status?.key === 'SUCCESS';
322
+ return {
323
+ title: 'Payment Details',
324
+ subtitle: na(statusName),
325
+ sections: [
326
+ {
327
+ title: 'Transaction',
328
+ rows: [
329
+ { label: 'Status', value: na(statusName), valueClass: isSuccess ? 'positive' : 'neutral' },
330
+ { label: 'Amount', value: ps?.amount != null ? `${ps.amount} ${na(ps.currency)}` : 'Not available' },
331
+ { label: 'Paid amount', value: na(paid) },
332
+ { label: 'Payment method', value: na(ps?.method) },
333
+ { label: 'Transaction ref', value: na(ps?.transactionRef ?? ps?.reference) },
334
+ { label: 'Date', value: fmtDate(ps?.date) },
335
+ { label: 'Currency', value: na(ps?.currency) },
336
+ ],
337
+ },
338
+ ],
339
+ };
340
+ },
341
+ },
342
+ // ── Passenger Info ────────────────────────────────────────────────────────
343
+ {
344
+ key: 'passenger_info',
345
+ type: 'flight',
346
+ hidden: true,
347
+ label: 'Passenger Info',
348
+ subtitle: 'Names · Docs',
349
+ icon: 'pi pi-users',
350
+ apiField: 'booking_info',
351
+ formatter: (data) => {
352
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
353
+ const passengers = bi(data)?.passenger_info?.passengers ?? [];
354
+ const typeLabel = { ADT: 'Adult', CNN: 'Child', INF: 'Infant' };
355
+ return {
356
+ title: 'Passenger Details',
357
+ subtitle: `${passengers.length} traveller${passengers.length !== 1 ? 's' : ''}`,
358
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
359
+ sections: passengers.map((p, i) => {
360
+ const fullName = [p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ');
361
+ const phone = p?.phone ?? (p?.contactNumber?.phoneNumber
362
+ ? `${p.contactNumber.countryCode ?? ''}${p.contactNumber.phoneNumber}` : null);
363
+ return {
364
+ title: `Passenger ${i + 1} · ${fullName || na(null)}`,
365
+ rows: [
366
+ { label: 'Type', value: na(typeLabel[p?.type] ?? p?.type) },
367
+ { label: 'Gender', value: na(p?.gender) },
368
+ { label: 'Date of birth', value: na(p?.dateOfBirth) },
369
+ { label: 'Passport', value: na(p?.identity?.number) },
370
+ { label: 'Nationality', value: na(p?.identity?.nationality) },
371
+ { label: 'Passport exp.', value: na(p?.identity?.expirationDate) },
372
+ { label: 'Issue country', value: na(p?.identity?.issueCountry) },
373
+ { label: 'Doc type', value: na(p?.identity?.type) },
374
+ { label: 'Email', value: na(p?.email) },
375
+ { label: 'Phone', value: na(phone) },
376
+ ],
377
+ };
378
+ }),
379
+ };
380
+ },
381
+ },
382
+ // ── Passenger Count ───────────────────────────────────────────────────────
383
+ {
384
+ key: 'passenger_count',
385
+ type: 'flight',
386
+ hidden: true,
387
+ label: 'Passenger Count',
388
+ subtitle: 'Adults · Children · Infants',
389
+ icon: 'pi pi-users',
390
+ apiField: 'booking_info',
391
+ formatter: (data) => {
392
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
393
+ const passengers = bi(data)?.passenger_info?.passengers ?? [];
394
+ const adults = passengers.filter(p => p?.type === 'ADT');
395
+ const children = passengers.filter(p => p?.type === 'CNN');
396
+ const infants = passengers.filter(p => p?.type === 'INF');
397
+ return {
398
+ title: 'Traveller Breakdown',
399
+ subtitle: `${passengers.length} total`,
400
+ sections: [
401
+ {
402
+ title: 'Summary',
403
+ rows: [
404
+ { label: 'Total', value: String(passengers.length) },
405
+ { label: 'Adults (ADT)', value: String(adults.length) },
406
+ { label: 'Children (CNN)', value: String(children.length) },
407
+ { label: 'Infants (INF)', value: String(infants.length) },
408
+ ],
409
+ },
410
+ ...adults.map((p, i) => ({
411
+ title: `Adult ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
412
+ rows: [
413
+ { label: 'Passport', value: na(p?.identity?.number) },
414
+ { label: 'Email', value: na(p?.email) },
415
+ ],
416
+ })),
417
+ ...children.map((p, i) => ({
418
+ title: `Child ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
419
+ rows: [
420
+ { label: 'Passport', value: na(p?.identity?.number) },
421
+ { label: 'DOB', value: na(p?.dateOfBirth) },
422
+ ],
423
+ })),
424
+ ...infants.map((p, i) => ({
425
+ title: `Infant ${i + 1} · ${[p?.name?.prefix, p?.name?.givenName, p?.name?.surName].filter(Boolean).join(' ') || 'N/A'}`,
426
+ rows: [
427
+ { label: 'DOB', value: na(p?.dateOfBirth) },
428
+ ],
429
+ })),
430
+ ],
431
+ };
432
+ },
433
+ },
434
+ // ── Airline Info ──────────────────────────────────────────────────────────
435
+ {
436
+ key: 'airline_info',
437
+ type: 'flight',
438
+ hidden: true,
439
+ label: 'Airline Info',
440
+ subtitle: 'Carrier · Flight no.',
441
+ icon: 'pi pi-send',
442
+ apiField: 'booking_info',
443
+ formatter: (data) => {
444
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
445
+ const airlines = bi(data)?.airline_info ?? [];
446
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
447
+ const legInfos = bi(data)?.leg_info ?? [];
448
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
449
+ const durLegs = bi(data)?.duration?.legs ?? [];
450
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
451
+ const sections = [];
452
+ airlines.forEach((a, li) => {
453
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
454
+ const segs = a.Segments ?? [];
455
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
456
+ const durSegs = durLegs[li]?.Segments ?? [];
457
+ const legMeta = legInfos[li];
458
+ const legLabel = legMeta
459
+ ? `${dirIcon(legMeta.LegDirectionality)} ${legMeta.LegDepartureAirportCode} → ${legMeta.LegArrivalAirportCode}`
460
+ : `Leg ${li + 1}`;
461
+ // Leg-level times as fallback for first/last segment
462
+ const legDepTime = legMeta?.LegDepartureDateTime;
463
+ const legArrTime = legMeta?.LegArrivalDateTime;
464
+ segs.forEach((s, si) => {
465
+ // Use segment-level times if available, fall back to leg times
466
+ const depTime = s.DepartureDateTime ?? (si === 0 ? legDepTime : null);
467
+ const arrTime = s.ArrivalDateTime ?? (si === segs.length - 1 ? legArrTime : null);
468
+ sections.push({
469
+ title: `${legLabel} · ${s.AirlineCode}${s.FlightNumber} (Seg ${si + 1})`,
470
+ rows: [
471
+ { label: 'Airline', value: na(s.AirlineName) },
472
+ { label: 'IATA code', value: na(s.AirlineCode) },
473
+ { label: 'Flight no.', value: s.FlightNumber ? `${s.AirlineCode}${s.FlightNumber}` : 'Not available' },
474
+ { label: 'Route', value: `${na(s.DepartureAirportCode)} → ${na(s.ArrivalAirportCode)}` },
475
+ { label: 'Departure', value: fmtDate(depTime) },
476
+ { label: 'Arrival', value: fmtDate(arrTime) },
477
+ { label: 'Duration', value: durSegs[si]?.SegmentElapsedTimeMinutes ? fmtMins(durSegs[si].SegmentElapsedTimeMinutes) : 'Not available' },
478
+ { label: 'Aircraft', value: na(s.AircraftType ?? s.Equipment) },
479
+ { label: 'Operating code', value: na(s.OperatingAirlineCode) },
480
+ ],
481
+ });
482
+ });
483
+ });
484
+ const totalSegs = sections.length;
485
+ return {
486
+ title: airlines[0]?.Segments?.[0]?.AirlineName ?? 'Airline Info',
487
+ subtitle: `${totalSegs} segment${totalSegs !== 1 ? 's' : ''}`,
488
+ sections,
489
+ };
490
+ },
491
+ },
492
+ // ── Leg Info ──────────────────────────────────────────────────────────────
493
+ {
494
+ key: 'leg_info',
495
+ type: 'flight',
496
+ hidden: true,
497
+ label: 'Leg Info',
498
+ subtitle: 'Route · Stops · Cabin',
499
+ icon: 'pi pi-map-marker',
500
+ apiField: 'booking_info',
501
+ formatter: (data) => {
502
+ const d = bi(data);
503
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
504
+ const legs = d?.leg_info ?? [];
505
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
506
+ const airlines = d?.airline_info ?? [];
507
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
508
+ const durLegs = d?.duration?.legs ?? [];
509
+ return {
510
+ title: 'Flight Legs',
511
+ subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''}`,
512
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
513
+ sections: legs.map((l, i) => {
514
+ const dir = l.LegDirectionality ?? '';
515
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
516
+ const stops = l.Stops ?? [];
517
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
518
+ const segs = airlines[i]?.Segments ?? [];
519
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
520
+ const durSegs = durLegs[i]?.Segments ?? [];
521
+ const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
522
+ const flightNos = segs.map((s) => `${s.AirlineCode}${s.FlightNumber}`).filter(Boolean).join(', ');
523
+ return {
524
+ title: `${dirIcon(dir)} ${dir || `Leg ${i + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
525
+ rows: [
526
+ { label: 'Direction', value: na(dir) },
527
+ { label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
528
+ { label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
529
+ { label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
530
+ { label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
531
+ { label: 'Flight no.', value: na(flightNos) },
532
+ { label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
533
+ { label: 'Fare brand', value: na(l.fareBrand?.name) },
534
+ { label: 'Supplier', value: na(l.supplierName) },
535
+ {
536
+ label: 'Stops',
537
+ value: stops.length === 0
538
+ ? 'Non-stop'
539
+ : stops.map((s) => `${s.StopAirportCity ?? s.StopAirport} (${na(s.StopAirport)}) – ${fmtMins(s.LayoverDuration)} layover`).join(' · '),
540
+ },
541
+ ],
542
+ };
543
+ }),
544
+ };
545
+ },
546
+ },
547
+ // ── PNR Info ──────────────────────────────────────────────────────────────
548
+ {
549
+ key: 'pnr_info',
550
+ type: 'flight',
551
+ label: 'PNR Info',
552
+ subtitle: 'PNR · Booking ref',
553
+ icon: 'pi pi-tag',
554
+ apiField: 'booking_info',
555
+ formatter: (data) => {
556
+ const d = bi(data);
557
+ const pnrList = resolvePnrList(d?.pnr_info);
558
+ const pnrDep = pnrList.find((p) => p.LegDirectionality === 'Departure')?.pnr ?? pnrList[0]?.pnr;
559
+ const pnrRet = pnrList.find((p) => p.LegDirectionality === 'Return')?.pnr;
560
+ const cp = d?.cancellation_policy;
561
+ const isCrossSeller = pnrList.length > 1
562
+ || cp?.supplierName?.toLowerCase().includes('cross')
563
+ || false;
564
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
565
+ const pnrRows = [];
566
+ if (pnrList.length > 1) {
567
+ pnrList.forEach((p) => {
568
+ pnrRows.push({ label: `PNR (${p.LegDirectionality})`, value: na(p.pnr) });
569
+ });
570
+ }
571
+ else {
572
+ pnrRows.push({ label: 'PNR', value: na(pnrDep) });
573
+ }
574
+ pnrRows.push({ label: 'Booking ID', value: na(cp?.bookingId) }, { label: 'Supplier ref', value: na(cp?.supplierBookingId) }, { label: 'Supplier', value: na(cp?.supplierName) }, { label: 'Cross-seller', value: isCrossSeller ? 'Yes' : 'No' });
575
+ return {
576
+ title: pnrDep ? `PNR: ${pnrDep}${pnrRet ? ' / ' + pnrRet : ''}` : 'PNR Info',
577
+ subtitle: isCrossSeller ? 'Cross-seller booking — two PNRs' : 'Global Distribution System reference',
578
+ sections: [{ title: 'References', rows: pnrRows }],
579
+ };
580
+ },
581
+ },
582
+ // ── Baggage Policy ────────────────────────────────────────────────────────
583
+ {
584
+ key: 'baggage',
585
+ type: 'flight',
586
+ label: 'Baggage Policy',
587
+ subtitle: 'Cabin · Checked · Add-ons',
588
+ icon: 'pi pi-briefcase',
589
+ apiField: 'booking_info',
590
+ formatter: (data) => {
591
+ const baggage = bi(data)?.baggage;
592
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
593
+ const infoArray = baggage?.baggage_info ?? [];
594
+ const addOns = baggage?.add_on_baggage ?? [];
595
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
596
+ const sections = [];
597
+ const routeNames = [];
598
+ infoArray.forEach((entry) => {
599
+ const route = Object.keys(entry)[0];
600
+ if (!route)
601
+ return;
602
+ routeNames.push(route);
603
+ const paxTypes = entry[route] ?? {};
604
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
605
+ const rows = [];
606
+ Object.entries(paxTypes).forEach(([paxType, pd]) => {
607
+ const label = paxType === 'ADT' ? 'Adult' : paxType === 'CNN' ? 'Child' : paxType === 'INF' ? 'Infant' : paxType;
608
+ const cabin = pd.CabinBaggage;
609
+ const checked = pd.CheckedBaggage;
610
+ const underSeat = pd.UnderSeatBaggage;
611
+ rows.push({ label: `${label} · Cabin`, value: fmtBag(cabin) }, { label: `${label} · Checked`, value: fmtBag(checked) });
612
+ if (underSeat) {
613
+ rows.push({ label: `${label} · Under Seat`, value: fmtBag(underSeat) });
614
+ }
615
+ });
616
+ sections.push({ title: `Baggage · ${route}`, rows });
617
+ });
618
+ if (addOns.length > 0) {
619
+ sections.push({
620
+ title: 'Add-on Baggage',
621
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
622
+ rows: addOns.map((a, i) => ({
623
+ label: `Add-on ${i + 1}`,
624
+ value: [a.weight, a.unit, a.route].filter(Boolean).join(' · ') || 'See booking details',
625
+ })),
626
+ });
627
+ }
628
+ return {
629
+ title: 'Baggage Allowance',
630
+ subtitle: routeNames.length > 0 ? routeNames.join(' · ') : 'All baggage types',
631
+ sections: sections.length > 0
632
+ ? sections
633
+ : [{ title: 'Info', rows: [{ label: 'Status', value: 'No baggage data available' }] }],
634
+ };
635
+ },
636
+ },
637
+ // ── Flight Timings ────────────────────────────────────────────────────────
638
+ {
639
+ key: 'flight_timings',
640
+ type: 'flight',
641
+ hidden: true,
642
+ label: 'Flight Timings',
643
+ subtitle: 'Departure · Arrival',
644
+ icon: 'pi pi-clock',
645
+ apiField: 'booking_info',
646
+ formatter: (data) => {
647
+ const d = bi(data);
648
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
649
+ const legs = d?.leg_info ?? [];
650
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
651
+ const airlines = d?.airline_info ?? [];
652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
653
+ const durLegs = d?.duration?.legs ?? [];
654
+ return {
655
+ title: 'Flight Timings',
656
+ subtitle: legs.length > 0
657
+ ? `${legs[0].LegDepartureAirportCode} → ${legs[legs.length - 1].LegArrivalAirportCode}`
658
+ : 'All legs',
659
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
660
+ sections: legs.map((l, li) => {
661
+ const dir = l.LegDirectionality ?? '';
662
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
663
+ const segs = airlines[li]?.Segments ?? [];
664
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
665
+ const durSegs = durLegs[li]?.Segments ?? [];
666
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
667
+ const stops = l.Stops ?? [];
668
+ const legDurMins = durSegs.reduce((sum, s) => sum + (s.SegmentElapsedTimeMinutes ?? 0), 0);
669
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
670
+ const rows = [
671
+ { label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
672
+ { label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
673
+ { label: 'Duration', value: legDurMins > 0 ? fmtMins(legDurMins) : na(null) },
674
+ ];
675
+ // Interleave segment rows with layover rows
676
+ segs.forEach((s, si) => {
677
+ const segDur = durSegs[si]?.SegmentElapsedTimeMinutes;
678
+ rows.push({
679
+ label: `Seg ${si + 1} · ${s.AirlineCode}${s.FlightNumber}`,
680
+ value: `${na(s.DepartureAirportCode)} → ${na(s.ArrivalAirportCode)}${segDur ? ' · ' + fmtMins(segDur) : ''}`,
681
+ });
682
+ // Layover after this segment (if there is a stop at arrival airport)
683
+ if (si < segs.length - 1) {
684
+ const stop = stops.find((st) => st.StopAirport === s.ArrivalAirportCode);
685
+ if (stop) {
686
+ rows.push({ label: `Layover · ${stop.StopAirport}`, value: fmtMins(stop.LayoverDuration) });
687
+ }
688
+ }
689
+ });
690
+ return {
691
+ title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
692
+ rows,
693
+ };
694
+ }),
695
+ };
696
+ },
697
+ },
698
+ // ── Duration ──────────────────────────────────────────────────────────────
699
+ {
700
+ key: 'duration',
701
+ type: 'flight',
702
+ hidden: true,
703
+ label: 'Duration',
704
+ subtitle: 'Total flight time',
705
+ icon: 'pi pi-refresh',
706
+ apiField: 'booking_info',
707
+ formatter: (data) => {
708
+ const d = bi(data);
709
+ const dur = d?.duration;
710
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
711
+ const legs = d?.leg_info ?? [];
712
+ const total = fmtMins(dur?.totalMinutes);
713
+ return {
714
+ title: total,
715
+ subtitle: 'Total journey duration including layovers',
716
+ sections: [
717
+ {
718
+ title: 'Total',
719
+ rows: [{ label: 'Journey duration', value: total }],
720
+ },
721
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
722
+ ...(dur?.legs ?? []).map((leg, li) => {
723
+ const legMeta = legs[li];
724
+ const dir = legMeta?.LegDirectionality ?? '';
725
+ const from = legMeta?.LegDepartureAirportCode;
726
+ const to = legMeta?.LegArrivalAirportCode;
727
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
728
+ const rows = [];
729
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
730
+ (leg.Segments ?? []).forEach((s) => {
731
+ rows.push({ label: `${s.DepartureAirportCode} → ${s.ArrivalAirportCode}`, value: fmtMins(s.SegmentElapsedTimeMinutes) });
732
+ });
733
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
734
+ (leg.Stops ?? []).forEach((s) => {
735
+ rows.push({ label: `Layover · ${s.StopAirport}`, value: fmtMins(s.LayoverDuration) });
736
+ });
737
+ return {
738
+ title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`}${from && to ? ` · ${from} → ${to}` : ''}`,
739
+ rows,
740
+ };
741
+ }),
742
+ ],
743
+ };
744
+ },
745
+ },
746
+ // ── Cancellation Policy ───────────────────────────────────────────────────
747
+ {
748
+ key: 'cancellation_policy',
749
+ type: 'flight',
750
+ label: 'Cancellation Policy',
751
+ subtitle: 'Refund · Fees · Legs',
752
+ icon: 'pi pi-ban',
753
+ apiField: 'booking_info',
754
+ formatter: (data) => {
755
+ const d = bi(data);
756
+ const cp = d?.cancellation_policy;
757
+ if (!cp) {
758
+ return {
759
+ title: 'Cancellation Policy',
760
+ subtitle: 'No data available',
761
+ sections: [{ title: 'Info', rows: [{ label: 'Status', value: 'No cancellation policy data available' }] }],
762
+ };
763
+ }
764
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
765
+ const sections = [];
766
+ const pnrList = resolvePnrList(d?.pnr_info);
767
+ const isCrossSeller = pnrList.length > 1 || cp?.supplierName?.toLowerCase().includes('cross');
768
+ const legs = cp?.legs ?? [];
769
+ sections.push({
770
+ title: 'Booking Reference',
771
+ rows: [
772
+ { label: 'Booking ID', value: na(cp.bookingId) },
773
+ { label: 'Supplier ref', value: na(cp.supplierBookingId) },
774
+ { label: 'Supplier', value: na(cp.supplierName) },
775
+ { label: 'Cross-seller', value: isCrossSeller ? 'Yes' : 'No' },
776
+ ],
777
+ });
778
+ const fmtFee = (fee, currency) => fee != null ? `${fee} ${currency ?? 'SAR'}` : '0';
779
+ legs.forEach((leg) => {
780
+ const title = `Cancellation and Change Policy · ${leg.direction} (${leg.from} → ${leg.to})`;
781
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
782
+ const rows = [];
783
+ (leg.passengerPenalties ?? []).forEach((pp) => {
784
+ const typeLabel = pp.type === 'ADT' ? 'Adult' : pp.type === 'CNN' ? 'Child' : 'Infant';
785
+ const bDep = pp.penalties?.beforeDeparture;
786
+ const aDep = pp.penalties?.afterDeparture;
787
+ const bRefund = bDep?.refund;
788
+ const bExchange = bDep?.exchange;
789
+ const aRefund = aDep?.refund;
790
+ const aExchange = aDep?.exchange;
791
+ rows.push({
792
+ label: `${typeLabel} · Before dep.`,
793
+ value: [
794
+ bRefund?.isActionable ? `Refund: ${fmtFee(bRefund.fee, bRefund.currency)}` : 'No refund',
795
+ bExchange?.isActionable ? `Exchange: ${fmtFee(bExchange.fee, bExchange.currency)}` : 'No exchange',
796
+ ].join(' · '),
797
+ valueClass: bRefund?.isActionable || bExchange?.isActionable ? 'neutral' : 'negative',
798
+ }, {
799
+ label: `${typeLabel} · After dep.`,
800
+ value: [
801
+ aRefund?.isActionable ? `Refund: ${fmtFee(aRefund.fee, aRefund.currency)}` : 'No refund',
802
+ aExchange?.isActionable ? `Exchange: ${fmtFee(aExchange.fee, aExchange.currency)}` : 'No exchange',
803
+ ].join(' · '),
804
+ valueClass: aRefund?.isActionable || aExchange?.isActionable ? 'neutral' : 'negative',
805
+ });
806
+ });
807
+ sections.push({ title, rows });
808
+ });
809
+ return {
810
+ title: `${cp.supplierName ?? 'Cancellation'} Policy`,
811
+ subtitle: isCrossSeller ? 'Cross-seller booking · contact supplier for refund' : `Booking ${cp.bookingId ?? ''}`,
812
+ sections,
813
+ callout: isCrossSeller
814
+ ? { type: 'info', message: 'Cross-seller booking — refund is processed by the partner and may take additional time.' }
815
+ : undefined,
816
+ };
817
+ },
818
+ },
819
+ // ── Flight Status ─────────────────────────────────────────────────────────
820
+ {
821
+ key: 'flight_status',
822
+ type: 'flight',
823
+ hidden: true,
824
+ label: 'Flight Status',
825
+ subtitle: 'Live · Delays',
826
+ icon: 'pi pi-chart-bar',
827
+ apiField: 'booking_info',
828
+ formatter: (data) => {
829
+ const d = bi(data);
830
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
831
+ const legs = d?.leg_info ?? [];
832
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
833
+ const airlines = d?.airline_info ?? [];
834
+ const origin = legs[0]?.LegDepartureAirportCode;
835
+ const dest = legs[legs.length - 1]?.LegArrivalAirportCode;
836
+ return {
837
+ title: origin ? `${origin} → ${dest}` : 'Flight Status',
838
+ subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''} · Scheduled times from booking`,
839
+ sections: legs.map((l, li) => {
840
+ const dir = l.LegDirectionality ?? '';
841
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
842
+ const segs = airlines[li]?.Segments ?? [];
843
+ return {
844
+ title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
845
+ rows: [
846
+ { label: 'Departure', value: fmtDate(l.LegDepartureDateTime) },
847
+ { label: 'Arrival', value: fmtDate(l.LegArrivalDateTime) },
848
+ { label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
849
+ { label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
850
+ { label: 'Fare brand', value: na(l.fareBrand?.name) },
851
+ ...segs.map((s, si) => ({
852
+ label: `Flight ${si + 1}`,
853
+ value: `${s.AirlineCode}${s.FlightNumber} · ${s.DepartureAirportCode} → ${s.ArrivalAirportCode}`,
854
+ })),
855
+ ],
856
+ };
857
+ }),
858
+ callout: { type: 'info', message: 'Live status not available — check the airline app or airport boards for real-time updates.' },
859
+ };
860
+ },
861
+ },
862
+ // ── Wi-Fi & Extras ────────────────────────────────────────────────────────
863
+ {
864
+ key: 'wifi',
865
+ type: 'flight',
866
+ hidden: true,
867
+ label: 'Wi-Fi & Extras',
868
+ subtitle: 'Onboard services',
869
+ icon: 'pi pi-info-circle',
870
+ apiField: 'booking_info',
871
+ formatter: (data) => {
872
+ const d = bi(data);
873
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
874
+ const legs = d?.leg_info ?? [];
875
+ const addOns = d?.baggage?.add_on_baggage ?? [];
876
+ return {
877
+ title: 'Onboard Extras',
878
+ subtitle: `${legs.length} leg${legs.length !== 1 ? 's' : ''}`,
879
+ sections: [
880
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
881
+ ...legs.map((l, li) => {
882
+ const dir = l.LegDirectionality ?? '';
883
+ return {
884
+ title: `${dirIcon(dir)} ${dir || `Leg ${li + 1}`} · ${l.LegDepartureAirportCode} → ${l.LegArrivalAirportCode}`,
885
+ rows: [
886
+ { label: 'Cabin', value: na(l.LegCabins?.[0]?.Name) },
887
+ { label: 'Fare brand', value: na(l.fareBrand?.name) },
888
+ { label: 'Airline(s)', value: na(l.LegAirlinesNames?.join(', ')) },
889
+ ],
890
+ };
891
+ }),
892
+ ...(addOns.length > 0 ? [{
893
+ title: 'Add-on Baggage',
894
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
895
+ rows: addOns.map((a, i) => ({
896
+ label: `Add-on ${i + 1}`,
897
+ value: [a.weight, a.unit, a.route].filter(Boolean).join(' · ') || 'See booking details',
898
+ })),
899
+ }] : []),
900
+ ],
901
+ callout: { type: 'info', message: 'Detailed onboard amenities depend on the operating airline and fare class.' },
902
+ };
903
+ },
904
+ },
905
+ ];
906
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpZ2h0LWFjdGlvbnMuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb25maWcvZmxpZ2h0LWFjdGlvbnMuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLDhEQUE4RDtBQUM5RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQU0sRUFBVSxFQUFFLENBQzVCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFFdEQsOERBQThEO0FBQzlELE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQztBQUVuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFLENBQ3ZDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFFN0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQVUsRUFBRTtJQUNyQyxJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sZUFBZSxDQUFDO0lBQ2hDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUMxQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVM7WUFDL0MsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUztTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxD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TyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLHFCQUFxQjs2QkFDeEYsQ0FBQyxDQUFDO3lCQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNUO2dCQUNELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLDRFQUE0RSxFQUFFO2FBQ2pILENBQUM7UUFDSixDQUFDO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2FjdGlvbi50eXBlcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBuYSA9ICh2OiBhbnkpOiBzdHJpbmcgPT5cbiAgdiAhPSBudWxsICYmIHYgIT09ICcnID8gU3RyaW5nKHYpIDogJ05vdCBhdmFpbGFibGUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgYmkgPSAoZGF0YTogYW55KSA9PiBkYXRhPy5kYXRhPy5ib29raW5nX2luZm87XG5cbmNvbnN0IGZtdE1pbnMgPSAobWluczogbnVtYmVyKTogc3RyaW5nID0+XG4gIG1pbnMgIT0gbnVsbCA/IGAke01hdGguZmxvb3IobWlucyAvIDYwKX1oICR7bWlucyAlIDYwfW1gIDogJ05vdCBhdmFpbGFibGUnO1xuXG5jb25zdCBmbXREYXRlID0gKGR0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWR0KSByZXR1cm4gJ05vdCBhdmFpbGFibGUnO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRGF0ZShkdCkudG9Mb2NhbGVTdHJpbmcoJ2VuLUdCJywge1xuICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pO1xuICB9IGNhdGNoIHsgcmV0dXJuIGR0OyB9XG59O1xuXG5jb25zdCBkaXJJY29uID0gKGRpcjogc3RyaW5nKSA9PiAoZGlyID09PSAnUmV0dXJuJyB8fCBkaXIgPT09ICdyZXR1cm4nKSA/ICfihpAnIDogJ+KGkic7XG5cbi8qKlxuICogRm9ybWF0IGEgYmFnZ2FnZSBhbGxvd2FuY2Ugb2JqZWN0IChDYWJpbkJhZ2dhZ2UgLyBDaGVja2VkQmFnZ2FnZSAvIFVuZGVyU2VhdEJhZ2dhZ2UpLlxuICogTmVnYXRpdmUgdmFsdWVzICgtMSkgaW5kaWNhdGUgdGhlIGFsbG93YW5jZSBpcyBub3QgYXBwbGljYWJsZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGZtdEJhZyA9IChiYWc6IGFueSk6IHN0cmluZyA9PiB7XG4gIGlmICghYmFnKSByZXR1cm4gJ05vdCBpbmNsdWRlZCc7XG4gIGNvbnN0IHsgUGllY2VzLCBXZWlnaHQsIFVuaXQsIERpbWVuc2lvbiwgUmVtYXJrIH0gPSBiYWc7XG4gIC8vIE5lZ2F0aXZlIFBpZWNlcyA9IG5vdCBhcHBsaWNhYmxlIChlLmcuIFBpZWNlczogLTEsIFdlaWdodDogLTEpXG4gIGlmIChQaWVjZXMgIT0gbnVsbCAmJiBQaWVjZXMgPCAwICYmIChXZWlnaHQgPT0gbnVsbCB8fCBXZWlnaHQgPCAwKSkgcmV0dXJuICdOb3QgaW5jbHVkZWQnO1xuICAvLyBaZXJvIGFjcm9zcyB0aGUgYm9hcmQgPSBub3QgaW5jbHVkZWRcbiAgaWYgKFBpZWNlcyA9PT0gMCAmJiAoV2VpZ2h0ID09PSAwIHx8IFdlaWdodCA9PSBudWxsKSkgcmV0dXJuICdOb3QgaW5jbHVkZWQnO1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgaWYgKFBpZWNlcyAhPSBudWxsICYmIFBpZWNlcyA+IDApIHBhcnRzLnB1c2goYCR7UGllY2VzfSBwYyR7UGllY2VzID4gMSA/ICdzJyA6ICcnfWApO1xuICBpZiAoV2VpZ2h0ICE9IG51bGwgJiYgV2VpZ2h0ID4gMCkgcGFydHMucHVzaChgJHtXZWlnaHR9ICR7VW5pdCA/PyAnS0cnfWApO1xuICBpZiAoRGltZW5zaW9uKSBwYXJ0cy5wdXNoKERpbWVuc2lvbik7XG4gIGlmIChSZW1hcmspIHBhcnRzLnB1c2goUmVtYXJrKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnTm90IGF2YWlsYWJsZSc7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgcG5yX2luZm8gdG8gYSBmbGF0IGFycmF5IHJlZ2FyZGxlc3Mgb2Ygc2hhcGUuXG4gKiBOZXcgQkUgZm9ybWF0OiBbe3BuciwgTGVnRGlyZWN0aW9uYWxpdHl9LCAuLi5dXG4gKiBMZWdhY3kgZm9ybWF0OiB7cG5yOiAnLi4uJ30gb3IgbnVsbFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgcmVzb2x2ZVBuckxpc3QgPSAocG5yUmF3OiBhbnkpOiBhbnlbXSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBuclJhdykpIHJldHVybiBwbnJSYXc7XG4gIGlmIChwbnJSYXc/LnBucikgcmV0dXJuIFt7IHBucjogcG5yUmF3LnBuciwgTGVnRGlyZWN0aW9uYWxpdHk6ICdEZXBhcnR1cmUnIH1dO1xuICByZXR1cm4gW107XG59O1xuXG5leHBvcnQgY29uc3QgRkxJR0hUX0FDVElPTlM6IEFjdGlvbkNvbmZpZ1tdID0gW1xuICAvLyDilIDilIAgQm9va2luZyBPdmVydmlldyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2Jvb2tpbmdfaW5mbycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgbGFiZWw6ICdCb29raW5nIE92ZXJ2aWV3JyxcbiAgICBzdWJ0aXRsZTogJ1JvdXRlIMK3IENsYXNzIMK3IEZhcmUnLFxuICAgIGljb246ICdwaSBwaS1maWxlJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSAgICA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBwYXNzZW5nZXJzOiBhbnlbXSAgPSBkPy5wYXNzZW5nZXJfaW5mbz8ucGFzc2VuZ2VycyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBiYWdnYWdlOiBhbnkgICAgICAgPSBkPy5iYWdnYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGR1cjogYW55ICAgICAgICAgICA9IGQ/LmR1cmF0aW9uO1xuICAgICAgY29uc3QgcHMgICAgICAgICAgICAgICAgID0gZD8ucGF5bWVudF9zdGF0dXM7XG4gICAgICBjb25zdCBjcCAgICAgICAgICAgICAgICAgPSBkPy5jYW5jZWxsYXRpb25fcG9saWN5O1xuICAgICAgY29uc3QgcG5yTGlzdCAgICAgICAgICAgID0gcmVzb2x2ZVBuckxpc3QoZD8ucG5yX2luZm8pO1xuICAgICAgY29uc3QgcG5yRGVwICAgICAgICAgICAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdEZXBhcnR1cmUnKT8ucG5yID8/IHBuckxpc3RbMF0/LnBucjtcbiAgICAgIGNvbnN0IHBuclJldCAgICAgICAgICAgICA9IHBuckxpc3QuZmluZCgocDogYW55KSA9PiBwLkxlZ0RpcmVjdGlvbmFsaXR5ID09PSAnUmV0dXJuJyk/LnBucjtcbiAgICAgIGNvbnN0IG9yaWdpbiAgICAgICAgICAgICA9IGxlZ3NbMF0/LkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlO1xuICAgICAgY29uc3QgZGVzdCAgICAgICAgICAgICAgID0gbGVnc1tsZWdzLmxlbmd0aCAtIDFdPy5MZWdBcnJpdmFsQWlycG9ydENvZGU7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcblxuICAgICAgLy8g4pSA4pSAIEJvb2tpbmcgUmVmZXJlbmNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IHJlZlJvd3M6IGFueVtdID0gW107XG4gICAgICBpZiAocG5yTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBuckxpc3QuZm9yRWFjaCgocDogYW55KSA9PiByZWZSb3dzLnB1c2goeyBsYWJlbDogYFBOUiAoJHtwLkxlZ0RpcmVjdGlvbmFsaXR5fSlgLCB2YWx1ZTogbmEocC5wbnIpIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZlJvd3MucHVzaCh7IGxhYmVsOiAnUE5SJywgdmFsdWU6IG5hKHBuckRlcCkgfSk7XG4gICAgICB9XG4gICAgICByZWZSb3dzLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3A/LmJvb2tpbmdJZCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyIHJlZicsIHZhbHVlOiBuYShjcD8uc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdXBwbGllcicsICAgICB2YWx1ZTogbmEoY3A/LnN1cHBsaWVyTmFtZSA/PyBsZWdzWzBdPy5zdXBwbGllck5hbWUpIH0sXG4gICAgICApO1xuICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiAnQm9va2luZyBSZWZlcmVuY2UnLCByb3dzOiByZWZSb3dzIH0pO1xuXG4gICAgICAvLyDilIDilIAgUGVyLWxlZyBzZWN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGxlZ3MuZm9yRWFjaCgobCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBkaXIgICAgID0gbC5MZWdEaXJlY3Rpb25hbGl0eSA/PyAnJztcbiAgICAgICAgY29uc3QgZnJvbSAgICA9IGwuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGU7XG4gICAgICAgIGNvbnN0IHRvICAgICAgPSBsLkxlZ0Fycml2YWxBaXJwb3J0Q29kZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgc2VnczogYW55W10gICAgPSBhaXJsaW5lc1tpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IGR1clNlZ3M6IGFueVtdID0gZHVyPy5sZWdzPy5baV0/LlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBzdG9wczogYW55W10gICA9IGwuU3RvcHMgPz8gW107XG4gICAgICAgIGNvbnN0IGxlZ0R1ck1pbnMgICAgID0gZHVyU2Vncy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBzOiBhbnkpID0+IHN1bSArIChzLlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMgPz8gMCksIDApO1xuICAgICAgICBjb25zdCBmbGlnaHROb3MgICAgICA9IHNlZ3MubWFwKChzOiBhbnkpID0+IGAke3MuQWlybGluZUNvZGV9JHtzLkZsaWdodE51bWJlcn1gKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcblxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogYCR7ZGlySWNvbihkaXIpfSAke2RpciB8fCBgTGVnICR7aSArIDF9YH0gwrcgJHtmcm9tfSDihpIgJHt0b31gLFxuICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEZXBhcnR1cmUnLCAgdmFsdWU6IGZtdERhdGUobC5MZWdEZXBhcnR1cmVEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICAgdmFsdWU6IGZtdERhdGUobC5MZWdBcnJpdmFsRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnRHVyYXRpb24nLCAgIHZhbHVlOiBsZWdEdXJNaW5zID4gMCA/IGZtdE1pbnMobGVnRHVyTWlucykgOiBuYShudWxsKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0FpcmxpbmUocyknLCB2YWx1ZTogbmEobC5MZWdBaXJsaW5lc05hbWVzPy5qb2luKCcsICcpKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCB2YWx1ZTogbmEoZmxpZ2h0Tm9zKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0NhYmluJywgICAgICB2YWx1ZTogbmEobC5MZWdDYWJpbnM/LlswXT8uTmFtZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1N0b3BzJyxcbiAgICAgICAgICAgICAgdmFsdWU6IHN0b3BzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gJ05vbi1zdG9wJ1xuICAgICAgICAgICAgICAgIDogc3RvcHMubWFwKChzOiBhbnkpID0+IGAke3MuU3RvcEFpcnBvcnRDaXR5ID8/IHMuU3RvcEFpcnBvcnR9ICgke2ZtdE1pbnMocy5MYXlvdmVyRHVyYXRpb24pfSlgKS5qb2luKCcsICcpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDilIDilIAgUGFzc2VuZ2VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGNvbnN0IHBheFR5cGVMYWJlbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQURUOiAnQWR1bHQnLCBDTk46ICdDaGlsZCcsIElORjogJ0luZmFudCcgfTtcbiAgICAgIHBhc3NlbmdlcnMuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IFtwPy5uYW1lPy5wcmVmaXgsIHA/Lm5hbWU/LmdpdmVuTmFtZSwgcD8ubmFtZT8uc3VyTmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcGhvbmUgPSBwPy5waG9uZSA/PyAocD8uY29udGFjdE51bWJlcj8ucGhvbmVOdW1iZXJcbiAgICAgICAgICA/IGAke3AuY29udGFjdE51bWJlci5jb3VudHJ5Q29kZSA/PyAnJ30ke3AuY29udGFjdE51bWJlci5waG9uZU51bWJlcn1gIDogbnVsbCk7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiBgUGFzc2VuZ2VyICR7aSArIDF9IMK3ICR7ZnVsbE5hbWUgfHwgbmEobnVsbCl9YCxcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsICAgICAgICAgIHZhbHVlOiBuYShwYXhUeXBlTGFiZWxbcD8udHlwZV0gPz8gcD8udHlwZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdHZW5kZXInLCAgICAgICAgdmFsdWU6IG5hKHA/LmdlbmRlcikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEYXRlIG9mIGJpcnRoJywgdmFsdWU6IG5hKHA/LmRhdGVPZkJpcnRoKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgICAgICB2YWx1ZTogbmEocD8uaWRlbnRpdHk/Lm51bWJlcikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOYXRpb25hbGl0eScsICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5uYXRpb25hbGl0eSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdQYXNzcG9ydCBleHAuJywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5leHBpcmF0aW9uRGF0ZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJc3N1ZSBjb3VudHJ5JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5pc3N1ZUNvdW50cnkpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnRG9jIHR5cGUnLCAgICAgIHZhbHVlOiBuYShwPy5pZGVudGl0eT8udHlwZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgICAgICAgdmFsdWU6IG5hKHA/LmVtYWlsKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1Bob25lJywgICAgICAgICB2YWx1ZTogbmEocGhvbmUpIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8g4pSA4pSAIFBheW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBpZiAocHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzTmFtZSA9IHBzPy5zdGF0dXM/Lm5hbWUgPz8gcHM/LnN0YXR1cz8ua2V5O1xuICAgICAgICBjb25zdCBwYWlkID0gcHM/LmFtb3VudEluUGFpZEN1cnJlbmN5ICE9IG51bGwgJiYgcHM/LnBhaWRDdXJyZW5jeVxuICAgICAgICAgID8gYCR7cHMuYW1vdW50SW5QYWlkQ3VycmVuY3l9ICR7cHMucGFpZEN1cnJlbmN5fWAgOiBudWxsO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ1BheW1lbnQnLFxuICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTdGF0dXMnLCAgICAgICAgIHZhbHVlOiBuYShzdGF0dXNOYW1lKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0Ftb3VudCcsICAgICAgICAgdmFsdWU6IHBzPy5hbW91bnQgIT0gbnVsbCA/IGAke3BzLmFtb3VudH0gJHtuYShwcy5jdXJyZW5jeSl9YCA6ICdOb3QgYXZhaWxhYmxlJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1BhaWQgYW1vdW50JywgICAgdmFsdWU6IG5hKHBhaWQpIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUGF5bWVudCBtZXRob2QnLCB2YWx1ZTogbmEocHM/Lm1ldGhvZCkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEYXRlJywgICAgICAgICAgIHZhbHVlOiBmbXREYXRlKHBzPy5kYXRlKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgQmFnZ2FnZSBwZXIgcm91dGUgKGZ1bGwgZGV0YWlsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIGNvbnN0IGJhZ2dhZ2VJbmZvOiBhbnlbXSA9IGJhZ2dhZ2U/LmJhZ2dhZ2VfaW5mbyA/PyBbXTtcbiAgICAgIGJhZ2dhZ2VJbmZvLmZvckVhY2goKGVudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBPYmplY3Qua2V5cyhlbnRyeSlbMF07XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgY29uc3QgcGF4VHlwZXMgPSBlbnRyeVtyb3V0ZV0gPz8ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBheFR5cGVzKS5mb3JFYWNoKChbcGF4VHlwZSwgcGRdOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgICAgID0gcGF4VHlwZSA9PT0gJ0FEVCcgPyAnQWR1bHQnIDogcGF4VHlwZSA9PT0gJ0NOTicgPyAnQ2hpbGQnIDogcGF4VHlwZSA9PT0gJ0lORicgPyAnSW5mYW50JyA6IHBheFR5cGU7XG4gICAgICAgICAgY29uc3QgY2FiaW4gICAgID0gcGQuQ2FiaW5CYWdnYWdlO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgICA9IHBkLkNoZWNrZWRCYWdnYWdlO1xuICAgICAgICAgIGNvbnN0IHVuZGVyU2VhdCA9IHBkLlVuZGVyU2VhdEJhZ2dhZ2U7XG4gICAgICAgICAgcm93cy5wdXNoKFxuICAgICAgICAgICAgeyBsYWJlbDogYCR7bGFiZWx9IMK3IENhYmluYCwgICB2YWx1ZTogZm10QmFnKGNhYmluKSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogYCR7bGFiZWx9IMK3IENoZWNrZWRgLCB2YWx1ZTogZm10QmFnKGNoZWNrZWQpIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodW5kZXJTZWF0KSByb3dzLnB1c2goeyBsYWJlbDogYCR7bGFiZWx9IMK3IFVuZGVyIFNlYXRgLCB2YWx1ZTogZm10QmFnKHVuZGVyU2VhdCkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWN0aW9ucy5wdXNoKHsgdGl0bGU6IGBCYWdnYWdlIMK3ICR7cm91dGV9YCwgcm93cyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDilIDilIAgVGVybWluYWwgSW5mbyBzdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgY29uc3QgdGVybWluYWxEYXRhOiBhbnlbXSA9IGQ/LnRlcm1pbmFsID8/IFtdO1xuICAgICAgdGVybWluYWxEYXRhLmZvckVhY2goKHRsOiBhbnksIGxpOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgbGVnTWV0YSA9IGxlZ3NbbGldO1xuICAgICAgICBjb25zdCBsZWdMYWJlbCA9IGxlZ01ldGFcbiAgICAgICAgICA/IGBUZXJtaW5hbCDCtyAke2xlZ01ldGEuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ01ldGEuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWBcbiAgICAgICAgICA6IGBUZXJtaW5hbCDCtyBMZWcgJHtsaSArIDF9YDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdGVybVJvd3M6IGFueVtdID0gW107XG4gICAgICAgICh0bC5TZWdtZW50cyA/PyBbXSkuZm9yRWFjaCgoczogYW55LCBzaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWlybGluZVNlZyA9IGFpcmxpbmVzW2xpXT8uU2VnbWVudHM/LltzaV07XG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm8gICA9IGFpcmxpbmVTZWcgPyBgJHthaXJsaW5lU2VnLkFpcmxpbmVDb2RlfSR7YWlybGluZVNlZy5GbGlnaHROdW1iZXJ9YCA6IGBTZWcgJHtzaSArIDF9YDtcbiAgICAgICAgICBjb25zdCBkZXBUZXJtICAgID0gcy5EZXBhcnR1cmVBaXJwb3J0VGVybWluYWxJRCA/IGBUJHtzLkRlcGFydHVyZUFpcnBvcnRUZXJtaW5hbElEfWAgOiAn4oCUJztcbiAgICAgICAgICBjb25zdCBhcnJUZXJtICAgID0gcy5BcnJpdmFsQWlycG9ydFRlcm1pbmFsSUQgICA/IGBUJHtzLkFycml2YWxBaXJwb3J0VGVybWluYWxJRH1gICAgOiAn4oCUJztcbiAgICAgICAgICB0ZXJtUm93cy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBmbGlnaHRObyxcbiAgICAgICAgICAgIHZhbHVlOiBgJHtuYShzLkRlcGFydHVyZUFpcnBvcnRDb2RlKX0gJHtkZXBUZXJtfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9ICR7YXJyVGVybX1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRlcm1Sb3dzLmxlbmd0aCA+IDApIHNlY3Rpb25zLnB1c2goeyB0aXRsZTogbGVnTGFiZWwsIHJvd3M6IHRlcm1Sb3dzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOKUgOKUgCBDYW5jZWxsYXRpb24gUG9saWN5IHN1bW1hcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgICBjb25zdCBjcExlZ3M6IGFueVtdID0gY3A/LmxlZ3MgPz8gW107XG4gICAgICBjcExlZ3MuZm9yRWFjaCgobGVnOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgY3BSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICAobGVnLnBhc3NlbmdlclBlbmFsdGllcyA/PyBbXSkuZm9yRWFjaCgocHA6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR5cGVMYWJlbCAgID0gcHAudHlwZSA9PT0gJ0FEVCcgPyAnQWR1bHQnIDogcHAudHlwZSA9PT0gJ0NOTicgPyAnQ2hpbGQnIDogJ0luZmFudCc7XG4gICAgICAgICAgY29uc3QgYkRlcCAgICAgICAgPSBwcC5wZW5hbHRpZXM/LmJlZm9yZURlcGFydHVyZTtcbiAgICAgICAgICBjb25zdCByZWZ1bmQgICAgICA9IGJEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBleGNoYW5nZSAgICA9IGJEZXA/LmV4Y2hhbmdlO1xuICAgICAgICAgIGNvbnN0IHJlZnVuZFN0ciAgID0gcmVmdW5kPy5pc0FjdGlvbmFibGUgICA/IGBSZWZ1bmQ6ICR7cmVmdW5kLmZlZX0gJHtyZWZ1bmQuY3VycmVuY3l9YCAgICAgOiAnTm8gcmVmdW5kJztcbiAgICAgICAgICBjb25zdCBleGNoYW5nZVN0ciA9IGV4Y2hhbmdlPy5pc0FjdGlvbmFibGUgPyBgRXhjaGFuZ2U6ICR7ZXhjaGFuZ2UuZmVlfSAke2V4Y2hhbmdlLmN1cnJlbmN5fWAgOiAnTm8gZXhjaGFuZ2UnO1xuICAgICAgICAgIGNwUm93cy5wdXNoKHsgbGFiZWw6IHR5cGVMYWJlbCwgdmFsdWU6IGAke3JlZnVuZFN0cn0gIMK3ICAke2V4Y2hhbmdlU3RyfWAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3BSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQ2FuY2VsbGF0aW9uIGFuZCBDaGFuZ2UgUG9saWN5IMK3ICR7bGVnLmRpcmVjdGlvbn0gKCR7bGVnLmZyb219IOKGkiAke2xlZy50b30pYCxcbiAgICAgICAgICAgIHJvd3M6IGNwUm93cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBvcmlnaW4gPyBgJHtvcmlnaW59IOKGkiAke2Rlc3R9YCA6ICdGbGlnaHQgQm9va2luZycsXG4gICAgICAgIHN1YnRpdGxlOiBwbnJEZXBcbiAgICAgICAgICA/IGBQTlI6ICR7cG5yRGVwfSR7cG5yUmV0ID8gJyAvICcgKyBwbnJSZXQgOiAnJ30gwrcgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyAke3Bhc3NlbmdlcnMubGVuZ3RofSBwYXhgXG4gICAgICAgICAgOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyAke3Bhc3NlbmdlcnMubGVuZ3RofSBwYXhgLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgVGVybWluYWwgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Rlcm1pbmFsJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ1Rlcm1pbmFsIEluZm8nLFxuICAgIHN1YnRpdGxlOiAnR2F0ZSDCtyBDaGVjay1pbicsXG4gICAgaWNvbjogJ3BpIHBpLXNlbmQnLFxuICAgIGFwaUZpZWxkOiAnYm9va2luZ19pbmZvJyxcbiAgICBmb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBkID0gYmkoZGF0YSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgdGVybWluYWxMZWdzOiBhbnlbXSA9IGQ/LnRlcm1pbmFsID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ0luZm9zOiBhbnlbXSAgICAgPSBkPy5sZWdfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBhaXJsaW5lczogYW55W10gICAgID0gZD8uYWlybGluZV9pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IHNlY3Rpb25zOiBhbnlbXSAgICAgPSBbXTtcblxuICAgICAgdGVybWluYWxMZWdzLmZvckVhY2goKHRsLCBsaSkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgPSB0bC5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgY29uc3QgbGVnTWV0YSAgICAgID0gbGVnSW5mb3NbbGldO1xuICAgICAgICBjb25zdCBsZWdMYWJlbCAgICAgPSBsZWdNZXRhXG4gICAgICAgICAgPyBgJHtkaXJJY29uKGxlZ01ldGEuTGVnRGlyZWN0aW9uYWxpdHkpfSAke2xlZ01ldGEuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ01ldGEuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWBcbiAgICAgICAgICA6IGBMZWcgJHtsaSArIDF9YDtcbiAgICAgICAgLy8gTGVnLWxldmVsIHRpbWVzIGFzIGZhbGxiYWNrIHdoZW4gc2VnbWVudC1sZXZlbCB0aW1lcyBhcmUgYWJzZW50XG4gICAgICAgIGNvbnN0IGxlZ0RlcFRpbWUgICA9IGxlZ01ldGE/LkxlZ0RlcGFydHVyZURhdGVUaW1lO1xuICAgICAgICBjb25zdCBsZWdBcnJUaW1lICAgPSBsZWdNZXRhPy5MZWdBcnJpdmFsRGF0ZVRpbWU7XG5cbiAgICAgICAgc2Vncy5mb3JFYWNoKChzLCBzaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFpcmxpbmVTZWcgPSBhaXJsaW5lc1tsaV0/LlNlZ21lbnRzPy5bc2ldO1xuICAgICAgICAgIC8vIFJlc29sdmUgZmxpZ2h0IG51bWJlcjogdGVybWluYWwgc2VnIOKGkiBhaXJsaW5lX2luZm8gc2VnXG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm8gICA9IHMuRmxpZ2h0TnVtYmVyXG4gICAgICAgICAgICA/IGAke3MuQWlybGluZUNvZGUgPz8gJyd9JHtzLkZsaWdodE51bWJlcn1gXG4gICAgICAgICAgICA6IGFpcmxpbmVTZWcgPyBgJHthaXJsaW5lU2VnLkFpcmxpbmVDb2RlfSR7YWlybGluZVNlZy5GbGlnaHROdW1iZXJ9YCA6IG51bGw7XG4gICAgICAgICAgLy8gUmVzb2x2ZSB0aW1lczogdGVybWluYWwgc2VnIOKGkiBhaXJsaW5lX2luZm8gc2VnIOKGkiBsZWctbGV2ZWwgZmFsbGJhY2tcbiAgICAgICAgICBjb25zdCBkZXBUaW1lICAgID0gcy5EZXBhcnR1cmVEYXRlVGltZVxuICAgICAgICAgICAgPz8gYWlybGluZVNlZz8uRGVwYXJ0dXJlRGF0ZVRpbWVcbiAgICAgICAgICAgID8/IChzaSA9PT0gMCA/IGxlZ0RlcFRpbWUgOiBudWxsKTtcbiAgICAgICAgICBjb25zdCBhcnJUaW1lICAgID0gcy5BcnJpdmFsRGF0ZVRpbWVcbiAgICAgICAgICAgID8/IGFpcmxpbmVTZWc/LkFycml2YWxEYXRlVGltZVxuICAgICAgICAgICAgPz8gKHNpID09PSBzZWdzLmxlbmd0aCAtIDEgPyBsZWdBcnJUaW1lIDogbnVsbCk7XG5cbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtsZWdMYWJlbH0gwrcgJHtmbGlnaHRObyA/PyBgU2VnICR7c2kgKyAxfWB9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZSBhaXJwb3J0JywgdmFsdWU6IHMuRGVwYXJ0dXJlQWlycG9ydE5hbWUgPyBgJHtzLkRlcGFydHVyZUFpcnBvcnROYW1lfSAoJHtzLkRlcGFydHVyZUFpcnBvcnRDb2RlfSlgIDogbmEocy5EZXBhcnR1cmVBaXJwb3J0Q29kZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcC4gdGVybWluYWwnLCAgICAgdmFsdWU6IG5hKHMuRGVwYXJ0dXJlQWlycG9ydFRlcm1pbmFsSUQpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsIGFpcnBvcnQnLCAgIHZhbHVlOiBzLkFycml2YWxBaXJwb3J0TmFtZSA/IGAke3MuQXJyaXZhbEFpcnBvcnROYW1lfSAoJHtzLkFycml2YWxBaXJwb3J0Q29kZX0pYCA6IG5hKHMuQXJyaXZhbEFpcnBvcnRDb2RlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyLiB0ZXJtaW5hbCcsICAgICB2YWx1ZTogbmEocy5BcnJpdmFsQWlycG9ydFRlcm1pbmFsSUQpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGbGlnaHQnLCAgICAgICAgICAgIHZhbHVlOiBuYShmbGlnaHRObykgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZSB0aW1lJywgICAgdmFsdWU6IGZtdERhdGUoZGVwVGltZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0Fycml2YWwgdGltZScsICAgICAgdmFsdWU6IGZtdERhdGUoYXJyVGltZSkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRvdGFsU2VncyA9IHNlY3Rpb25zLmxlbmd0aDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnVGVybWluYWwgRGV0YWlscycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHt0b3RhbFNlZ3N9IHNlZ21lbnQke3RvdGFsU2VncyAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIHNlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGhcbiAgICAgICAgICA/IHNlY3Rpb25zXG4gICAgICAgICAgOiBbeyB0aXRsZTogJ0luZm8nLCByb3dzOiBbeyBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiAnTm8gdGVybWluYWwgZGF0YSBhdmFpbGFibGUnIH1dIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQYXltZW50IFN0YXR1cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3BheW1lbnRfc3RhdHVzJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXltZW50IFN0YXR1cycsXG4gICAgc3VidGl0bGU6ICdDaGFyZ2VzIMK3IFJlY2VpcHQnLFxuICAgIGljb246ICdwaSBwaS1jcmVkaXQtY2FyZCcsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IHBzID0gYmkoZGF0YSk/LnBheW1lbnRfc3RhdHVzO1xuICAgICAgY29uc3Qgc3RhdHVzTmFtZSA9IHBzPy5zdGF0dXM/Lm5hbWUgPz8gcHM/LnN0YXR1cz8ua2V5O1xuICAgICAgY29uc3QgcGFpZCA9IHBzPy5hbW91bnRJblBhaWRDdXJyZW5jeSAhPSBudWxsICYmIHBzPy5wYWlkQ3VycmVuY3lcbiAgICAgICAgPyBgJHtwcy5hbW91bnRJblBhaWRDdXJyZW5jeX0gJHtwcy5wYWlkQ3VycmVuY3l9YCA6IG51bGw7XG4gICAgICBjb25zdCBpc1N1Y2Nlc3MgPSBwcz8uc3RhdHVzPy5rZXkgPT09ICdTVUNDRVNTJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnUGF5bWVudCBEZXRhaWxzJyxcbiAgICAgICAgc3VidGl0bGU6IG5hKHN0YXR1c05hbWUpLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgcm93czogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU3RhdHVzJywgICAgICAgICAgdmFsdWU6IG5hKHN0YXR1c05hbWUpLCB2YWx1ZUNsYXNzOiBpc1N1Y2Nlc3MgPyAncG9zaXRpdmUnIDogJ25ldXRyYWwnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBbW91bnQnLCAgICAgICAgICB2YWx1ZTogcHM/LmFtb3VudCAhPSBudWxsID8gYCR7cHMuYW1vdW50fSAke25hKHBzLmN1cnJlbmN5KX1gIDogJ05vdCBhdmFpbGFibGUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQYWlkIGFtb3VudCcsICAgICB2YWx1ZTogbmEocGFpZCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1BheW1lbnQgbWV0aG9kJywgIHZhbHVlOiBuYShwcz8ubWV0aG9kKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnVHJhbnNhY3Rpb24gcmVmJywgdmFsdWU6IG5hKHBzPy50cmFuc2FjdGlvblJlZiA/PyBwcz8ucmVmZXJlbmNlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGF0ZScsICAgICAgICAgICAgdmFsdWU6IGZtdERhdGUocHM/LmRhdGUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdDdXJyZW5jeScsICAgICAgICB2YWx1ZTogbmEocHM/LmN1cnJlbmN5KSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQYXNzZW5nZXIgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Bhc3Nlbmdlcl9pbmZvJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXNzZW5nZXIgSW5mbycsXG4gICAgc3VidGl0bGU6ICdOYW1lcyDCtyBEb2NzJyxcbiAgICBpY29uOiAncGkgcGktdXNlcnMnLFxuICAgIGFwaUZpZWxkOiAnYm9va2luZ19pbmZvJyxcbiAgICBmb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgcGFzc2VuZ2VyczogYW55W10gPSBiaShkYXRhKT8ucGFzc2VuZ2VyX2luZm8/LnBhc3NlbmdlcnMgPz8gW107XG4gICAgICBjb25zdCB0eXBlTGFiZWw6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IEFEVDogJ0FkdWx0JywgQ05OOiAnQ2hpbGQnLCBJTkY6ICdJbmZhbnQnIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogJ1Bhc3NlbmdlciBEZXRhaWxzJyxcbiAgICAgICAgc3VidGl0bGU6IGAke3Bhc3NlbmdlcnMubGVuZ3RofSB0cmF2ZWxsZXIke3Bhc3NlbmdlcnMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9YCxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc2VjdGlvbnM6IHBhc3NlbmdlcnMubWFwKChwOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gW3A/Lm5hbWU/LnByZWZpeCwgcD8ubmFtZT8uZ2l2ZW5OYW1lLCBwPy5uYW1lPy5zdXJOYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICAgIGNvbnN0IHBob25lID0gcD8ucGhvbmUgPz8gKHA/LmNvbnRhY3ROdW1iZXI/LnBob25lTnVtYmVyXG4gICAgICAgICAgICA/IGAke3AuY29udGFjdE51bWJlci5jb3VudHJ5Q29kZSA/PyAnJ30ke3AuY29udGFjdE51bWJlci5waG9uZU51bWJlcn1gIDogbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpdGxlOiBgUGFzc2VuZ2VyICR7aSArIDF9IMK3ICR7ZnVsbE5hbWUgfHwgbmEobnVsbCl9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCAgICAgICAgICB2YWx1ZTogbmEodHlwZUxhYmVsW3A/LnR5cGVdID8/IHA/LnR5cGUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdHZW5kZXInLCAgICAgICAgdmFsdWU6IG5hKHA/LmdlbmRlcikgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RhdGUgb2YgYmlydGgnLCB2YWx1ZTogbmEocD8uZGF0ZU9mQmlydGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQYXNzcG9ydCcsICAgICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOYXRpb25hbGl0eScsICAgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5uYXRpb25hbGl0eSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0IGV4cC4nLCB2YWx1ZTogbmEocD8uaWRlbnRpdHk/LmV4cGlyYXRpb25EYXRlKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSXNzdWUgY291bnRyeScsIHZhbHVlOiBuYShwPy5pZGVudGl0eT8uaXNzdWVDb3VudHJ5KSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRG9jIHR5cGUnLCAgICAgIHZhbHVlOiBuYShwPy5pZGVudGl0eT8udHlwZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgICAgICAgICB2YWx1ZTogbmEocD8uZW1haWwpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdQaG9uZScsICAgICAgICAgdmFsdWU6IG5hKHBob25lKSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgUGFzc2VuZ2VyIENvdW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB7XG4gICAga2V5OiAncGFzc2VuZ2VyX2NvdW50JyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdQYXNzZW5nZXIgQ291bnQnLFxuICAgIHN1YnRpdGxlOiAnQWR1bHRzIMK3IENoaWxkcmVuIMK3IEluZmFudHMnLFxuICAgIGljb246ICdwaSBwaS11c2VycycsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBwYXNzZW5nZXJzOiBhbnlbXSA9IGJpKGRhdGEpPy5wYXNzZW5nZXJfaW5mbz8ucGFzc2VuZ2VycyA/PyBbXTtcbiAgICAgIGNvbnN0IGFkdWx0cyAgID0gcGFzc2VuZ2Vycy5maWx0ZXIocCA9PiBwPy50eXBlID09PSAnQURUJyk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHBhc3NlbmdlcnMuZmlsdGVyKHAgPT4gcD8udHlwZSA9PT0gJ0NOTicpO1xuICAgICAgY29uc3QgaW5mYW50cyAgPSBwYXNzZW5nZXJzLmZpbHRlcihwID0+IHA/LnR5cGUgPT09ICdJTkYnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnVHJhdmVsbGVyIEJyZWFrZG93bicsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtwYXNzZW5nZXJzLmxlbmd0aH0gdG90YWxgLFxuICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnU3VtbWFyeScsXG4gICAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdUb3RhbCcsICAgICAgICAgIHZhbHVlOiBTdHJpbmcocGFzc2VuZ2Vycy5sZW5ndGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBZHVsdHMgKEFEVCknLCAgIHZhbHVlOiBTdHJpbmcoYWR1bHRzLmxlbmd0aCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NoaWxkcmVuIChDTk4pJywgdmFsdWU6IFN0cmluZyhjaGlsZHJlbi5sZW5ndGgpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdJbmZhbnRzIChJTkYpJywgIHZhbHVlOiBTdHJpbmcoaW5mYW50cy5sZW5ndGgpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYWR1bHRzLm1hcCgocCwgaSkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQWR1bHQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgIHZhbHVlOiBuYShwPy5lbWFpbCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLmNoaWxkcmVuLm1hcCgocCwgaSkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQ2hpbGQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1Bhc3Nwb3J0JywgdmFsdWU6IG5hKHA/LmlkZW50aXR5Py5udW1iZXIpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdET0InLCAgICAgIHZhbHVlOiBuYShwPy5kYXRlT2ZCaXJ0aCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLmluZmFudHMubWFwKChwLCBpKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGBJbmZhbnQgJHtpICsgMX0gwrcgJHtbcD8ubmFtZT8ucHJlZml4LCBwPy5uYW1lPy5naXZlbk5hbWUsIHA/Lm5hbWU/LnN1ck5hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJ04vQSd9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RPQicsIHZhbHVlOiBuYShwPy5kYXRlT2ZCaXJ0aCkgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBBaXJsaW5lIEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdhaXJsaW5lX2luZm8nLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGhpZGRlbjogdHJ1ZSxcbiAgICBsYWJlbDogJ0FpcmxpbmUgSW5mbycsXG4gICAgc3VidGl0bGU6ICdDYXJyaWVyIMK3IEZsaWdodCBuby4nLFxuICAgIGljb246ICdwaSBwaS1zZW5kJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGJpKGRhdGEpPy5haXJsaW5lX2luZm8gPz8gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgbGVnSW5mb3M6IGFueVtdID0gYmkoZGF0YSk/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGR1ckxlZ3M6IGFueVtdICA9IGJpKGRhdGEpPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcblxuICAgICAgYWlybGluZXMuZm9yRWFjaCgoYSwgbGkpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgc2VnczogYW55W10gICAgPSBhLlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBjb25zdCBkdXJTZWdzOiBhbnlbXSA9IGR1ckxlZ3NbbGldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgY29uc3QgbGVnTWV0YSAgICAgICAgPSBsZWdJbmZvc1tsaV07XG4gICAgICAgIGNvbnN0IGxlZ0xhYmVsICAgICAgID0gbGVnTWV0YVxuICAgICAgICAgID8gYCR7ZGlySWNvbihsZWdNZXRhLkxlZ0RpcmVjdGlvbmFsaXR5KX0gJHtsZWdNZXRhLkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtsZWdNZXRhLkxlZ0Fycml2YWxBaXJwb3J0Q29kZX1gXG4gICAgICAgICAgOiBgTGVnICR7bGkgKyAxfWA7XG4gICAgICAgIC8vIExlZy1sZXZlbCB0aW1lcyBhcyBmYWxsYmFjayBmb3IgZmlyc3QvbGFzdCBzZWdtZW50XG4gICAgICAgIGNvbnN0IGxlZ0RlcFRpbWUgICAgID0gbGVnTWV0YT8uTGVnRGVwYXJ0dXJlRGF0ZVRpbWU7XG4gICAgICAgIGNvbnN0IGxlZ0FyclRpbWUgICAgID0gbGVnTWV0YT8uTGVnQXJyaXZhbERhdGVUaW1lO1xuXG4gICAgICAgIHNlZ3MuZm9yRWFjaCgocywgc2kpID0+IHtcbiAgICAgICAgICAvLyBVc2Ugc2VnbWVudC1sZXZlbCB0aW1lcyBpZiBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBsZWcgdGltZXNcbiAgICAgICAgICBjb25zdCBkZXBUaW1lID0gcy5EZXBhcnR1cmVEYXRlVGltZSA/PyAoc2kgPT09IDAgPyBsZWdEZXBUaW1lIDogbnVsbCk7XG4gICAgICAgICAgY29uc3QgYXJyVGltZSA9IHMuQXJyaXZhbERhdGVUaW1lICAgPz8gKHNpID09PSBzZWdzLmxlbmd0aCAtIDEgPyBsZWdBcnJUaW1lIDogbnVsbCk7XG5cbiAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtsZWdMYWJlbH0gwrcgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9IChTZWcgJHtzaSArIDF9KWAsXG4gICAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lJywgICAgICAgIHZhbHVlOiBuYShzLkFpcmxpbmVOYW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSUFUQSBjb2RlJywgICAgICB2YWx1ZTogbmEocy5BaXJsaW5lQ29kZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCAgICAgdmFsdWU6IHMuRmxpZ2h0TnVtYmVyID8gYCR7cy5BaXJsaW5lQ29kZX0ke3MuRmxpZ2h0TnVtYmVyfWAgOiAnTm90IGF2YWlsYWJsZScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1JvdXRlJywgICAgICAgICAgdmFsdWU6IGAke25hKHMuRGVwYXJ0dXJlQWlycG9ydENvZGUpfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9YCB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgICAgICB2YWx1ZTogZm10RGF0ZShkZXBUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyaXZhbCcsICAgICAgICB2YWx1ZTogZm10RGF0ZShhcnJUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRHVyYXRpb24nLCAgICAgICB2YWx1ZTogZHVyU2Vnc1tzaV0/LlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMgPyBmbXRNaW5zKGR1clNlZ3Nbc2ldLlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXMpIDogJ05vdCBhdmFpbGFibGUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJjcmFmdCcsICAgICAgIHZhbHVlOiBuYShzLkFpcmNyYWZ0VHlwZSA/PyBzLkVxdWlwbWVudCkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ09wZXJhdGluZyBjb2RlJywgdmFsdWU6IG5hKHMuT3BlcmF0aW5nQWlybGluZUNvZGUpIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0b3RhbFNlZ3MgPSBzZWN0aW9ucy5sZW5ndGg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYWlybGluZXNbMF0/LlNlZ21lbnRzPy5bMF0/LkFpcmxpbmVOYW1lID8/ICdBaXJsaW5lIEluZm8nLFxuICAgICAgICBzdWJ0aXRsZTogYCR7dG90YWxTZWdzfSBzZWdtZW50JHt0b3RhbFNlZ3MgIT09IDEgPyAncycgOiAnJ31gLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgTGVnIEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdsZWdfaW5mbycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnTGVnIEluZm8nLFxuICAgIHN1YnRpdGxlOiAnUm91dGUgwrcgU3RvcHMgwrcgQ2FiaW4nLFxuICAgIGljb246ICdwaSBwaS1tYXAtbWFya2VyJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBkdXJMZWdzOiBhbnlbXSAgPSBkPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdGbGlnaHQgTGVncycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHNlY3Rpb25zOiBsZWdzLm1hcCgobDogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXIgICAgICA9IGwuTGVnRGlyZWN0aW9uYWxpdHkgPz8gJyc7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzdG9wczogYW55W10gICA9IGwuU3RvcHMgPz8gW107XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgICA9IGFpcmxpbmVzW2ldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIGNvbnN0IGR1clNlZ3M6IGFueVtdID0gZHVyTGVnc1tpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgICAgY29uc3QgbGVnRHVyTWlucyAgICAgPSBkdXJTZWdzLnJlZHVjZSgoc3VtOiBudW1iZXIsIHM6IGFueSkgPT4gc3VtICsgKHMuU2VnbWVudEVsYXBzZWRUaW1lTWludXRlcyA/PyAwKSwgMCk7XG4gICAgICAgICAgY29uc3QgZmxpZ2h0Tm9zICAgICAgPSBzZWdzLm1hcCgoczogYW55KSA9PiBgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9YCkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2kgKyAxfWB9IMK3ICR7bC5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7bC5MZWdBcnJpdmFsQWlycG9ydENvZGV9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RpcmVjdGlvbicsICB2YWx1ZTogbmEoZGlyKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgIHZhbHVlOiBmbXREYXRlKGwuTGVnRGVwYXJ0dXJlRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICAgdmFsdWU6IGZtdERhdGUobC5MZWdBcnJpdmFsRGF0ZVRpbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEdXJhdGlvbicsICAgdmFsdWU6IGxlZ0R1ck1pbnMgPiAwID8gZm10TWlucyhsZWdEdXJNaW5zKSA6IG5hKG51bGwpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lKHMpJywgdmFsdWU6IG5hKGwuTGVnQWlybGluZXNOYW1lcz8uam9pbignLCAnKSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0ZsaWdodCBuby4nLCB2YWx1ZTogbmEoZmxpZ2h0Tm9zKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FiaW4nLCAgICAgIHZhbHVlOiBuYShsLkxlZ0NhYmlucz8uWzBdPy5OYW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRmFyZSBicmFuZCcsIHZhbHVlOiBuYShsLmZhcmVCcmFuZD8ubmFtZSkgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyJywgICB2YWx1ZTogbmEobC5zdXBwbGllck5hbWUpIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1N0b3BzJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RvcHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICA/ICdOb24tc3RvcCdcbiAgICAgICAgICAgICAgICAgIDogc3RvcHMubWFwKChzOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgYCR7cy5TdG9wQWlycG9ydENpdHkgPz8gcy5TdG9wQWlycG9ydH0gKCR7bmEocy5TdG9wQWlycG9ydCl9KSDigJMgJHtmbXRNaW5zKHMuTGF5b3ZlckR1cmF0aW9uKX0gbGF5b3ZlcmBcbiAgICAgICAgICAgICAgICAgICAgKS5qb2luKCcgwrcgJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBQTlIgSW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3Bucl9pbmZvJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ1BOUiBJbmZvJyxcbiAgICBzdWJ0aXRsZTogJ1BOUiDCtyBCb29raW5nIHJlZicsXG4gICAgaWNvbjogJ3BpIHBpLXRhZycsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgICAgICAgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBwbnJMaXN0ICA9IHJlc29sdmVQbnJMaXN0KGQ/LnBucl9pbmZvKTtcbiAgICAgIGNvbnN0IHBuckRlcCAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdEZXBhcnR1cmUnKT8ucG5yID8/IHBuckxpc3RbMF0/LnBucjtcbiAgICAgIGNvbnN0IHBuclJldCAgID0gcG5yTGlzdC5maW5kKChwOiBhbnkpID0+IHAuTGVnRGlyZWN0aW9uYWxpdHkgPT09ICdSZXR1cm4nKT8ucG5yO1xuICAgICAgY29uc3QgY3AgICAgICAgPSBkPy5jYW5jZWxsYXRpb25fcG9saWN5O1xuICAgICAgY29uc3QgaXNDcm9zc1NlbGxlciA9IHBuckxpc3QubGVuZ3RoID4gMVxuICAgICAgICB8fCBjcD8uc3VwcGxpZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjcm9zcycpXG4gICAgICAgIHx8IGZhbHNlO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgcG5yUm93czogYW55W10gPSBbXTtcbiAgICAgIGlmIChwbnJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG5yTGlzdC5mb3JFYWNoKChwOiBhbnkpID0+IHtcbiAgICAgICAgICBwbnJSb3dzLnB1c2goeyBsYWJlbDogYFBOUiAoJHtwLkxlZ0RpcmVjdGlvbmFsaXR5fSlgLCB2YWx1ZTogbmEocC5wbnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBuclJvd3MucHVzaCh7IGxhYmVsOiAnUE5SJywgdmFsdWU6IG5hKHBuckRlcCkgfSk7XG4gICAgICB9XG4gICAgICBwbnJSb3dzLnB1c2goXG4gICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3A/LmJvb2tpbmdJZCkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyIHJlZicsIHZhbHVlOiBuYShjcD8uc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdXBwbGllcicsICAgICB2YWx1ZTogbmEoY3A/LnN1cHBsaWVyTmFtZSkgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLXNlbGxlcicsIHZhbHVlOiBpc0Nyb3NzU2VsbGVyID8gJ1llcycgOiAnTm8nIH0sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogcG5yRGVwID8gYFBOUjogJHtwbnJEZXB9JHtwbnJSZXQgPyAnIC8gJyArIHBuclJldCA6ICcnfWAgOiAnUE5SIEluZm8nLFxuICAgICAgICBzdWJ0aXRsZTogaXNDcm9zc1NlbGxlciA/ICdDcm9zcy1zZWxsZXIgYm9va2luZyDigJQgdHdvIFBOUnMnIDogJ0dsb2JhbCBEaXN0cmlidXRpb24gU3lzdGVtIHJlZmVyZW5jZScsXG4gICAgICAgIHNlY3Rpb25zOiBbeyB0aXRsZTogJ1JlZmVyZW5jZXMnLCByb3dzOiBwbnJSb3dzIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBCYWdnYWdlIFBvbGljeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2JhZ2dhZ2UnLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGxhYmVsOiAnQmFnZ2FnZSBQb2xpY3knLFxuICAgIHN1YnRpdGxlOiAnQ2FiaW4gwrcgQ2hlY2tlZCDCtyBBZGQtb25zJyxcbiAgICBpY29uOiAncGkgcGktYnJpZWZjYXNlJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgYmFnZ2FnZSA9IGJpKGRhdGEpPy5iYWdnYWdlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGluZm9BcnJheTogYW55W10gPSBiYWdnYWdlPy5iYWdnYWdlX2luZm8gPz8gW107XG4gICAgICBjb25zdCBhZGRPbnMgICAgICAgICAgID0gYmFnZ2FnZT8uYWRkX29uX2JhZ2dhZ2UgPz8gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3Qgc2VjdGlvbnM6IGFueVtdICA9IFtdO1xuICAgICAgY29uc3Qgcm91dGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaW5mb0FycmF5LmZvckVhY2goKGVudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBPYmplY3Qua2V5cyhlbnRyeSlbMF07XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgcm91dGVOYW1lcy5wdXNoKHJvdXRlKTtcbiAgICAgICAgY29uc3QgcGF4VHlwZXMgPSBlbnRyeVtyb3V0ZV0gPz8ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGF4VHlwZXMpLmZvckVhY2goKFtwYXhUeXBlLCBwZF06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsYWJlbCAgICAgPSBwYXhUeXBlID09PSAnQURUJyA/ICdBZHVsdCcgOiBwYXhUeXBlID09PSAnQ05OJyA/ICdDaGlsZCcgOiBwYXhUeXBlID09PSAnSU5GJyA/ICdJbmZhbnQnIDogcGF4VHlwZTtcbiAgICAgICAgICBjb25zdCBjYWJpbiAgICAgPSBwZC5DYWJpbkJhZ2dhZ2U7XG4gICAgICAgICAgY29uc3QgY2hlY2tlZCAgID0gcGQuQ2hlY2tlZEJhZ2dhZ2U7XG4gICAgICAgICAgY29uc3QgdW5kZXJTZWF0ID0gcGQuVW5kZXJTZWF0QmFnZ2FnZTtcblxuICAgICAgICAgIHJvd3MucHVzaChcbiAgICAgICAgICAgIHsgbGFiZWw6IGAke2xhYmVsfSDCtyBDYWJpbmAsICAgdmFsdWU6IGZtdEJhZyhjYWJpbikgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6IGAke2xhYmVsfSDCtyBDaGVja2VkYCwgdmFsdWU6IGZtdEJhZyhjaGVja2VkKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHVuZGVyU2VhdCkge1xuICAgICAgICAgICAgcm93cy5wdXNoKHsgbGFiZWw6IGAke2xhYmVsfSDCtyBVbmRlciBTZWF0YCwgdmFsdWU6IGZtdEJhZyh1bmRlclNlYXQpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiBgQmFnZ2FnZSDCtyAke3JvdXRlfWAsIHJvd3MgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGFkZE9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiAnQWRkLW9uIEJhZ2dhZ2UnLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgcm93czogYWRkT25zLm1hcCgoYTogYW55LCBpOiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYEFkZC1vbiAke2kgKyAxfWAsXG4gICAgICAgICAgICB2YWx1ZTogW2Eud2VpZ2h0LCBhLnVuaXQsIGEucm91dGVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJykgfHwgJ1NlZSBib29raW5nIGRldGFpbHMnLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAnQmFnZ2FnZSBBbGxvd2FuY2UnLFxuICAgICAgICBzdWJ0aXRsZTogcm91dGVOYW1lcy5sZW5ndGggPiAwID8gcm91dGVOYW1lcy5qb2luKCcgIMK3ICAnKSA6ICdBbGwgYmFnZ2FnZSB0eXBlcycsXG4gICAgICAgIHNlY3Rpb25zOiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBzZWN0aW9uc1xuICAgICAgICAgIDogW3sgdGl0bGU6ICdJbmZvJywgcm93czogW3sgbGFiZWw6ICdTdGF0dXMnLCB2YWx1ZTogJ05vIGJhZ2dhZ2UgZGF0YSBhdmFpbGFibGUnIH1dIH1dLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBGbGlnaHQgVGltaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ2ZsaWdodF90aW1pbmdzJyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgbGFiZWw6ICdGbGlnaHQgVGltaW5ncycsXG4gICAgc3VidGl0bGU6ICdEZXBhcnR1cmUgwrcgQXJyaXZhbCcsXG4gICAgaWNvbjogJ3BpIHBpLWNsb2NrJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGJpKGRhdGEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGxlZ3M6IGFueVtdICAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGFpcmxpbmVzOiBhbnlbXSA9IGQ/LmFpcmxpbmVfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBkdXJMZWdzOiBhbnlbXSAgPSBkPy5kdXJhdGlvbj8ubGVncyA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdGbGlnaHQgVGltaW5ncycsXG4gICAgICAgIHN1YnRpdGxlOiBsZWdzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAke2xlZ3NbMF0uTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2xlZ3NbbGVncy5sZW5ndGggLSAxXS5MZWdBcnJpdmFsQWlycG9ydENvZGV9YFxuICAgICAgICAgIDogJ0FsbCBsZWdzJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc2VjdGlvbnM6IGxlZ3MubWFwKChsOiBhbnksIGxpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXIgICAgICA9IGwuTGVnRGlyZWN0aW9uYWxpdHkgPz8gJyc7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBzZWdzOiBhbnlbXSAgICA9IGFpcmxpbmVzW2xpXT8uU2VnbWVudHMgPz8gW107XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICBjb25zdCBkdXJTZWdzOiBhbnlbXSA9IGR1ckxlZ3NbbGldPy5TZWdtZW50cyA/PyBbXTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIGNvbnN0IHN0b3BzOiBhbnlbXSAgID0gbC5TdG9wcyA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZWdEdXJNaW5zICAgICA9IGR1clNlZ3MucmVkdWNlKChzdW06IG51bWJlciwgczogYW55KSA9PiBzdW0gKyAocy5TZWdtZW50RWxhcHNlZFRpbWVNaW51dGVzID8/IDApLCAwKTtcblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3Qgcm93czogYW55W10gPSBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnRGVwYXJ0dXJlJywgdmFsdWU6IGZtdERhdGUobC5MZWdEZXBhcnR1cmVEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdBcnJpdmFsJywgICB2YWx1ZTogZm10RGF0ZShsLkxlZ0Fycml2YWxEYXRlVGltZSkgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEdXJhdGlvbicsICB2YWx1ZTogbGVnRHVyTWlucyA+IDAgPyBmbXRNaW5zKGxlZ0R1ck1pbnMpIDogbmEobnVsbCkgfSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gSW50ZXJsZWF2ZSBzZWdtZW50IHJvd3Mgd2l0aCBsYXlvdmVyIHJvd3NcbiAgICAgICAgICBzZWdzLmZvckVhY2goKHM6IGFueSwgc2k6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VnRHVyID0gZHVyU2Vnc1tzaV0/LlNlZ21lbnRFbGFwc2VkVGltZU1pbnV0ZXM7XG4gICAgICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogYFNlZyAke3NpICsgMX0gwrcgJHtzLkFpcmxpbmVDb2RlfSR7cy5GbGlnaHROdW1iZXJ9YCxcbiAgICAgICAgICAgICAgdmFsdWU6IGAke25hKHMuRGVwYXJ0dXJlQWlycG9ydENvZGUpfSDihpIgJHtuYShzLkFycml2YWxBaXJwb3J0Q29kZSl9JHtzZWdEdXIgPyAnIMK3ICcgKyBmbXRNaW5zKHNlZ0R1cikgOiAnJ31gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBMYXlvdmVyIGFmdGVyIHRoaXMgc2VnbWVudCAoaWYgdGhlcmUgaXMgYSBzdG9wIGF0IGFycml2YWwgYWlycG9ydClcbiAgICAgICAgICAgIGlmIChzaSA8IHNlZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBjb25zdCBzdG9wID0gc3RvcHMuZmluZCgoc3Q6IGFueSkgPT4gc3QuU3RvcEFpcnBvcnQgPT09IHMuQXJyaXZhbEFpcnBvcnRDb2RlKTtcbiAgICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYExheW92ZXIgwrcgJHtzdG9wLlN0b3BBaXJwb3J0fWAsIHZhbHVlOiBmbXRNaW5zKHN0b3AuTGF5b3ZlckR1cmF0aW9uKSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpdGxlOiBgJHtkaXJJY29uKGRpcil9ICR7ZGlyIHx8IGBMZWcgJHtsaSArIDF9YH0gwrcgJHtsLkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtsLkxlZ0Fycml2YWxBaXJwb3J0Q29kZX1gLFxuICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcblxuICAvLyDilIDilIAgRHVyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdkdXJhdGlvbicsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnRHVyYXRpb24nLFxuICAgIHN1YnRpdGxlOiAnVG90YWwgZmxpZ2h0IHRpbWUnLFxuICAgIGljb246ICdwaSBwaS1yZWZyZXNoJyxcbiAgICBhcGlGaWVsZDogJ2Jvb2tpbmdfaW5mbycsXG4gICAgZm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZCAgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBkdXIgPSBkPy5kdXJhdGlvbjtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgY29uc3QgdG90YWwgPSBmbXRNaW5zKGR1cj8udG90YWxNaW51dGVzKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IHRvdGFsLFxuICAgICAgICBzdWJ0aXRsZTogJ1RvdGFsIGpvdXJuZXkgZHVyYXRpb24gaW5jbHVkaW5nIGxheW92ZXJzJyxcbiAgICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogJ1RvdGFsJyxcbiAgICAgICAgICAgIHJvd3M6IFt7IGxhYmVsOiAnSm91cm5leSBkdXJhdGlvbicsIHZhbHVlOiB0b3RhbCB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgLi4uKGR1cj8ubGVncyA/PyBbXSkubWFwKChsZWc6IGFueSwgbGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGVnTWV0YSA9IGxlZ3NbbGldO1xuICAgICAgICAgICAgY29uc3QgZGlyICAgICA9IGxlZ01ldGE/LkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgZnJvbSAgICA9IGxlZ01ldGE/LkxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlO1xuICAgICAgICAgICAgY29uc3QgdG8gICAgICA9IGxlZ01ldGE/LkxlZ0Fycml2YWxBaXJwb3J0Q29kZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCByb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIChsZWcuU2VnbWVudHMgPz8gW10pLmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYCR7cy5EZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7cy5BcnJpdmFsQWlycG9ydENvZGV9YCwgdmFsdWU6IGZtdE1pbnMocy5TZWdtZW50RWxhcHNlZFRpbWVNaW51dGVzKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIChsZWcuU3RvcHMgPz8gW10pLmZvckVhY2goKHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByb3dzLnB1c2goeyBsYWJlbDogYExheW92ZXIgwrcgJHtzLlN0b3BBaXJwb3J0fWAsIHZhbHVlOiBmbXRNaW5zKHMuTGF5b3ZlckR1cmF0aW9uKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2xpICsgMX1gfSR7ZnJvbSAmJiB0byA/IGAgwrcgJHtmcm9tfSDihpIgJHt0b31gIDogJyd9YCxcbiAgICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG5cbiAgLy8g4pSA4pSAIENhbmNlbGxhdGlvbiBQb2xpY3kg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHtcbiAgICBrZXk6ICdjYW5jZWxsYXRpb25fcG9saWN5JyxcbiAgICB0eXBlOiAnZmxpZ2h0JyxcbiAgICBsYWJlbDogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxuICAgIHN1YnRpdGxlOiAnUmVmdW5kIMK3IEZlZXMgwrcgTGVncycsXG4gICAgaWNvbjogJ3BpIHBpLWJhbicsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgID0gYmkoZGF0YSk7XG4gICAgICBjb25zdCBjcCA9IGQ/LmNhbmNlbGxhdGlvbl9wb2xpY3k7XG5cbiAgICAgIGlmICghY3ApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogJ0NhbmNlbGxhdGlvbiBQb2xpY3knLFxuICAgICAgICAgIHN1YnRpdGxlOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgICAgICAgIHNlY3Rpb25zOiBbeyB0aXRsZTogJ0luZm8nLCByb3dzOiBbeyBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiAnTm8gY2FuY2VsbGF0aW9uIHBvbGljeSBkYXRhIGF2YWlsYWJsZScgfV0gfV0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBzZWN0aW9uczogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IHBuckxpc3QgICAgICAgICA9IHJlc29sdmVQbnJMaXN0KGQ/LnBucl9pbmZvKTtcbiAgICAgIGNvbnN0IGlzQ3Jvc3NTZWxsZXIgICA9IHBuckxpc3QubGVuZ3RoID4gMSB8fCBjcD8uc3VwcGxpZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjcm9zcycpO1xuICAgICAgY29uc3QgbGVnczogYW55W10gICAgID0gY3A/LmxlZ3MgPz8gW107XG5cbiAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICB0aXRsZTogJ0Jvb2tpbmcgUmVmZXJlbmNlJyxcbiAgICAgICAgcm93czogW1xuICAgICAgICAgIHsgbGFiZWw6ICdCb29raW5nIElEJywgICB2YWx1ZTogbmEoY3AuYm9va2luZ0lkKSB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdTdXBwbGllciByZWYnLCB2YWx1ZTogbmEoY3Auc3VwcGxpZXJCb29raW5nSWQpIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1N1cHBsaWVyJywgICAgIHZhbHVlOiBuYShjcC5zdXBwbGllck5hbWUpIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ0Nyb3NzLXNlbGxlcicsIHZhbHVlOiBpc0Nyb3NzU2VsbGVyID8gJ1llcycgOiAnTm8nIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm10RmVlID0gKGZlZTogbnVtYmVyLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgICAgIGZlZSAhPSBudWxsID8gYCR7ZmVlfSAke2N1cnJlbmN5ID8/ICdTQVInfWAgOiAnMCc7XG5cbiAgICAgIGxlZ3MuZm9yRWFjaCgobGVnOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBgQ2FuY2VsbGF0aW9uIGFuZCBDaGFuZ2UgUG9saWN5IMK3ICR7bGVnLmRpcmVjdGlvbn0gKCR7bGVnLmZyb219IOKGkiAke2xlZy50b30pYDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcblxuICAgICAgICAobGVnLnBhc3NlbmdlclBlbmFsdGllcyA/PyBbXSkuZm9yRWFjaCgocHA6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHR5cGVMYWJlbCAgPSBwcC50eXBlID09PSAnQURUJyA/ICdBZHVsdCcgOiBwcC50eXBlID09PSAnQ05OJyA/ICdDaGlsZCcgOiAnSW5mYW50JztcbiAgICAgICAgICBjb25zdCBiRGVwICAgICAgID0gcHAucGVuYWx0aWVzPy5iZWZvcmVEZXBhcnR1cmU7XG4gICAgICAgICAgY29uc3QgYURlcCAgICAgICA9IHBwLnBlbmFsdGllcz8uYWZ0ZXJEZXBhcnR1cmU7XG4gICAgICAgICAgY29uc3QgYlJlZnVuZCAgICA9IGJEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBiRXhjaGFuZ2UgID0gYkRlcD8uZXhjaGFuZ2U7XG4gICAgICAgICAgY29uc3QgYVJlZnVuZCAgICA9IGFEZXA/LnJlZnVuZDtcbiAgICAgICAgICBjb25zdCBhRXhjaGFuZ2UgID0gYURlcD8uZXhjaGFuZ2U7XG5cbiAgICAgICAgICByb3dzLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiBgJHt0eXBlTGFiZWx9IMK3IEJlZm9yZSBkZXAuYCxcbiAgICAgICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgICAgICBiUmVmdW5kPy5pc0FjdGlvbmFibGUgICA/IGBSZWZ1bmQ6ICR7Zm10RmVlKGJSZWZ1bmQuZmVlLCBiUmVmdW5kLmN1cnJlbmN5KX1gICAgICA6ICdObyByZWZ1bmQnLFxuICAgICAgICAgICAgICAgIGJFeGNoYW5nZT8uaXNBY3Rpb25hYmxlID8gYEV4Y2hhbmdlOiAke2ZtdEZlZShiRXhjaGFuZ2UuZmVlLCBiRXhjaGFuZ2UuY3VycmVuY3kpfWAgOiAnTm8gZXhjaGFuZ2UnLFxuICAgICAgICAgICAgICBdLmpvaW4oJyAgwrcgICcpLFxuICAgICAgICAgICAgICB2YWx1ZUNsYXNzOiBiUmVmdW5kPy5pc0FjdGlvbmFibGUgfHwgYkV4Y2hhbmdlPy5pc0FjdGlvbmFibGUgPyAnbmV1dHJhbCcgOiAnbmVnYXRpdmUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6IGAke3R5cGVMYWJlbH0gwrcgQWZ0ZXIgZGVwLmAsXG4gICAgICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICAgICAgYVJlZnVuZD8uaXNBY3Rpb25hYmxlICAgPyBgUmVmdW5kOiAke2ZtdEZlZShhUmVmdW5kLmZlZSwgYVJlZnVuZC5jdXJyZW5jeSl9YCAgICAgOiAnTm8gcmVmdW5kJyxcbiAgICAgICAgICAgICAgICBhRXhjaGFuZ2U/LmlzQWN0aW9uYWJsZSA/IGBFeGNoYW5nZTogJHtmbXRGZWUoYUV4Y2hhbmdlLmZlZSwgYUV4Y2hhbmdlLmN1cnJlbmN5KX1gIDogJ05vIGV4Y2hhbmdlJyxcbiAgICAgICAgICAgICAgXS5qb2luKCcgIMK3ICAnKSxcbiAgICAgICAgICAgICAgdmFsdWVDbGFzczogYVJlZnVuZD8uaXNBY3Rpb25hYmxlIHx8IGFFeGNoYW5nZT8uaXNBY3Rpb25hYmxlID8gJ25ldXRyYWwnIDogJ25lZ2F0aXZlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlLCByb3dzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBgJHtjcC5zdXBwbGllck5hbWUgPz8gJ0NhbmNlbGxhdGlvbid9IFBvbGljeWAsXG4gICAgICAgIHN1YnRpdGxlOiBpc0Nyb3NzU2VsbGVyID8gJ0Nyb3NzLXNlbGxlciBib29raW5nIMK3IGNvbnRhY3Qgc3VwcGxpZXIgZm9yIHJlZnVuZCcgOiBgQm9va2luZyAke2NwLmJvb2tpbmdJZCA/PyAnJ31gLFxuICAgICAgICBzZWN0aW9ucyxcbiAgICAgICAgY2FsbG91dDogaXNDcm9zc1NlbGxlclxuICAgICAgICAgID8geyB0eXBlOiAnaW5mbycsIG1lc3NhZ2U6ICdDcm9zcy1zZWxsZXIgYm9va2luZyDigJQgcmVmdW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgcGFydG5lciBhbmQgbWF5IHRha2UgYWRkaXRpb25hbCB0aW1lLicgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBGbGlnaHQgU3RhdHVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB7XG4gICAga2V5OiAnZmxpZ2h0X3N0YXR1cycsXG4gICAgdHlwZTogJ2ZsaWdodCcsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIGxhYmVsOiAnRmxpZ2h0IFN0YXR1cycsXG4gICAgc3VidGl0bGU6ICdMaXZlIMK3IERlbGF5cycsXG4gICAgaWNvbjogJ3BpIHBpLWNoYXJ0LWJhcicsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBiaShkYXRhKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSAgICAgPSBkPy5sZWdfaW5mbyA/PyBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBhaXJsaW5lczogYW55W10gPSBkPy5haXJsaW5lX2luZm8gPz8gW107XG4gICAgICBjb25zdCBvcmlnaW4gPSBsZWdzWzBdPy5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZTtcbiAgICAgIGNvbnN0IGRlc3QgICA9IGxlZ3NbbGVncy5sZW5ndGggLSAxXT8uTGVnQXJyaXZhbEFpcnBvcnRDb2RlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogb3JpZ2luID8gYCR7b3JpZ2lufSDihpIgJHtkZXN0fWAgOiAnRmxpZ2h0IFN0YXR1cycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSDCtyBTY2hlZHVsZWQgdGltZXMgZnJvbSBib29raW5nYCxcbiAgICAgICAgc2VjdGlvbnM6IGxlZ3MubWFwKChsLCBsaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpciAgPSBsLkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgY29uc3Qgc2VnczogYW55W10gPSBhaXJsaW5lc1tsaV0/LlNlZ21lbnRzID8/IFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogYCR7ZGlySWNvbihkaXIpfSAke2RpciB8fCBgTGVnICR7bGkgKyAxfWB9IMK3ICR7bC5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZX0g4oaSICR7bC5MZWdBcnJpdmFsQWlycG9ydENvZGV9YCxcbiAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGFydHVyZScsICB2YWx1ZTogZm10RGF0ZShsLkxlZ0RlcGFydHVyZURhdGVUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQXJyaXZhbCcsICAgIHZhbHVlOiBmbXREYXRlKGwuTGVnQXJyaXZhbERhdGVUaW1lKSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnQWlybGluZShzKScsIHZhbHVlOiBuYShsLkxlZ0FpcmxpbmVzTmFtZXM/LmpvaW4oJywgJykpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdDYWJpbicsICAgICAgdmFsdWU6IG5hKGwuTGVnQ2FiaW5zPy5bMF0/Lk5hbWUpIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAgICAuLi5zZWdzLm1hcCgoczogYW55LCBzaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiBgRmxpZ2h0ICR7c2kgKyAxfWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGAke3MuQWlybGluZUNvZGV9JHtzLkZsaWdodE51bWJlcn0gwrcgJHtzLkRlcGFydHVyZUFpcnBvcnRDb2RlfSDihpIgJHtzLkFycml2YWxBaXJwb3J0Q29kZX1gLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsb3V0OiB7IHR5cGU6ICdpbmZvJywgbWVzc2FnZTogJ0xpdmUgc3RhdHVzIG5vdCBhdmFpbGFibGUg4oCUIGNoZWNrIHRoZSBhaXJsaW5lIGFwcCBvciBhaXJwb3J0IGJvYXJkcyBmb3IgcmVhbC10aW1lIHVwZGF0ZXMuJyB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIOKUgOKUgCBXaS1GaSAmIEV4dHJhcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAge1xuICAgIGtleTogJ3dpZmknLFxuICAgIHR5cGU6ICdmbGlnaHQnLFxuICAgIGhpZGRlbjogdHJ1ZSxcbiAgICBsYWJlbDogJ1dpLUZpICYgRXh0cmFzJyxcbiAgICBzdWJ0aXRsZTogJ09uYm9hcmQgc2VydmljZXMnLFxuICAgIGljb246ICdwaSBwaS1pbmZvLWNpcmNsZScsXG4gICAgYXBpRmllbGQ6ICdib29raW5nX2luZm8nLFxuICAgIGZvcm1hdHRlcjogKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBiaShkYXRhKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBsZWdzOiBhbnlbXSAgICA9IGQ/LmxlZ19pbmZvID8/IFtdO1xuICAgICAgY29uc3QgYWRkT25zICAgICAgICAgPSBkPy5iYWdnYWdlPy5hZGRfb25fYmFnZ2FnZSA/PyBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICdPbmJvYXJkIEV4dHJhcycsXG4gICAgICAgIHN1YnRpdGxlOiBgJHtsZWdzLmxlbmd0aH0gbGVnJHtsZWdzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWAsXG4gICAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAuLi5sZWdzLm1hcCgobDogYW55LCBsaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBsLkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGl0bGU6IGAke2Rpckljb24oZGlyKX0gJHtkaXIgfHwgYExlZyAke2xpICsgMX1gfSDCtyAke2wuTGVnRGVwYXJ0dXJlQWlycG9ydENvZGV9IOKGkiAke2wuTGVnQXJyaXZhbEFpcnBvcnRDb2RlfWAsXG4gICAgICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FiaW4nLCAgICAgIHZhbHVlOiBuYShsLkxlZ0NhYmlucz8uWzBdPy5OYW1lKSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdGYXJlIGJyYW5kJywgdmFsdWU6IG5hKGwuZmFyZUJyYW5kPy5uYW1lKSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdBaXJsaW5lKHMpJywgdmFsdWU6IG5hKGwuTGVnQWlybGluZXNOYW1lcz8uam9pbignLCAnKSkgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uKGFkZE9ucy5sZW5ndGggPiAwID8gW3tcbiAgICAgICAgICAgIHRpdGxlOiAnQWRkLW9uIEJhZ2dhZ2UnLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHJvd3M6IGFkZE9ucy5tYXAoKGE6IGFueSwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogYEFkZC1vbiAke2kgKyAxfWAsXG4gICAgICAgICAgICAgIHZhbHVlOiBbYS53ZWlnaHQsIGEudW5pdCwgYS5yb3V0ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKSB8fCAnU2VlIGJvb2tpbmcgZGV0YWlscycsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfV0gOiBbXSksXG4gICAgICAgIF0sXG4gICAgICAgIGNhbGxvdXQ6IHsgdHlwZTogJ2luZm8nLCBtZXNzYWdlOiAnRGV0YWlsZWQgb25ib2FyZCBhbWVuaXRpZXMgZGVwZW5kIG9uIHRoZSBvcGVyYXRpbmcgYWlybGluZSBhbmQgZmFyZSBjbGFzcy4nIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG5dO1xuIl19