@ieeesa-npm/dashboard 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/esm2022/lib/assets/constants.json +7 -3
  2. package/esm2022/lib/components/event-group-card/event-group-card.component.mjs +103 -13
  3. package/esm2022/lib/components/meeting-attendance-row/meeting-attendance-row.component.mjs +101 -23
  4. package/esm2022/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.mjs +70 -6
  5. package/esm2022/lib/components/your-groups/your-groups.component.mjs +132 -23
  6. package/esm2022/lib/dashboard.component.mjs +93 -9
  7. package/esm2022/lib/models/attendance-state.model.mjs +8 -1
  8. package/esm2022/lib/models/dashboard-route-config.model.mjs +1 -1
  9. package/esm2022/lib/models/event-meeting-list-item.model.mjs +1 -1
  10. package/esm2022/lib/models/event-meeting-list-payload.model.mjs +7 -5
  11. package/esm2022/lib/models/meeting-row.model.mjs +1 -1
  12. package/esm2022/lib/models/upcoming-event.model.mjs +1 -1
  13. package/esm2022/lib/services/dashboard.service.mjs +71 -126
  14. package/esm2022/lib/services/user-permissions.service.mjs +23 -9
  15. package/esm2022/lib/utils/event-meeting-mapper.util.mjs +47 -41
  16. package/fesm2022/ieeesa-npm-dashboard.mjs +657 -306
  17. package/fesm2022/ieeesa-npm-dashboard.mjs.map +1 -1
  18. package/lib/components/event-group-card/event-group-card.component.d.ts +75 -6
  19. package/lib/components/meeting-attendance-row/meeting-attendance-row.component.d.ts +61 -7
  20. package/lib/components/member-level-badge/member-level-badge.component.d.ts +12 -1
  21. package/lib/components/upcoming-meetings-events/upcoming-meetings-events.component.d.ts +51 -3
  22. package/lib/components/your-groups/your-groups.component.d.ts +72 -14
  23. package/lib/dashboard.component.d.ts +53 -3
  24. package/lib/models/attendance-state.model.d.ts +8 -1
  25. package/lib/models/dashboard-route-config.model.d.ts +14 -0
  26. package/lib/models/event-meeting-list-item.model.d.ts +68 -68
  27. package/lib/models/event-meeting-list-payload.model.d.ts +14 -25
  28. package/lib/models/meeting-row.model.d.ts +2 -0
  29. package/lib/models/upcoming-event.model.d.ts +9 -0
  30. package/lib/services/dashboard.service.d.ts +25 -53
  31. package/lib/services/user-permissions.service.d.ts +8 -4
  32. package/lib/utils/event-meeting-mapper.util.d.ts +15 -21
  33. package/package.json +1 -1
@@ -1,9 +1,18 @@
1
+ /**
2
+ * Pure mappers converting the raw "home" events-&-meetings backend list/detail
3
+ * items into the dashboard view models. No Angular / service dependencies so
4
+ * they are trivially unit-testable and shared by {@link DashboardService}.
5
+ *
6
+ * Backend dates are ISO-8601 strings; callers format them with luxon at render
7
+ * time. The list mapper enforces the dashboard rule that STANDALONE_MEETING rows
8
+ * always sort LAST within the section.
9
+ */
10
+ import { AttendanceState } from '../models/attendance-state.model';
1
11
  import { UpcomingItemKind, } from '../models/upcoming-event.model';
2
- import { computeDayIndicator } from './date-format.util';
3
12
  /**
4
13
  * Determines whether a raw list item is an EVENT (owns child meetings) or a
5
- * STANDALONE_MEETING. An item is an EVENT when the backend flags it with
6
- * `isMeetingEvent === true` or `hasChildren === true`.
14
+ * STANDALONE_MEETING, using the backend `isMeetingEvent` discriminator (falling
15
+ * back to `hasChildren`).
7
16
  * @param {EventMeetingListItem} item - The raw list item.
8
17
  * @return {UpcomingItemKind} The resolved render kind.
9
18
  */
@@ -13,43 +22,40 @@ export function resolveItemKind(item) {
13
22
  }
14
23
  /**
15
24
  * Maps a raw backend list item to the {@link UpcomingEvent} view model. EVENT
16
- * rows start with an empty `meetings` array (child meetings are lazily loaded on
17
- * expand); STANDALONE_MEETING rows carry their own group/location fields.
25
+ * rows carry their total / open-for-attendance counts and start with an empty
26
+ * `meetings` array (child meetings are lazily loaded on drill-down);
27
+ * STANDALONE_MEETING rows carry their own group/location + attendance state.
18
28
  * @param {EventMeetingListItem} item - The raw list item.
19
29
  * @return {UpcomingEvent} The mapped view model.
20
30
  */
21
31
  export function mapListItemToUpcomingEvent(item) {
22
32
  const kind = resolveItemKind(item);
23
- const timezone = item?.timeZone ?? '';
24
- const dayIndicator = item?.dayIndicator ??
25
- (kind === UpcomingItemKind.EVENT
26
- ? computeDayIndicator(item?.startDateTime, item?.endDateTime, timezone)
27
- : '');
33
+ const isEvent = kind === UpcomingItemKind.EVENT;
28
34
  return {
29
- eventId: item?.id ?? item?.eventId ?? item?.meetingId ?? '',
35
+ eventId: item?.id ?? '',
30
36
  kind,
31
- // The list endpoint uses `name`; fall back to `meetingTitle` for meeting rows.
32
- title: item?.name ?? item?.meetingTitle ?? '',
33
- // The list screen copies status into contentUnderLink; accept either.
34
- status: item?.status ?? item?.contentUnderLink ?? '',
35
- dayIndicator,
36
- meetingCount: kind === UpcomingItemKind.STANDALONE_MEETING
37
- ? 1
38
- : item?.meetingCount ?? 0,
39
- openForAttendanceCount: item?.openForAttendanceCount ?? 0,
37
+ title: item?.name ?? '',
38
+ status: item?.status ?? '',
39
+ // The list endpoint has no day indicator; it is populated on drill-down
40
+ // from the event's currentDay / totalDays.
41
+ dayIndicator: '',
42
+ meetingCount: isEvent ? item?.totalMeetingCount ?? 0 : 1,
43
+ openForAttendanceCount: isEvent
44
+ ? item?.meetingsOpenForAttendanceCount ?? 0
45
+ : 0,
40
46
  startDateTime: item?.startDateTime,
41
47
  endDateTime: item?.endDateTime,
42
- timezone,
48
+ timezone: item?.timeZone ?? '',
43
49
  groupOrCommittee: item?.groupName ?? item?.groupAcronym ?? '',
44
- roomOrLocation: item?.meetingLocation ?? item?.room ?? '',
45
- isMemberOfGroup: item?.isMemberOfGroup ?? false,
50
+ roomOrLocation: item?.meetingLocation ?? '',
51
+ attendanceState: isEvent ? undefined : item?.attendanceState,
46
52
  meetings: [],
47
53
  };
48
54
  }
49
55
  /**
50
- * Maps a raw backend list of events & meetings into the dashboard view models,
51
- * enforcing that STANDALONE_MEETING rows always sort LAST while preserving the
52
- * backend's within-group ordering for each partition (stable sort).
56
+ * Maps a raw backend combined list into the dashboard view models, enforcing
57
+ * that STANDALONE_MEETING rows always sort LAST while preserving the backend's
58
+ * within-group ordering for each partition (stable sort).
53
59
  * @param {EventMeetingListItem[]} items - The raw list items.
54
60
  * @return {UpcomingEvent[]} The mapped, standalone-last ordered view models.
55
61
  */
@@ -60,37 +66,37 @@ export function mapEventMeetingList(items) {
60
66
  return [...events, ...standalone];
61
67
  }
62
68
  /**
63
- * Maps a raw backend child-meeting detail item to the {@link MeetingRow} view
69
+ * Maps a raw backend drill-down meeting item to the {@link MeetingRow} view
64
70
  * model used by the event block's expanded meeting list.
65
71
  * @param {EventMeetingDetailItem} item - The raw child-meeting item.
72
+ * @param {string} [eventId] - The owning event id (for navigation).
66
73
  * @return {MeetingRow} The mapped meeting row.
67
74
  */
68
- export function mapDetailItemToMeetingRow(item) {
75
+ export function mapDetailItemToMeetingRow(item, eventId = '') {
69
76
  const status = item?.status ?? '';
70
- // A meeting is "open for attendance" while it is In Progress. The
71
- // meetingsDetails endpoint has no dedicated flag, so derive it from status
72
- // (honouring an explicit backend flag when one is provided).
73
- const isOpenForAttendance = item?.isOpenForAttendance ?? status.trim().toLowerCase() === 'in progress';
77
+ const attendanceState = item?.attendanceState ?? AttendanceState.NOT_ATTENDING;
74
78
  return {
75
79
  meetingId: item?.meetingId ?? '',
80
+ eventId,
76
81
  meetingName: item?.meetingTitle ?? '',
77
- groupOrCommittee: item?.groupName ?? '',
78
- roomOrLocation: item?.meetingLocation ?? '',
82
+ groupOrCommittee: item?.groupName ?? item?.groupAcronym ?? '',
83
+ roomOrLocation: item?.location ?? '',
79
84
  startDateTime: item?.meetingStDate,
80
85
  endDateTime: item?.meetingEdDate,
81
86
  timezone: item?.timeZone ?? '',
82
87
  status,
83
- isMemberOfGroup: item?.isMemberOfGroup ?? false,
84
- isOpenForAttendance,
88
+ attendanceState,
89
+ isOpenForAttendance: status.trim().toLowerCase() === 'in progress',
85
90
  };
86
91
  }
87
92
  /**
88
- * Maps a raw backend list of child-meeting detail items to {@link MeetingRow}
89
- * view models.
93
+ * Maps a raw backend drill-down meeting list to {@link MeetingRow} view models,
94
+ * tagging each with its owning event id for navigation.
90
95
  * @param {EventMeetingDetailItem[]} items - The raw child-meeting items.
96
+ * @param {string} [eventId] - The owning event id.
91
97
  * @return {MeetingRow[]} The mapped meeting rows.
92
98
  */
93
- export function mapEventMeetingDetails(items) {
94
- return (items ?? []).map((item) => mapDetailItemToMeetingRow(item));
99
+ export function mapEventMeetingDetails(items, eventId = '') {
100
+ return (items ?? []).map((item) => mapDetailItemToMeetingRow(item, eventId));
95
101
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWVldGluZy1tYXBwZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL3V0aWxzL2V2ZW50LW1lZXRpbmctbWFwcGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXpEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxjQUFjLEtBQUssSUFBSSxJQUFJLElBQUksRUFBRSxXQUFXLEtBQUssSUFBSSxDQUFDO0lBQzVFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO0FBQ2hGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLElBQTBCO0lBRTFCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUN0QyxNQUFNLFlBQVksR0FDaEIsSUFBSSxFQUFFLFlBQVk7UUFDbEIsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsS0FBSztZQUM5QixDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQztZQUN2RSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVixPQUFPO1FBQ0wsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLEVB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QUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQdXJlIG1hcHBlcnMgY29udmVydGluZyB0aGUgcmF3IFwiZXZlbnRzICYgbWVldGluZ3NcIiBiYWNrZW5kIGxpc3QvZGV0YWlsIGl0ZW1zXHJcbiAqIGludG8gdGhlIGRhc2hib2FyZCB2aWV3IG1vZGVscy4gTm8gQW5ndWxhciAvIHNlcnZpY2UgZGVwZW5kZW5jaWVzIHNvIHRoZXkgYXJlXHJcbiAqIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFuZCBzaGFyZWQgYnkge0BsaW5rIERhc2hib2FyZFNlcnZpY2V9LlxyXG4gKlxyXG4gKiBCYWNrZW5kIGRhdGVzIGFyZSBlcG9jaCBtaWxsaXNlY29uZHM7IGNhbGxlcnMgZm9ybWF0IHRoZW0gd2l0aCBsdXhvblxyXG4gKiBgRGF0ZVRpbWUuZnJvbU1pbGxpc2AgYXQgcmVuZGVyIHRpbWUuIFRoZSBsaXN0IG1hcHBlciBlbmZvcmNlcyB0aGUgZGFzaGJvYXJkXHJcbiAqIHJ1bGUgdGhhdCBTVEFOREFMT05FX01FRVRJTkcgcm93cyBhbHdheXMgc29ydCBMQVNUIHdpdGhpbiB0aGUgc2VjdGlvbi5cclxuICovXHJcbmltcG9ydCB7XHJcbiAgRXZlbnRNZWV0aW5nRGV0YWlsSXRlbSxcclxuICBFdmVudE1lZXRpbmdMaXN0SXRlbSxcclxufSBmcm9tICcuLi9tb2RlbHMvZXZlbnQtbWVldGluZy1saXN0LWl0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBNZWV0aW5nUm93IH0gZnJvbSAnLi4vbW9kZWxzL21lZXRpbmctcm93Lm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBVcGNvbWluZ0V2ZW50LFxyXG4gIFVwY29taW5nSXRlbUtpbmQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3VwY29taW5nLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgY29tcHV0ZURheUluZGljYXRvciB9IGZyb20gJy4vZGF0ZS1mb3JtYXQudXRpbCc7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmF3IGxpc3QgaXRlbSBpcyBhbiBFVkVOVCAob3ducyBjaGlsZCBtZWV0aW5ncykgb3IgYVxyXG4gKiBTVEFOREFMT05FX01FRVRJTkcuIEFuIGl0ZW0gaXMgYW4gRVZFTlQgd2hlbiB0aGUgYmFja2VuZCBmbGFncyBpdCB3aXRoXHJcbiAqIGBpc01lZXRpbmdFdmVudCA9PT0gdHJ1ZWAgb3IgYGhhc0NoaWxkcmVuID09PSB0cnVlYC5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdMaXN0SXRlbX0gaXRlbSAtIFRoZSByYXcgbGlzdCBpdGVtLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0l0ZW1LaW5kfSBUaGUgcmVzb2x2ZWQgcmVuZGVyIGtpbmQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUl0ZW1LaW5kKFxyXG4gIGl0ZW06IEV2ZW50TWVldGluZ0xpc3RJdGVtXHJcbik6IFVwY29taW5nSXRlbUtpbmQge1xyXG4gIGNvbnN0IGlzRXZlbnQgPSBpdGVtPy5pc01lZXRpbmdFdmVudCA9PT0gdHJ1ZSB8fCBpdGVtPy5oYXNDaGlsZHJlbiA9PT0gdHJ1ZTtcclxuICByZXR1cm4gaXNFdmVudCA/IFVwY29taW5nSXRlbUtpbmQuRVZFTlQgOiBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElORztcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IGl0ZW0gdG8gdGhlIHtAbGluayBVcGNvbWluZ0V2ZW50fSB2aWV3IG1vZGVsLiBFVkVOVFxyXG4gKiByb3dzIHN0YXJ0IHdpdGggYW4gZW1wdHkgYG1lZXRpbmdzYCBhcnJheSAoY2hpbGQgbWVldGluZ3MgYXJlIGxhemlseSBsb2FkZWQgb25cclxuICogZXhwYW5kKTsgU1RBTkRBTE9ORV9NRUVUSU5HIHJvd3MgY2FycnkgdGhlaXIgb3duIGdyb3VwL2xvY2F0aW9uIGZpZWxkcy5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdMaXN0SXRlbX0gaXRlbSAtIFRoZSByYXcgbGlzdCBpdGVtLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0V2ZW50fSBUaGUgbWFwcGVkIHZpZXcgbW9kZWwuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwTGlzdEl0ZW1Ub1VwY29taW5nRXZlbnQoXHJcbiAgaXRlbTogRXZlbnRNZWV0aW5nTGlzdEl0ZW1cclxuKTogVXBjb21pbmdFdmVudCB7XHJcbiAgY29uc3Qga2luZCA9IHJlc29sdmVJdGVtS2luZChpdGVtKTtcclxuICBjb25zdCB0aW1lem9uZSA9IGl0ZW0/LnRpbWVab25lID8/ICcnO1xyXG4gIGNvbnN0IGRheUluZGljYXRvciA9XHJcbiAgICBpdGVtPy5kYXlJbmRpY2F0b3IgPz9cclxuICAgIChraW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLkVWRU5UXHJcbiAgICAgID8gY29tcHV0ZURheUluZGljYXRvcihpdGVtPy5zdGFydERhdGVUaW1lLCBpdGVtPy5lbmREYXRlVGltZSwgdGltZXpvbmUpXHJcbiAgICAgIDogJycpO1xyXG4gIHJldHVybiB7XHJcbiAgICBldmVudElkOiBpdGVtPy5pZCA/PyBpdGVtPy5ldmVudElkID8/IGl0ZW0/Lm1lZXRpbmdJZCA/PyAnJyxcclxuICAgIGtpbmQsXHJcbiAgICAvLyBUaGUgbGlzdCBlbmRwb2ludCB1c2VzIGBuYW1lYDsgZmFsbCBiYWNrIHRvIGBtZWV0aW5nVGl0bGVgIGZvciBtZWV0aW5nIHJvd3MuXHJcbiAgICB0aXRsZTogaXRlbT8ubmFtZSA/PyBpdGVtPy5tZWV0aW5nVGl0bGUgPz8gJycsXHJcbiAgICAvLyBUaGUgbGlzdCBzY3JlZW4gY29waWVzIHN0YXR1cyBpbnRvIGNvbnRlbnRVbmRlckxpbms7IGFjY2VwdCBlaXRoZXIuXHJcbiAgICBzdGF0dXM6IGl0ZW0/LnN0YXR1cyA/PyBpdGVtPy5jb250ZW50VW5kZXJMaW5rID8/ICcnLFxyXG4gICAgZGF5SW5kaWNhdG9yLFxyXG4gICAgbWVldGluZ0NvdW50OlxyXG4gICAgICBraW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElOR1xyXG4gICAgICAgID8gMVxyXG4gICAgICAgIDogaXRlbT8ubWVldGluZ0NvdW50ID8/IDAsXHJcbiAgICBvcGVuRm9yQXR0ZW5kYW5jZUNvdW50OiBpdGVtPy5vcGVuRm9yQXR0ZW5kYW5jZUNvdW50ID8/IDAsXHJcbiAgICBzdGFydERhdGVUaW1lOiBpdGVtPy5zdGFydERhdGVUaW1lLFxyXG4gICAgZW5kRGF0ZVRpbWU6IGl0ZW0/LmVuZERhdGVUaW1lLFxyXG4gICAgdGltZXpvbmUsXHJcbiAgICBncm91cE9yQ29tbWl0dGVlOiBpdGVtPy5ncm91cE5hbWUgPz8gaXRlbT8uZ3JvdXBBY3JvbnltID8/ICcnLFxyXG4gICAgcm9vbU9yTG9jYXRpb246IGl0ZW0/Lm1lZXRpbmdMb2NhdGlvbiA/PyBpdGVtPy5yb29tID8/ICcnLFxyXG4gICAgaXNNZW1iZXJPZkdyb3VwOiBpdGVtPy5pc01lbWJlck9mR3JvdXAgPz8gZmFsc2UsXHJcbiAgICBtZWV0aW5nczogW10sXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IG9mIGV2ZW50cyAmIG1lZXRpbmdzIGludG8gdGhlIGRhc2hib2FyZCB2aWV3IG1vZGVscyxcclxuICogZW5mb3JjaW5nIHRoYXQgU1RBTkRBTE9ORV9NRUVUSU5HIHJvd3MgYWx3YXlzIHNvcnQgTEFTVCB3aGlsZSBwcmVzZXJ2aW5nIHRoZVxyXG4gKiBiYWNrZW5kJ3Mgd2l0aGluLWdyb3VwIG9yZGVyaW5nIGZvciBlYWNoIHBhcnRpdGlvbiAoc3RhYmxlIHNvcnQpLlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0xpc3RJdGVtW119IGl0ZW1zIC0gVGhlIHJhdyBsaXN0IGl0ZW1zLlxyXG4gKiBAcmV0dXJuIHtVcGNvbWluZ0V2ZW50W119IFRoZSBtYXBwZWQsIHN0YW5kYWxvbmUtbGFzdCBvcmRlcmVkIHZpZXcgbW9kZWxzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEV2ZW50TWVldGluZ0xpc3QoXHJcbiAgaXRlbXM6IEV2ZW50TWVldGluZ0xpc3RJdGVtW11cclxuKTogVXBjb21pbmdFdmVudFtdIHtcclxuICBjb25zdCBtYXBwZWQgPSAoaXRlbXMgPz8gW10pLm1hcCgoaXRlbSkgPT4gbWFwTGlzdEl0ZW1Ub1VwY29taW5nRXZlbnQoaXRlbSkpO1xyXG4gIGNvbnN0IGV2ZW50cyA9IG1hcHBlZC5maWx0ZXIoXHJcbiAgICAoZW50cnkpID0+IGVudHJ5LmtpbmQgPT09IFVwY29taW5nSXRlbUtpbmQuRVZFTlRcclxuICApO1xyXG4gIGNvbnN0IHN0YW5kYWxvbmUgPSBtYXBwZWQuZmlsdGVyKFxyXG4gICAgKGVudHJ5KSA9PiBlbnRyeS5raW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLlNUQU5EQUxPTkVfTUVFVElOR1xyXG4gICk7XHJcbiAgcmV0dXJuIFsuLi5ldmVudHMsIC4uLnN0YW5kYWxvbmVdO1xyXG59XHJcblxyXG4vKipcclxuICogTWFwcyBhIHJhdyBiYWNrZW5kIGNoaWxkLW1lZXRpbmcgZGV0YWlsIGl0ZW0gdG8gdGhlIHtAbGluayBNZWV0aW5nUm93fSB2aWV3XHJcbiAqIG1vZGVsIHVzZWQgYnkgdGhlIGV2ZW50IGJsb2NrJ3MgZXhwYW5kZWQgbWVldGluZyBsaXN0LlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0RldGFpbEl0ZW19IGl0ZW0gLSBUaGUgcmF3IGNoaWxkLW1lZXRpbmcgaXRlbS5cclxuICogQHJldHVybiB7TWVldGluZ1Jvd30gVGhlIG1hcHBlZCBtZWV0aW5nIHJvdy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBEZXRhaWxJdGVtVG9NZWV0aW5nUm93KFxyXG4gIGl0ZW06IEV2ZW50TWVldGluZ0RldGFpbEl0ZW1cclxuKTogTWVldGluZ1JvdyB7XHJcbiAgY29uc3Qgc3RhdHVzID0gaXRlbT8uc3RhdHVzID8/ICcnO1xyXG4gIC8vIEEgbWVldGluZyBpcyBcIm9wZW4gZm9yIGF0dGVuZGFuY2VcIiB3aGlsZSBpdCBpcyBJbiBQcm9ncmVzcy4gVGhlXHJcbiAgLy8gbWVldGluZ3NEZXRhaWxzIGVuZHBvaW50IGhhcyBubyBkZWRpY2F0ZWQgZmxhZywgc28gZGVyaXZlIGl0IGZyb20gc3RhdHVzXHJcbiAgLy8gKGhvbm91cmluZyBhbiBleHBsaWNpdCBiYWNrZW5kIGZsYWcgd2hlbiBvbmUgaXMgcHJvdmlkZWQpLlxyXG4gIGNvbnN0IGlzT3BlbkZvckF0dGVuZGFuY2UgPVxyXG4gICAgaXRlbT8uaXNPcGVuRm9yQXR0ZW5kYW5jZSA/PyBzdGF0dXMudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdpbiBwcm9ncmVzcyc7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1lZXRpbmdJZDogaXRlbT8ubWVldGluZ0lkID8/ICcnLFxyXG4gICAgbWVldGluZ05hbWU6IGl0ZW0/Lm1lZXRpbmdUaXRsZSA/PyAnJyxcclxuICAgIGdyb3VwT3JDb21taXR0ZWU6IGl0ZW0/Lmdyb3VwTmFtZSA/PyAnJyxcclxuICAgIHJvb21PckxvY2F0aW9uOiBpdGVtPy5tZWV0aW5nTG9jYXRpb24gPz8gJycsXHJcbiAgICBzdGFydERhdGVUaW1lOiBpdGVtPy5tZWV0aW5nU3REYXRlLFxyXG4gICAgZW5kRGF0ZVRpbWU6IGl0ZW0/Lm1lZXRpbmdFZERhdGUsXHJcbiAgICB0aW1lem9uZTogaXRlbT8udGltZVpvbmUgPz8gJycsXHJcbiAgICBzdGF0dXMsXHJcbiAgICBpc01lbWJlck9mR3JvdXA6IGl0ZW0/LmlzTWVtYmVyT2ZHcm91cCA/PyBmYWxzZSxcclxuICAgIGlzT3BlbkZvckF0dGVuZGFuY2UsXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBsaXN0IG9mIGNoaWxkLW1lZXRpbmcgZGV0YWlsIGl0ZW1zIHRvIHtAbGluayBNZWV0aW5nUm93fVxyXG4gKiB2aWV3IG1vZGVscy5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdEZXRhaWxJdGVtW119IGl0ZW1zIC0gVGhlIHJhdyBjaGlsZC1tZWV0aW5nIGl0ZW1zLlxyXG4gKiBAcmV0dXJuIHtNZWV0aW5nUm93W119IFRoZSBtYXBwZWQgbWVldGluZyByb3dzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEV2ZW50TWVldGluZ0RldGFpbHMoXHJcbiAgaXRlbXM6IEV2ZW50TWVldGluZ0RldGFpbEl0ZW1bXVxyXG4pOiBNZWV0aW5nUm93W10ge1xyXG4gIHJldHVybiAoaXRlbXMgPz8gW10pLm1hcCgoaXRlbSkgPT4gbWFwRGV0YWlsSXRlbVRvTWVldGluZ1JvdyhpdGVtKSk7XHJcbn1cclxuIl19
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWVldGluZy1tYXBwZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL3V0aWxzL2V2ZW50LW1lZXRpbmctbWFwcGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFNbkUsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxjQUFjLEtBQUssSUFBSSxJQUFJLElBQUksRUFBRSxXQUFXLEtBQUssSUFBSSxDQUFDO0lBQzVFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO0FBQ2hGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxJQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssQ0FBQztJQUNoRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRTtRQUN2QixJQUFJO1FBQ0osS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtRQUN2QixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFO1FBQzFCLHdFQUF3RTtRQUN4RSwyQ0FBMkM7UUFDM0MsWUFBWSxFQUFFLEVBQUU7UUFDaEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxzQkFBc0IsRUFBRSxPQUFPO1lBQzdCLENBQUMsQ0FBQyxJQUFJLEVBQUUsOEJBQThCLElBQUksQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNMLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYTtRQUNsQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVc7UUFDOUIsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLElBQUksRUFBRTtRQUM5QixnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxZQUFZLElBQUksRUFBRTtRQUM3RCxjQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsSUFBSSxFQUFFO1FBQzNDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGVBQWU7UUFDNUQsUUFBUSxFQUFFLEVBQUU7S0FDYixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsS0FBNkI7SUFFN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzFCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssQ0FDakQsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzlCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLGtCQUFrQixDQUM5RCxDQUFDO0lBQ0YsT0FBTyxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsSUFBNEIsRUFDNUIsT0FBTyxHQUFHLEVBQUU7SUFFWixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUNsQyxNQUFNLGVBQWUsR0FDbkIsSUFBSSxFQUFFLGVBQWUsSUFBSSxlQUFlLENBQUMsYUFBYSxDQUFDO0lBQ3pELE9BQU87UUFDTCxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFO1FBQ2hDLE9BQU87UUFDUCxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksSUFBSSxFQUFFO1FBQ3JDLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxFQUFFO1FBQzdELGNBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUU7UUFDcEMsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhO1FBQ2xDLFdBQVcsRUFBRSxJQUFJLEVBQUUsYUFBYTtRQUNoQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFO1FBQzlCLE1BQU07UUFDTixlQUFlO1FBQ2YsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLGFBQWE7S0FDbkUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLEtBQStCLEVBQy9CLE9BQU8sR0FBRyxFQUFFO0lBRVosT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNoQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQ3pDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFB1cmUgbWFwcGVycyBjb252ZXJ0aW5nIHRoZSByYXcgXCJob21lXCIgZXZlbnRzLSYtbWVldGluZ3MgYmFja2VuZCBsaXN0L2RldGFpbFxyXG4gKiBpdGVtcyBpbnRvIHRoZSBkYXNoYm9hcmQgdmlldyBtb2RlbHMuIE5vIEFuZ3VsYXIgLyBzZXJ2aWNlIGRlcGVuZGVuY2llcyBzb1xyXG4gKiB0aGV5IGFyZSB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhbmQgc2hhcmVkIGJ5IHtAbGluayBEYXNoYm9hcmRTZXJ2aWNlfS5cclxuICpcclxuICogQmFja2VuZCBkYXRlcyBhcmUgSVNPLTg2MDEgc3RyaW5nczsgY2FsbGVycyBmb3JtYXQgdGhlbSB3aXRoIGx1eG9uIGF0IHJlbmRlclxyXG4gKiB0aW1lLiBUaGUgbGlzdCBtYXBwZXIgZW5mb3JjZXMgdGhlIGRhc2hib2FyZCBydWxlIHRoYXQgU1RBTkRBTE9ORV9NRUVUSU5HIHJvd3NcclxuICogYWx3YXlzIHNvcnQgTEFTVCB3aXRoaW4gdGhlIHNlY3Rpb24uXHJcbiAqL1xyXG5pbXBvcnQgeyBBdHRlbmRhbmNlU3RhdGUgfSBmcm9tICcuLi9tb2RlbHMvYXR0ZW5kYW5jZS1zdGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgRXZlbnRNZWV0aW5nRGV0YWlsSXRlbSxcclxuICBFdmVudE1lZXRpbmdMaXN0SXRlbSxcclxufSBmcm9tICcuLi9tb2RlbHMvZXZlbnQtbWVldGluZy1saXN0LWl0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBNZWV0aW5nUm93IH0gZnJvbSAnLi4vbW9kZWxzL21lZXRpbmctcm93Lm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBVcGNvbWluZ0V2ZW50LFxyXG4gIFVwY29taW5nSXRlbUtpbmQsXHJcbn0gZnJvbSAnLi4vbW9kZWxzL3VwY29taW5nLWV2ZW50Lm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByYXcgbGlzdCBpdGVtIGlzIGFuIEVWRU5UIChvd25zIGNoaWxkIG1lZXRpbmdzKSBvciBhXHJcbiAqIFNUQU5EQUxPTkVfTUVFVElORywgdXNpbmcgdGhlIGJhY2tlbmQgYGlzTWVldGluZ0V2ZW50YCBkaXNjcmltaW5hdG9yIChmYWxsaW5nXHJcbiAqIGJhY2sgdG8gYGhhc0NoaWxkcmVuYCkuXHJcbiAqIEBwYXJhbSB7RXZlbnRNZWV0aW5nTGlzdEl0ZW19IGl0ZW0gLSBUaGUgcmF3IGxpc3QgaXRlbS5cclxuICogQHJldHVybiB7VXBjb21pbmdJdGVtS2luZH0gVGhlIHJlc29sdmVkIHJlbmRlciBraW5kLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJdGVtS2luZChcclxuICBpdGVtOiBFdmVudE1lZXRpbmdMaXN0SXRlbVxyXG4pOiBVcGNvbWluZ0l0ZW1LaW5kIHtcclxuICBjb25zdCBpc0V2ZW50ID0gaXRlbT8uaXNNZWV0aW5nRXZlbnQgPT09IHRydWUgfHwgaXRlbT8uaGFzQ2hpbGRyZW4gPT09IHRydWU7XHJcbiAgcmV0dXJuIGlzRXZlbnQgPyBVcGNvbWluZ0l0ZW1LaW5kLkVWRU5UIDogVXBjb21pbmdJdGVtS2luZC5TVEFOREFMT05FX01FRVRJTkc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYXBzIGEgcmF3IGJhY2tlbmQgbGlzdCBpdGVtIHRvIHRoZSB7QGxpbmsgVXBjb21pbmdFdmVudH0gdmlldyBtb2RlbC4gRVZFTlRcclxuICogcm93cyBjYXJyeSB0aGVpciB0b3RhbCAvIG9wZW4tZm9yLWF0dGVuZGFuY2UgY291bnRzIGFuZCBzdGFydCB3aXRoIGFuIGVtcHR5XHJcbiAqIGBtZWV0aW5nc2AgYXJyYXkgKGNoaWxkIG1lZXRpbmdzIGFyZSBsYXppbHkgbG9hZGVkIG9uIGRyaWxsLWRvd24pO1xyXG4gKiBTVEFOREFMT05FX01FRVRJTkcgcm93cyBjYXJyeSB0aGVpciBvd24gZ3JvdXAvbG9jYXRpb24gKyBhdHRlbmRhbmNlIHN0YXRlLlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0xpc3RJdGVtfSBpdGVtIC0gVGhlIHJhdyBsaXN0IGl0ZW0uXHJcbiAqIEByZXR1cm4ge1VwY29taW5nRXZlbnR9IFRoZSBtYXBwZWQgdmlldyBtb2RlbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBMaXN0SXRlbVRvVXBjb21pbmdFdmVudChcclxuICBpdGVtOiBFdmVudE1lZXRpbmdMaXN0SXRlbVxyXG4pOiBVcGNvbWluZ0V2ZW50IHtcclxuICBjb25zdCBraW5kID0gcmVzb2x2ZUl0ZW1LaW5kKGl0ZW0pO1xyXG4gIGNvbnN0IGlzRXZlbnQgPSBraW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLkVWRU5UO1xyXG4gIHJldHVybiB7XHJcbiAgICBldmVudElkOiBpdGVtPy5pZCA/PyAnJyxcclxuICAgIGtpbmQsXHJcbiAgICB0aXRsZTogaXRlbT8ubmFtZSA/PyAnJyxcclxuICAgIHN0YXR1czogaXRlbT8uc3RhdHVzID8/ICcnLFxyXG4gICAgLy8gVGhlIGxpc3QgZW5kcG9pbnQgaGFzIG5vIGRheSBpbmRpY2F0b3I7IGl0IGlzIHBvcHVsYXRlZCBvbiBkcmlsbC1kb3duXHJcbiAgICAvLyBmcm9tIHRoZSBldmVudCdzIGN1cnJlbnREYXkgLyB0b3RhbERheXMuXHJcbiAgICBkYXlJbmRpY2F0b3I6ICcnLFxyXG4gICAgbWVldGluZ0NvdW50OiBpc0V2ZW50ID8gaXRlbT8udG90YWxNZWV0aW5nQ291bnQgPz8gMCA6IDEsXHJcbiAgICBvcGVuRm9yQXR0ZW5kYW5jZUNvdW50OiBpc0V2ZW50XHJcbiAgICAgID8gaXRlbT8ubWVldGluZ3NPcGVuRm9yQXR0ZW5kYW5jZUNvdW50ID8/IDBcclxuICAgICAgOiAwLFxyXG4gICAgc3RhcnREYXRlVGltZTogaXRlbT8uc3RhcnREYXRlVGltZSxcclxuICAgIGVuZERhdGVUaW1lOiBpdGVtPy5lbmREYXRlVGltZSxcclxuICAgIHRpbWV6b25lOiBpdGVtPy50aW1lWm9uZSA/PyAnJyxcclxuICAgIGdyb3VwT3JDb21taXR0ZWU6IGl0ZW0/Lmdyb3VwTmFtZSA/PyBpdGVtPy5ncm91cEFjcm9ueW0gPz8gJycsXHJcbiAgICByb29tT3JMb2NhdGlvbjogaXRlbT8ubWVldGluZ0xvY2F0aW9uID8/ICcnLFxyXG4gICAgYXR0ZW5kYW5jZVN0YXRlOiBpc0V2ZW50ID8gdW5kZWZpbmVkIDogaXRlbT8uYXR0ZW5kYW5jZVN0YXRlLFxyXG4gICAgbWVldGluZ3M6IFtdLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYXBzIGEgcmF3IGJhY2tlbmQgY29tYmluZWQgbGlzdCBpbnRvIHRoZSBkYXNoYm9hcmQgdmlldyBtb2RlbHMsIGVuZm9yY2luZ1xyXG4gKiB0aGF0IFNUQU5EQUxPTkVfTUVFVElORyByb3dzIGFsd2F5cyBzb3J0IExBU1Qgd2hpbGUgcHJlc2VydmluZyB0aGUgYmFja2VuZCdzXHJcbiAqIHdpdGhpbi1ncm91cCBvcmRlcmluZyBmb3IgZWFjaCBwYXJ0aXRpb24gKHN0YWJsZSBzb3J0KS5cclxuICogQHBhcmFtIHtFdmVudE1lZXRpbmdMaXN0SXRlbVtdfSBpdGVtcyAtIFRoZSByYXcgbGlzdCBpdGVtcy5cclxuICogQHJldHVybiB7VXBjb21pbmdFdmVudFtdfSBUaGUgbWFwcGVkLCBzdGFuZGFsb25lLWxhc3Qgb3JkZXJlZCB2aWV3IG1vZGVscy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXBFdmVudE1lZXRpbmdMaXN0KFxyXG4gIGl0ZW1zOiBFdmVudE1lZXRpbmdMaXN0SXRlbVtdXHJcbik6IFVwY29taW5nRXZlbnRbXSB7XHJcbiAgY29uc3QgbWFwcGVkID0gKGl0ZW1zID8/IFtdKS5tYXAoKGl0ZW0pID0+IG1hcExpc3RJdGVtVG9VcGNvbWluZ0V2ZW50KGl0ZW0pKTtcclxuICBjb25zdCBldmVudHMgPSBtYXBwZWQuZmlsdGVyKFxyXG4gICAgKGVudHJ5KSA9PiBlbnRyeS5raW5kID09PSBVcGNvbWluZ0l0ZW1LaW5kLkVWRU5UXHJcbiAgKTtcclxuICBjb25zdCBzdGFuZGFsb25lID0gbWFwcGVkLmZpbHRlcihcclxuICAgIChlbnRyeSkgPT4gZW50cnkua2luZCA9PT0gVXBjb21pbmdJdGVtS2luZC5TVEFOREFMT05FX01FRVRJTkdcclxuICApO1xyXG4gIHJldHVybiBbLi4uZXZlbnRzLCAuLi5zdGFuZGFsb25lXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcHMgYSByYXcgYmFja2VuZCBkcmlsbC1kb3duIG1lZXRpbmcgaXRlbSB0byB0aGUge0BsaW5rIE1lZXRpbmdSb3d9IHZpZXdcclxuICogbW9kZWwgdXNlZCBieSB0aGUgZXZlbnQgYmxvY2sncyBleHBhbmRlZCBtZWV0aW5nIGxpc3QuXHJcbiAqIEBwYXJhbSB7RXZlbnRNZWV0aW5nRGV0YWlsSXRlbX0gaXRlbSAtIFRoZSByYXcgY2hpbGQtbWVldGluZyBpdGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50SWRdIC0gVGhlIG93bmluZyBldmVudCBpZCAoZm9yIG5hdmlnYXRpb24pLlxyXG4gKiBAcmV0dXJuIHtNZWV0aW5nUm93fSBUaGUgbWFwcGVkIG1lZXRpbmcgcm93LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcERldGFpbEl0ZW1Ub01lZXRpbmdSb3coXHJcbiAgaXRlbTogRXZlbnRNZWV0aW5nRGV0YWlsSXRlbSxcclxuICBldmVudElkID0gJydcclxuKTogTWVldGluZ1JvdyB7XHJcbiAgY29uc3Qgc3RhdHVzID0gaXRlbT8uc3RhdHVzID8/ICcnO1xyXG4gIGNvbnN0IGF0dGVuZGFuY2VTdGF0ZSA9XHJcbiAgICBpdGVtPy5hdHRlbmRhbmNlU3RhdGUgPz8gQXR0ZW5kYW5jZVN0YXRlLk5PVF9BVFRFTkRJTkc7XHJcbiAgcmV0dXJuIHtcclxuICAgIG1lZXRpbmdJZDogaXRlbT8ubWVldGluZ0lkID8/ICcnLFxyXG4gICAgZXZlbnRJZCxcclxuICAgIG1lZXRpbmdOYW1lOiBpdGVtPy5tZWV0aW5nVGl0bGUgPz8gJycsXHJcbiAgICBncm91cE9yQ29tbWl0dGVlOiBpdGVtPy5ncm91cE5hbWUgPz8gaXRlbT8uZ3JvdXBBY3JvbnltID8/ICcnLFxyXG4gICAgcm9vbU9yTG9jYXRpb246IGl0ZW0/LmxvY2F0aW9uID8/ICcnLFxyXG4gICAgc3RhcnREYXRlVGltZTogaXRlbT8ubWVldGluZ1N0RGF0ZSxcclxuICAgIGVuZERhdGVUaW1lOiBpdGVtPy5tZWV0aW5nRWREYXRlLFxyXG4gICAgdGltZXpvbmU6IGl0ZW0/LnRpbWVab25lID8/ICcnLFxyXG4gICAgc3RhdHVzLFxyXG4gICAgYXR0ZW5kYW5jZVN0YXRlLFxyXG4gICAgaXNPcGVuRm9yQXR0ZW5kYW5jZTogc3RhdHVzLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnaW4gcHJvZ3Jlc3MnLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYXBzIGEgcmF3IGJhY2tlbmQgZHJpbGwtZG93biBtZWV0aW5nIGxpc3QgdG8ge0BsaW5rIE1lZXRpbmdSb3d9IHZpZXcgbW9kZWxzLFxyXG4gKiB0YWdnaW5nIGVhY2ggd2l0aCBpdHMgb3duaW5nIGV2ZW50IGlkIGZvciBuYXZpZ2F0aW9uLlxyXG4gKiBAcGFyYW0ge0V2ZW50TWVldGluZ0RldGFpbEl0ZW1bXX0gaXRlbXMgLSBUaGUgcmF3IGNoaWxkLW1lZXRpbmcgaXRlbXMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRJZF0gLSBUaGUgb3duaW5nIGV2ZW50IGlkLlxyXG4gKiBAcmV0dXJuIHtNZWV0aW5nUm93W119IFRoZSBtYXBwZWQgbWVldGluZyByb3dzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcEV2ZW50TWVldGluZ0RldGFpbHMoXHJcbiAgaXRlbXM6IEV2ZW50TWVldGluZ0RldGFpbEl0ZW1bXSxcclxuICBldmVudElkID0gJydcclxuKTogTWVldGluZ1Jvd1tdIHtcclxuICByZXR1cm4gKGl0ZW1zID8/IFtdKS5tYXAoKGl0ZW0pID0+XHJcbiAgICBtYXBEZXRhaWxJdGVtVG9NZWV0aW5nUm93KGl0ZW0sIGV2ZW50SWQpXHJcbiAgKTtcclxufVxyXG4iXX0=