@ieeesa-npm/groups 0.15.9 → 0.15.10

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 (35) hide show
  1. package/esm2022/lib/assets/constants.json +75 -4
  2. package/esm2022/lib/components/interest-form/interest-form.component.mjs +104 -0
  3. package/esm2022/lib/components/interest-form-management/interest-form-management.component.mjs +63 -0
  4. package/esm2022/lib/components/interested-rosters/interested-rosters.component.mjs +28 -0
  5. package/esm2022/lib/components/roster-import/roster-import.component.mjs +149 -82
  6. package/esm2022/lib/components/roster-import-history/roster-import-history.component.mjs +232 -0
  7. package/esm2022/lib/components/tree-view/tree-view.component.mjs +26 -5
  8. package/esm2022/lib/components/view-roster/view-roster.component.mjs +10 -3
  9. package/esm2022/lib/groups.component.mjs +60 -6
  10. package/esm2022/lib/models/group-action.model.mjs +2 -1
  11. package/esm2022/lib/models/group-function-type.model.mjs +2 -1
  12. package/esm2022/lib/models/permission-type.model.mjs +2 -1
  13. package/esm2022/lib/models/roster-import.model.mjs +34 -17
  14. package/esm2022/lib/services/roster-import-api.service.mjs +174 -0
  15. package/esm2022/public-api.mjs +6 -1
  16. package/fesm2022/ieeesa-npm-groups.mjs +930 -211
  17. package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
  18. package/lib/components/interest-form/interest-form.component.d.ts +75 -0
  19. package/lib/components/interest-form-management/interest-form-management.component.d.ts +31 -0
  20. package/lib/components/interested-rosters/interested-rosters.component.d.ts +17 -0
  21. package/lib/components/roster-import/roster-import.component.d.ts +77 -38
  22. package/lib/components/roster-import-history/roster-import-history.component.d.ts +102 -0
  23. package/lib/components/tree-view/tree-view.component.d.ts +6 -3
  24. package/lib/components/view-roster/view-roster.component.d.ts +5 -0
  25. package/lib/groups.component.d.ts +17 -0
  26. package/lib/models/group-action.model.d.ts +2 -1
  27. package/lib/models/group-function-type.model.d.ts +2 -1
  28. package/lib/models/permission-type.model.d.ts +2 -1
  29. package/lib/models/roster-import.model.d.ts +104 -21
  30. package/lib/services/groups.service.d.ts +4 -0
  31. package/lib/services/roster-import-api.service.d.ts +108 -0
  32. package/package.json +1 -1
  33. package/public-api.d.ts +5 -0
  34. package/esm2022/lib/assets/roster-import-mocks.mjs +0 -98
  35. package/lib/assets/roster-import-mocks.d.ts +0 -27
@@ -0,0 +1,232 @@
1
+ import { Component, Input, ViewEncapsulation, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { HttpErrorResponse } from '@angular/common/http';
4
+ import { Subject, takeUntil } from 'rxjs';
5
+ import { DataTableComponent, TableColumnType, } from '@ieeesa-npm/presentation';
6
+ import * as constants from '../../assets/constants.json';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../services/roster-import-api.service";
9
+ import * as i2 from "../../services/groups.service";
10
+ import * as i3 from "@ieeesa-npm/utility";
11
+ import * as i4 from "@angular/common";
12
+ /**
13
+ * Roster import-history ("View History") dialog body.
14
+ *
15
+ * Rendered inside the shared ModalComponent (which supplies the
16
+ * "← Back to Rosters / View History" breadcrumb title row + X close). Shows the
17
+ * selected group's name and an "Imported Files" table listing prior roster
18
+ * imports.
19
+ *
20
+ * Data comes from the real BE endpoint via {@link RosterImportApiService}:
21
+ * `GET /v1/groups/roster/import/history/{groupId}`. The response is a list of
22
+ * `RosterImportJob` whose JSON view exposes `fileName`, `successRows`,
23
+ * `failedRows`, `status` and ids — but NOT `createdOn` / `createdBy` (both are
24
+ * `@JsonIgnore` on the BE entity). So the "Timestamp" and "Person Imported"
25
+ * columns render a placeholder until the BE exposes those fields. "Target
26
+ * Group" uses the current group's name (history is scoped to one group).
27
+ *
28
+ * @export
29
+ * @class RosterImportHistoryComponent
30
+ */
31
+ export class RosterImportHistoryComponent {
32
+ constructor(
33
+ // eslint-disable-next-line no-unused-vars
34
+ rosterImportApiService,
35
+ // eslint-disable-next-line no-unused-vars
36
+ groupService,
37
+ // eslint-disable-next-line no-unused-vars
38
+ cdr,
39
+ // eslint-disable-next-line no-unused-vars
40
+ globalErrorHandlerService) {
41
+ this.rosterImportApiService = rosterImportApiService;
42
+ this.groupService = groupService;
43
+ this.cdr = cdr;
44
+ this.globalErrorHandlerService = globalErrorHandlerService;
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
+ this.constants = constants;
47
+ this.screenTexts = this.constants?.rosterImportHistory;
48
+ this.destroy$ = new Subject();
49
+ /** Table column definitions for the "Imported Files" table. */
50
+ this.columnSchema = [];
51
+ /** Import-history rows mapped for the table. */
52
+ this.tableData = [];
53
+ /** True while the history request is in flight. */
54
+ this.isLoading = false;
55
+ /** Inline error message when the history request fails. */
56
+ this.errorMessage = null;
57
+ /** Read-only table — no search / filter / add / edit / delete actions. */
58
+ this.tableActions = {
59
+ isSearchNeeded: false,
60
+ isFilterNeeded: false,
61
+ isAddNeeded: false,
62
+ isEditNeeded: false,
63
+ isDeleteNeeded: false,
64
+ };
65
+ /** Placeholder shown for fields the BE does not return (timestamp / person). */
66
+ this.placeholder = this.screenTexts?.emptyFieldPlaceholder ?? '—';
67
+ }
68
+ /** The group name shown as the heading above the Imported Files table. */
69
+ get groupName() {
70
+ return (this.componentData?.groupName ??
71
+ this.groupService?.getSelectedGroupInfo()?.groupName ??
72
+ '');
73
+ }
74
+ /** The group id whose history is fetched. */
75
+ get groupId() {
76
+ return (this.componentData?.groupId ??
77
+ this.groupService?.getSelectedGroupInfo()?.groupId ??
78
+ '');
79
+ }
80
+ /**
81
+ * Builds the table schema and loads the import history from the BE.
82
+ * @memberof RosterImportHistoryComponent
83
+ */
84
+ ngOnInit() {
85
+ this.buildColumnSchema();
86
+ this.rosterImportApiService.setApiBaseUrl(this.groupService?.apiBaseUrl);
87
+ this.loadImportHistory();
88
+ }
89
+ /**
90
+ * Cleans up subscriptions when the component is destroyed.
91
+ * @memberof RosterImportHistoryComponent
92
+ */
93
+ ngOnDestroy() {
94
+ this.destroy$.next(true);
95
+ this.destroy$.complete();
96
+ }
97
+ /**
98
+ * Fetches the import history for the current group and maps it to table rows.
99
+ * @memberof RosterImportHistoryComponent
100
+ */
101
+ loadImportHistory() {
102
+ if (!this.groupId) {
103
+ return;
104
+ }
105
+ this.isLoading = true;
106
+ this.errorMessage = null;
107
+ this.rosterImportApiService
108
+ .getImportHistory(this.groupId)
109
+ .pipe(takeUntil(this.destroy$))
110
+ .subscribe({
111
+ next: (jobs) => {
112
+ this.tableData = (jobs ?? []).map((job) => this.mapJobToRow(job));
113
+ this.isLoading = false;
114
+ this.cdr.detectChanges();
115
+ },
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ error: (error) => {
118
+ this.isLoading = false;
119
+ this.handleError(error);
120
+ this.cdr.detectChanges();
121
+ },
122
+ });
123
+ }
124
+ /**
125
+ * Maps a BE import job to a table row. Timestamp and Person Imported are not
126
+ * present in the response (BE `@JsonIgnore`), so they render a placeholder.
127
+ * Target Group uses the current group's name (history is per-group).
128
+ * @param {RosterImportJob} job - The BE import job.
129
+ * @return {RosterImportHistoryRow}
130
+ * @memberof RosterImportHistoryComponent
131
+ */
132
+ mapJobToRow(job) {
133
+ return {
134
+ timestamp: this.placeholder,
135
+ personImported: this.placeholder,
136
+ fileName: job?.fileName ?? this.placeholder,
137
+ addedRows: job?.successRows ?? 0,
138
+ errors: job?.failedRows ?? 0,
139
+ targetGroup: this.groupName || this.placeholder,
140
+ };
141
+ }
142
+ /**
143
+ * Maps a failed history request to a user-facing inline error message.
144
+ * A 403 gets the permission-specific message; other errors get the generic
145
+ * one and are forwarded to the global handler for logging/interceptors.
146
+ * @param {*} error - The HttpErrorResponse.
147
+ * @memberof RosterImportHistoryComponent
148
+ */
149
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
150
+ handleError(error) {
151
+ this.tableData = [];
152
+ const status = error?.status ?? error?.error?.status;
153
+ if (status === 403) {
154
+ this.errorMessage =
155
+ this.screenTexts?.forbiddenMessage ??
156
+ 'You do not have permission to view the import history for this group.';
157
+ return;
158
+ }
159
+ this.errorMessage =
160
+ this.screenTexts?.errorMessage ??
161
+ 'Unable to load import history. Please try again.';
162
+ if (error instanceof HttpErrorResponse) {
163
+ this.globalErrorHandlerService.handleError(error);
164
+ }
165
+ }
166
+ /**
167
+ * Defines the "Imported Files" table columns.
168
+ * @memberof RosterImportHistoryComponent
169
+ */
170
+ buildColumnSchema() {
171
+ const columns = this.screenTexts?.tableColumns;
172
+ this.columnSchema = [
173
+ {
174
+ id: 1,
175
+ columnDef: 'timestamp',
176
+ heading: columns?.timestamp ?? 'Timestamp',
177
+ columnType: TableColumnType.TEXT,
178
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
179
+ cellData: (element) => `${element.timestamp}`,
180
+ },
181
+ {
182
+ id: 2,
183
+ columnDef: 'personImported',
184
+ heading: columns?.personImported ?? 'Person Imported',
185
+ columnType: TableColumnType.TEXT,
186
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
187
+ cellData: (element) => `${element.personImported}`,
188
+ },
189
+ {
190
+ id: 3,
191
+ columnDef: 'fileName',
192
+ heading: columns?.fileName ?? 'File Name',
193
+ columnType: TableColumnType.TEXT,
194
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
195
+ cellData: (element) => `${element.fileName}`,
196
+ },
197
+ {
198
+ id: 4,
199
+ columnDef: 'addedRows',
200
+ heading: columns?.addedRows ?? 'Added Rows',
201
+ columnType: TableColumnType.TEXT,
202
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
203
+ cellData: (element) => `${element.addedRows}`,
204
+ },
205
+ {
206
+ id: 5,
207
+ columnDef: 'errors',
208
+ heading: columns?.errors ?? 'Errors',
209
+ columnType: TableColumnType.TEXT,
210
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
211
+ cellData: (element) => `${element.errors}`,
212
+ },
213
+ {
214
+ id: 6,
215
+ columnDef: 'targetGroup',
216
+ heading: columns?.targetGroup ?? 'Target Group',
217
+ columnType: TableColumnType.TEXT,
218
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
219
+ cellData: (element) => `${element.targetGroup}`,
220
+ },
221
+ ];
222
+ }
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterImportHistoryComponent, deps: [{ token: i1.RosterImportApiService }, { token: i2.GroupsService }, { token: i0.ChangeDetectorRef }, { token: i3.GlobalErrorHandlerService }], target: i0.ɵɵFactoryTarget.Component }); }
224
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RosterImportHistoryComponent, isStandalone: true, selector: "ieeesa-roster-import-history", inputs: { componentData: "componentData" }, ngImport: i0, template: "<div class=\"ieeesa-roster-import-history\">\r\n <!-- The \"\u2190 Back to Rosters / View History\" title row + X close are rendered\r\n by the shared ModalComponent above this. -->\r\n\r\n <!-- Group name heading (Figma: bold group name above the table). -->\r\n <p class=\"ieeesa-roster-import-history__group-name\">\r\n {{ groupName }}\r\n </p>\r\n\r\n <!-- \"Imported Files\" section title. -->\r\n <p class=\"ieeesa-roster-import-history__section-title\">\r\n {{ screenTexts?.importedFilesTitle ?? 'Imported Files' }}\r\n </p>\r\n\r\n <!-- Loading state -->\r\n <p\r\n *ngIf=\"isLoading\"\r\n class=\"ieeesa-roster-import-history__status\"\r\n role=\"status\"\r\n >\r\n {{ screenTexts?.loadingMessage ?? 'Loading import history...' }}\r\n </p>\r\n\r\n <!-- Error state -->\r\n <div\r\n *ngIf=\"!isLoading && errorMessage\"\r\n class=\"ieeesa-roster-import-history__error\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n\r\n <!-- Imported Files table (read-only). Shown once loaded without error. -->\r\n <ieeesa-data-table\r\n *ngIf=\"!isLoading && !errorMessage\"\r\n class=\"ieeesa-roster-import-history__table\"\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [isCellTextOverflowEllipsis]=\"true\"\r\n [className]=\"'ieeesa-roster-import-history-table'\"\r\n ></ieeesa-data-table>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.mat-mdc-dialog-content:has(>.ieeesa-roster-import-history),.mdc-dialog__content:has(>.ieeesa-roster-import-history),.mat-mdc-dialog-content:has(.ieeesa-roster-import-history),.mdc-dialog__content:has(.ieeesa-roster-import-history){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog{width:1100px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important;display:flex;align-items:center;gap:4px}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-roster-import-history{display:flex;flex-direction:column;gap:12px}.ieeesa-roster-import-history__group-name{margin:0;font-family:Calibri Bold,sans-serif;font-size:18px;font-weight:700;line-height:1.3;color:#1f2937}.ieeesa-roster-import-history__section-title{margin:0 -1.5em;padding:12px 1.5em;background-color:#f3f4f6;font-family:Calibri Bold,sans-serif;font-size:16px;font-weight:700;line-height:1.3;color:#1f2937}.ieeesa-roster-import-history__table{display:block}.ieeesa-roster-import-history__table .ieeesa-data-table__content{height:auto;max-height:none;overflow:visible}.ieeesa-roster-import-history__status{margin:8px 0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import-history__error{margin:8px 0;padding:12px 16px;border-radius:6px;background-color:#fdecec;border:1px solid #f5c2c2;font-family:Calibri Regular,sans-serif;font-size:14px;color:#b3261e}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }], encapsulation: i0.ViewEncapsulation.None }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RosterImportHistoryComponent, decorators: [{
227
+ type: Component,
228
+ args: [{ selector: 'ieeesa-roster-import-history', standalone: true, imports: [CommonModule, DataTableComponent], encapsulation: ViewEncapsulation.None, template: "<div class=\"ieeesa-roster-import-history\">\r\n <!-- The \"\u2190 Back to Rosters / View History\" title row + X close are rendered\r\n by the shared ModalComponent above this. -->\r\n\r\n <!-- Group name heading (Figma: bold group name above the table). -->\r\n <p class=\"ieeesa-roster-import-history__group-name\">\r\n {{ groupName }}\r\n </p>\r\n\r\n <!-- \"Imported Files\" section title. -->\r\n <p class=\"ieeesa-roster-import-history__section-title\">\r\n {{ screenTexts?.importedFilesTitle ?? 'Imported Files' }}\r\n </p>\r\n\r\n <!-- Loading state -->\r\n <p\r\n *ngIf=\"isLoading\"\r\n class=\"ieeesa-roster-import-history__status\"\r\n role=\"status\"\r\n >\r\n {{ screenTexts?.loadingMessage ?? 'Loading import history...' }}\r\n </p>\r\n\r\n <!-- Error state -->\r\n <div\r\n *ngIf=\"!isLoading && errorMessage\"\r\n class=\"ieeesa-roster-import-history__error\"\r\n role=\"alert\"\r\n >\r\n {{ errorMessage }}\r\n </div>\r\n\r\n <!-- Imported Files table (read-only). Shown once loaded without error. -->\r\n <ieeesa-data-table\r\n *ngIf=\"!isLoading && !errorMessage\"\r\n class=\"ieeesa-roster-import-history__table\"\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [isCellTextOverflowEllipsis]=\"true\"\r\n [className]=\"'ieeesa-roster-import-history-table'\"\r\n ></ieeesa-data-table>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.mat-mdc-dialog-content:has(>.ieeesa-roster-import-history),.mdc-dialog__content:has(>.ieeesa-roster-import-history),.mat-mdc-dialog-content:has(.ieeesa-roster-import-history),.mdc-dialog__content:has(.ieeesa-roster-import-history){max-height:none!important;min-height:320px!important;height:auto!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog{width:1100px!important;max-width:calc(100vw - 32px)!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal{box-shadow:0 4px 24px #00000080!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog [mat-dialog-content],.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-container .mdc-dialog__content,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-surface,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mdc-dialog__surface,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal,.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal>.ieeesa-label-lg-16{max-height:none!important;overflow:visible!important}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .ieeesa-modal-title{border-bottom:1px solid #e5e7eb;padding-bottom:16px;margin-bottom:16px!important;display:flex;align-items:center;gap:4px}.ieeesa-modal-dialog.ieeesa-roster-import-history-dialog .mat-mdc-dialog-content{min-height:0!important;padding:0!important}.ieeesa-roster-import-history{display:flex;flex-direction:column;gap:12px}.ieeesa-roster-import-history__group-name{margin:0;font-family:Calibri Bold,sans-serif;font-size:18px;font-weight:700;line-height:1.3;color:#1f2937}.ieeesa-roster-import-history__section-title{margin:0 -1.5em;padding:12px 1.5em;background-color:#f3f4f6;font-family:Calibri Bold,sans-serif;font-size:16px;font-weight:700;line-height:1.3;color:#1f2937}.ieeesa-roster-import-history__table{display:block}.ieeesa-roster-import-history__table .ieeesa-data-table__content{height:auto;max-height:none;overflow:visible}.ieeesa-roster-import-history__status{margin:8px 0;font-family:Calibri Regular,sans-serif;font-size:14px;color:#6f7782}.ieeesa-roster-import-history__error{margin:8px 0;padding:12px 16px;border-radius:6px;background-color:#fdecec;border:1px solid #f5c2c2;font-family:Calibri Regular,sans-serif;font-size:14px;color:#b3261e}\n"] }]
229
+ }], ctorParameters: function () { return [{ type: i1.RosterImportApiService }, { type: i2.GroupsService }, { type: i0.ChangeDetectorRef }, { type: i3.GlobalErrorHandlerService }]; }, propDecorators: { componentData: [{
230
+ type: Input
231
+ }] } });
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9zdGVyLWltcG9ydC1oaXN0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvbGliL2NvbXBvbmVudHMvcm9zdGVyLWltcG9ydC1oaXN0b3J5L3Jvc3Rlci1pbXBvcnQtaGlzdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL3Jvc3Rlci1pbXBvcnQtaGlzdG9yeS9yb3N0ZXItaW1wb3J0LWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxLQUFLLEVBR0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQ0wsa0JBQWtCLEVBR2xCLGVBQWUsR0FDaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUtsQyxPQUFPLEtBQUssU0FBUyxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7QUFZekQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQVNILE1BQU0sT0FBTyw0QkFBNEI7SUFvQ3ZDO0lBQ0UsMENBQTBDO0lBQ2xDLHNCQUE4QztJQUN0RCwwQ0FBMEM7SUFDbEMsWUFBMkI7SUFDbkMsMENBQTBDO0lBQ2xDLEdBQXNCO0lBQzlCLDBDQUEwQztJQUNsQyx5QkFBb0Q7UUFOcEQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUU5QyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUUzQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUV0Qiw4QkFBeUIsR0FBekIs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UTtnQkFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksUUFBUTtnQkFDcEMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxJQUFJO2dCQUNoQyw4REFBOEQ7Z0JBQzlELFFBQVEsRUFBRSxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO2FBQ2hEO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxJQUFJLGNBQWM7Z0JBQy9DLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSTtnQkFDaEMsOERBQThEO2dCQUM5RCxRQUFRLEVBQUUsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTthQUNyRDtTQUNGLENBQUM7SUFDSixDQUFDOytHQXBOVSw0QkFBNEI7bUdBQTVCLDRCQUE0QixvSUM1RHpDLHE3Q0EyQ0EsNnZXRFlZLFlBQVksbUlBQUUsa0JBQWtCOzs0RkFLL0IsNEJBQTRCO2tCQVJ4QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsaUJBRzVCLGlCQUFpQixDQUFDLElBQUk7aU5BSzVCLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0YVRhYmxlQ29tcG9uZW50LFxyXG4gIFRhYmxlQWN0aW9ucyxcclxuICBUYWJsZUNvbHVtblNjaGVtYSxcclxuICBUYWJsZUNvbHVtblR5cGUsXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHsgR2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gJ0BpZWVlc2EtbnBtL3V0aWxpdHknO1xyXG5pbXBvcnQgeyBSb3N0ZXJJbXBvcnRKb2IgfSBmcm9tICcuLi8uLi9tb2RlbHMvcm9zdGVyLWltcG9ydC5tb2RlbCc7XHJcbmltcG9ydCB7IFJvc3RlckltcG9ydEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3N0ZXItaW1wb3J0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JvdXBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dyb3Vwcy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKiogQSBzaW5nbGUgcm93IHNob3duIGluIHRoZSBcIkltcG9ydGVkIEZpbGVzXCIgdGFibGUuICovXHJcbmludGVyZmFjZSBSb3N0ZXJJbXBvcnRIaXN0b3J5Um93IHtcclxuICB0aW1lc3RhbXA6IHN0cmluZztcclxuICBwZXJzb25JbXBvcnRlZDogc3RyaW5nO1xyXG4gIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgYWRkZWRSb3dzOiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgZXJyb3JzOiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgdGFyZ2V0R3JvdXA6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFJvc3RlciBpbXBvcnQtaGlzdG9yeSAoXCJWaWV3IEhpc3RvcnlcIikgZGlhbG9nIGJvZHkuXHJcbiAqXHJcbiAqIFJlbmRlcmVkIGluc2lkZSB0aGUgc2hhcmVkIE1vZGFsQ29tcG9uZW50ICh3aGljaCBzdXBwbGllcyB0aGVcclxuICogXCLihpAgQmFjayB0byBSb3N0ZXJzIC8gVmlldyBIaXN0b3J5XCIgYnJlYWRjcnVtYiB0aXRsZSByb3cgKyBYIGNsb3NlKS4gU2hvd3MgdGhlXHJcbiAqIHNlbGVjdGVkIGdyb3VwJ3MgbmFtZSBhbmQgYW4gXCJJbXBvcnRlZCBGaWxlc1wiIHRhYmxlIGxpc3RpbmcgcHJpb3Igcm9zdGVyXHJcbiAqIGltcG9ydHMuXHJcbiAqXHJcbiAqIERhdGEgY29tZXMgZnJvbSB0aGUgcmVhbCBCRSBlbmRwb2ludCB2aWEge0BsaW5rIFJvc3RlckltcG9ydEFwaVNlcnZpY2V9OlxyXG4gKiBgR0VUIC92MS9ncm91cHMvcm9zdGVyL2ltcG9ydC9oaXN0b3J5L3tncm91cElkfWAuIFRoZSByZXNwb25zZSBpcyBhIGxpc3Qgb2ZcclxuICogYFJvc3RlckltcG9ydEpvYmAgd2hvc2UgSlNPTiB2aWV3IGV4cG9zZXMgYGZpbGVOYW1lYCwgYHN1Y2Nlc3NSb3dzYCxcclxuICogYGZhaWxlZFJvd3NgLCBgc3RhdHVzYCBhbmQgaWRzIOKAlCBidXQgTk9UIGBjcmVhdGVkT25gIC8gYGNyZWF0ZWRCeWAgKGJvdGggYXJlXHJcbiAqIGBASnNvbklnbm9yZWAgb24gdGhlIEJFIGVudGl0eSkuIFNvIHRoZSBcIlRpbWVzdGFtcFwiIGFuZCBcIlBlcnNvbiBJbXBvcnRlZFwiXHJcbiAqIGNvbHVtbnMgcmVuZGVyIGEgcGxhY2Vob2xkZXIgdW50aWwgdGhlIEJFIGV4cG9zZXMgdGhvc2UgZmllbGRzLiBcIlRhcmdldFxyXG4gKiBHcm91cFwiIHVzZXMgdGhlIGN1cnJlbnQgZ3JvdXAncyBuYW1lIChoaXN0b3J5IGlzIHNjb3BlZCB0byBvbmUgZ3JvdXApLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBSb3N0ZXJJbXBvcnRIaXN0b3J5Q29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2llZWVzYS1yb3N0ZXItaW1wb3J0LWhpc3RvcnknLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGF0YVRhYmxlQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcm9zdGVyLWltcG9ydC1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yb3N0ZXItaW1wb3J0LWhpc3RvcnkuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUm9zdGVySW1wb3J0SGlzdG9yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogQ2FycmllcyB0aGUgeyBncm91cElkLCBncm91cE5hbWUgfSBwYXlsb2FkIGZyb20gdGhlIG9wZW5pbmcgZGlhbG9nLiAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgQElucHV0KCkgY29tcG9uZW50RGF0YTogYW55O1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gY29uc3RhbnRzO1xyXG4gIHNjcmVlblRleHRzID0gdGhpcy5jb25zdGFudHM/LnJvc3RlckltcG9ydEhpc3Rvcnk7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvKiogVGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgXCJJbXBvcnRlZCBGaWxlc1wiIHRhYmxlLiAqL1xyXG4gIGNvbHVtblNjaGVtYTogVGFibGVDb2x1bW5TY2hlbWFbXSA9IFtdO1xyXG5cclxuICAvKiogSW1wb3J0LWhpc3Rvcnkgcm93cyBtYXBwZWQgZm9yIHRoZSB0YWJsZS4gKi9cclxuICB0YWJsZURhdGE6IFJvc3RlckltcG9ydEhpc3RvcnlSb3dbXSA9IFtdO1xyXG5cclxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgaGlzdG9yeSByZXF1ZXN0IGlzIGluIGZsaWdodC4gKi9cclxuICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIElubGluZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIGhpc3RvcnkgcmVxdWVzdCBmYWlscy4gKi9cclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogUmVhZC1vbmx5IHRhYmxlIOKAlCBubyBzZWFyY2ggLyBmaWx0ZXIgLyBhZGQgLyBlZGl0IC8gZGVsZXRlIGFjdGlvbnMuICovXHJcbiAgdGFibGVBY3Rpb25zOiBUYWJsZUFjdGlvbnMgPSB7XHJcbiAgICBpc1NlYXJjaE5lZWRlZDogZmFsc2UsXHJcbiAgICBpc0ZpbHRlck5lZWRlZDogZmFsc2UsXHJcbiAgICBpc0FkZE5lZWRlZDogZmFsc2UsXHJcbiAgICBpc0VkaXROZWVkZWQ6IGZhbHNlLFxyXG4gICAgaXNEZWxldGVOZWVkZWQ6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIC8qKiBQbGFjZWhvbGRlciBzaG93biBmb3IgZmllbGRzIHRoZSBCRSBkb2VzIG5vdCByZXR1cm4gKHRpbWVzdGFtcCAvIHBlcnNvbikuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbGFjZWhvbGRlciA9XHJcbiAgICB0aGlzLnNjcmVlblRleHRzPy5lbXB0eUZpZWxkUGxhY2Vob2xkZXIgPz8gJ+KAlCc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIHJvc3RlckltcG9ydEFwaVNlcnZpY2U6IFJvc3RlckltcG9ydEFwaVNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgZ3JvdXBTZXJ2aWNlOiBHcm91cHNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgZ2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZTogR2xvYmFsRXJyb3JIYW5kbGVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqIFRoZSBncm91cCBuYW1lIHNob3duIGFzIHRoZSBoZWFkaW5nIGFib3ZlIHRoZSBJbXBvcnRlZCBGaWxlcyB0YWJsZS4gKi9cclxuICBnZXQgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmNvbXBvbmVudERhdGE/Lmdyb3VwTmFtZSA/P1xyXG4gICAgICB0aGlzLmdyb3VwU2VydmljZT8uZ2V0U2VsZWN0ZWRHcm91cEluZm8oKT8uZ3JvdXBOYW1lID8/XHJcbiAgICAgICcnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBncm91cCBpZCB3aG9zZSBoaXN0b3J5IGlzIGZldGNoZWQuICovXHJcbiAgcHJpdmF0ZSBnZXQgZ3JvdXBJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb21wb25lbnREYXRhPy5ncm91cElkID8/XHJcbiAgICAgICh0aGlzLmdyb3VwU2VydmljZT8uZ2V0U2VsZWN0ZWRHcm91cEluZm8oKT8uZ3JvdXBJZCBhcyBzdHJpbmcpID8/XHJcbiAgICAgICcnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSB0YWJsZSBzY2hlbWEgYW5kIGxvYWRzIHRoZSBpbXBvcnQgaGlzdG9yeSBmcm9tIHRoZSBCRS5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0SGlzdG9yeUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5idWlsZENvbHVtblNjaGVtYSgpO1xyXG4gICAgdGhpcy5yb3N0ZXJJbXBvcnRBcGlTZXJ2aWNlLnNldEFwaUJhc2VVcmwodGhpcy5ncm91cFNlcnZpY2U/LmFwaUJhc2VVcmwpO1xyXG4gICAgdGhpcy5sb2FkSW1wb3J0SGlzdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYW5zIHVwIHN1YnNjcmlwdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cclxuICAgKiBAbWVtYmVyb2YgUm9zdGVySW1wb3J0SGlzdG9yeUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0aGUgaW1wb3J0IGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IGdyb3VwIGFuZCBtYXBzIGl0IHRvIHRhYmxlIHJvd3MuXHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydEhpc3RvcnlDb21wb25lbnRcclxuICAgKi9cclxuICBsb2FkSW1wb3J0SGlzdG9yeSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ncm91cElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgIHRoaXMucm9zdGVySW1wb3J0QXBpU2VydmljZVxyXG4gICAgICAuZ2V0SW1wb3J0SGlzdG9yeSh0aGlzLmdyb3VwSWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGpvYnM6IFJvc3RlckltcG9ydEpvYltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IChqb2JzID8/IFtdKS5tYXAoKGpvYikgPT4gdGhpcy5tYXBKb2JUb1Jvdyhqb2IpKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBhIEJFIGltcG9ydCBqb2IgdG8gYSB0YWJsZSByb3cuIFRpbWVzdGFtcCBhbmQgUGVyc29uIEltcG9ydGVkIGFyZSBub3RcclxuICAgKiBwcmVzZW50IGluIHRoZSByZXNwb25zZSAoQkUgYEBKc29uSWdub3JlYCksIHNvIHRoZXkgcmVuZGVyIGEgcGxhY2Vob2xkZXIuXHJcbiAgICogVGFyZ2V0IEdyb3VwIHVzZXMgdGhlIGN1cnJlbnQgZ3JvdXAncyBuYW1lIChoaXN0b3J5IGlzIHBlci1ncm91cCkuXHJcbiAgICogQHBhcmFtIHtSb3N0ZXJJbXBvcnRKb2J9IGpvYiAtIFRoZSBCRSBpbXBvcnQgam9iLlxyXG4gICAqIEByZXR1cm4ge1Jvc3RlckltcG9ydEhpc3RvcnlSb3d9XHJcbiAgICogQG1lbWJlcm9mIFJvc3RlckltcG9ydEhpc3RvcnlDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIG1hcEpvYlRvUm93KGpvYjogUm9zdGVySW1wb3J0Sm9iKTogUm9zdGVySW1wb3J0SGlzdG9yeVJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aW1lc3RhbXA6IHRoaXMucGxhY2Vob2xkZXIsXHJcbiAgICAgIHBlcnNvbkltcG9ydGVkOiB0aGlzLnBsYWNlaG9sZGVyLFxyXG4gICAgICBmaWxlTmFtZTogam9iPy5maWxlTmFtZSA/PyB0aGlzLnBsYWNlaG9sZGVyLFxyXG4gICAgICBhZGRlZFJvd3M6IGpvYj8uc3VjY2Vzc1Jvd3MgPz8gMCxcclxuICAgICAgZXJyb3JzOiBqb2I/LmZhaWxlZFJvd3MgPz8gMCxcclxuICAgICAgdGFyZ2V0R3JvdXA6IHRoaXMuZ3JvdXBOYW1lIHx8IHRoaXMucGxhY2Vob2xkZXIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFwcyBhIGZhaWxlZCBoaXN0b3J5IHJlcXVlc3QgdG8gYSB1c2VyLWZhY2luZyBpbmxpbmUgZXJyb3IgbWVzc2FnZS5cclxuICAgKiBBIDQwMyBnZXRzIHRoZSBwZXJtaXNzaW9uLXNwZWNpZmljIG1lc3NhZ2U7IG90aGVyIGVycm9ycyBnZXQgdGhlIGdlbmVyaWNcclxuICAgKiBvbmUgYW5kIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBoYW5kbGVyIGZvciBsb2dnaW5nL2ludGVyY2VwdG9ycy5cclxuICAgKiBAcGFyYW0geyp9IGVycm9yIC0gVGhlIEh0dHBFcnJvclJlc3BvbnNlLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRIaXN0b3J5Q29tcG9uZW50XHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvcj8uc3RhdHVzID8/IGVycm9yPy5lcnJvcj8uc3RhdHVzO1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgICB0aGlzLnNjcmVlblRleHRzPy5mb3JiaWRkZW5NZXNzYWdlID8/XHJcbiAgICAgICAgJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgdGhlIGltcG9ydCBoaXN0b3J5IGZvciB0aGlzIGdyb3VwLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID1cclxuICAgICAgdGhpcy5zY3JlZW5UZXh0cz8uZXJyb3JNZXNzYWdlID8/XHJcbiAgICAgICdVbmFibGUgdG8gbG9hZCBpbXBvcnQgaGlzdG9yeS4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xyXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgdGhpcy5nbG9iYWxFcnJvckhhbmRsZXJTZXJ2aWNlLmhhbmRsZUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIFwiSW1wb3J0ZWQgRmlsZXNcIiB0YWJsZSBjb2x1bW5zLlxyXG4gICAqIEBtZW1iZXJvZiBSb3N0ZXJJbXBvcnRIaXN0b3J5Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZENvbHVtblNjaGVtYSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLnNjcmVlblRleHRzPy50YWJsZUNvbHVtbnM7XHJcbiAgICB0aGlzLmNvbHVtblNjaGVtYSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIGNvbHVtbkRlZjogJ3RpbWVzdGFtcCcsXHJcbiAgICAgICAgaGVhZGluZzogY29sdW1ucz8udGltZXN0YW1wID8/ICdUaW1lc3RhbXAnLFxyXG4gICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5URVhULFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgY2VsbERhdGE6IChlbGVtZW50OiBhbnkpID0+IGAke2VsZW1lbnQudGltZXN0YW1wfWAsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogMixcclxuICAgICAgICBjb2x1bW5EZWY6ICdwZXJzb25JbXBvcnRlZCcsXHJcbiAgICAgICAgaGVhZGluZzogY29sdW1ucz8ucGVyc29uSW1wb3J0ZWQgPz8gJ1BlcnNvbiBJbXBvcnRlZCcsXHJcbiAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBjZWxsRGF0YTogKGVsZW1lbnQ6IGFueSkgPT4gYCR7ZWxlbWVudC5wZXJzb25JbXBvcnRlZH1gLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IDMsXHJcbiAgICAgICAgY29sdW1uRGVmOiAnZmlsZU5hbWUnLFxyXG4gICAgICAgIGhlYWRpbmc6IGNvbHVtbnM/LmZpbGVOYW1lID8/ICdGaWxlIE5hbWUnLFxyXG4gICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5URVhULFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgY2VsbERhdGE6IChlbGVtZW50OiBhbnkpID0+IGAke2VsZW1lbnQuZmlsZU5hbWV9YCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiA0LFxyXG4gICAgICAgIGNvbHVtbkRlZjogJ2FkZGVkUm93cycsXHJcbiAgICAgICAgaGVhZGluZzogY29sdW1ucz8uYWRkZWRSb3dzID8/ICdBZGRlZCBSb3dzJyxcclxuICAgICAgICBjb2x1bW5UeXBlOiBUYWJsZUNvbHVtblR5cGUuVEVYVCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGNlbGxEYXRhOiAoZWxlbWVudDogYW55KSA9PiBgJHtlbGVtZW50LmFkZGVkUm93c31gLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IDUsXHJcbiAgICAgICAgY29sdW1uRGVmOiAnZXJyb3JzJyxcclxuICAgICAgICBoZWFkaW5nOiBjb2x1bW5zPy5lcnJvcnMgPz8gJ0Vycm9ycycsXHJcbiAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBjZWxsRGF0YTogKGVsZW1lbnQ6IGFueSkgPT4gYCR7ZWxlbWVudC5lcnJvcnN9YCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiA2LFxyXG4gICAgICAgIGNvbHVtbkRlZjogJ3RhcmdldEdyb3VwJyxcclxuICAgICAgICBoZWFkaW5nOiBjb2x1bW5zPy50YXJnZXRHcm91cCA/PyAnVGFyZ2V0IEdyb3VwJyxcclxuICAgICAgICBjb2x1bW5UeXBlOiBUYWJsZUNvbHVtblR5cGUuVEVYVCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGNlbGxEYXRhOiAoZWxlbWVudDogYW55KSA9PiBgJHtlbGVtZW50LnRhcmdldEdyb3VwfWAsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnQtaGlzdG9yeVwiPlxyXG4gIDwhLS0gVGhlIFwi4oaQIEJhY2sgdG8gUm9zdGVycyAvIFZpZXcgSGlzdG9yeVwiIHRpdGxlIHJvdyArIFggY2xvc2UgYXJlIHJlbmRlcmVkXHJcbiAgICAgICBieSB0aGUgc2hhcmVkIE1vZGFsQ29tcG9uZW50IGFib3ZlIHRoaXMuIC0tPlxyXG5cclxuICA8IS0tIEdyb3VwIG5hbWUgaGVhZGluZyAoRmlnbWE6IGJvbGQgZ3JvdXAgbmFtZSBhYm92ZSB0aGUgdGFibGUpLiAtLT5cclxuICA8cCBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0LWhpc3RvcnlfX2dyb3VwLW5hbWVcIj5cclxuICAgIHt7IGdyb3VwTmFtZSB9fVxyXG4gIDwvcD5cclxuXHJcbiAgPCEtLSBcIkltcG9ydGVkIEZpbGVzXCIgc2VjdGlvbiB0aXRsZS4gLS0+XHJcbiAgPHAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydC1oaXN0b3J5X19zZWN0aW9uLXRpdGxlXCI+XHJcbiAgICB7eyBzY3JlZW5UZXh0cz8uaW1wb3J0ZWRGaWxlc1RpdGxlID8/ICdJbXBvcnRlZCBGaWxlcycgfX1cclxuICA8L3A+XHJcblxyXG4gIDwhLS0gTG9hZGluZyBzdGF0ZSAtLT5cclxuICA8cFxyXG4gICAgKm5nSWY9XCJpc0xvYWRpbmdcIlxyXG4gICAgY2xhc3M9XCJpZWVlc2Etcm9zdGVyLWltcG9ydC1oaXN0b3J5X19zdGF0dXNcIlxyXG4gICAgcm9sZT1cInN0YXR1c1wiXHJcbiAgPlxyXG4gICAge3sgc2NyZWVuVGV4dHM/LmxvYWRpbmdNZXNzYWdlID8/ICdMb2FkaW5nIGltcG9ydCBoaXN0b3J5Li4uJyB9fVxyXG4gIDwvcD5cclxuXHJcbiAgPCEtLSBFcnJvciBzdGF0ZSAtLT5cclxuICA8ZGl2XHJcbiAgICAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgZXJyb3JNZXNzYWdlXCJcclxuICAgIGNsYXNzPVwiaWVlZXNhLXJvc3Rlci1pbXBvcnQtaGlzdG9yeV9fZXJyb3JcIlxyXG4gICAgcm9sZT1cImFsZXJ0XCJcclxuICA+XHJcbiAgICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBJbXBvcnRlZCBGaWxlcyB0YWJsZSAocmVhZC1vbmx5KS4gU2hvd24gb25jZSBsb2FkZWQgd2l0aG91dCBlcnJvci4gLS0+XHJcbiAgPGllZWVzYS1kYXRhLXRhYmxlXHJcbiAgICAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgIWVycm9yTWVzc2FnZVwiXHJcbiAgICBjbGFzcz1cImllZWVzYS1yb3N0ZXItaW1wb3J0LWhpc3RvcnlfX3RhYmxlXCJcclxuICAgIFt0YWJsZURhdGFJbmZvXT1cInRhYmxlRGF0YVwiXHJcbiAgICBbY29sdW1uU2NoZW1hSW5mb109XCJjb2x1bW5TY2hlbWFcIlxyXG4gICAgW3RhYmxlQWN0aW9uc109XCJ0YWJsZUFjdGlvbnNcIlxyXG4gICAgW2lzQ2VsbFRleHRPdmVyZmxvd0VsbGlwc2lzXT1cInRydWVcIlxyXG4gICAgW2NsYXNzTmFtZV09XCInaWVlZXNhLXJvc3Rlci1pbXBvcnQtaGlzdG9yeS10YWJsZSdcIlxyXG4gID48L2llZWVzYS1kYXRhLXRhYmxlPlxyXG48L2Rpdj5cclxuIl19