@fagon/ngx-intellitoolx 16.0.3 → 16.0.5

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 (26) hide show
  1. package/README.md +277 -7
  2. package/esm2022/lib/form-changes/can-component-deactivate.interface.mjs +2 -0
  3. package/esm2022/lib/form-changes/confirm-handler.type.mjs +2 -0
  4. package/esm2022/lib/form-changes/form-changes-tracker.service.mjs +47 -0
  5. package/esm2022/lib/form-changes/form-update-message-config.interface.mjs +2 -0
  6. package/esm2022/lib/form-changes/form-update-message.component.mjs +53 -0
  7. package/esm2022/lib/form-changes/unsaved-changes.guard.mjs +29 -0
  8. package/esm2022/lib/form-errors/form-errors.component.mjs +3 -3
  9. package/esm2022/lib/helpers/intellitoolx.helper.mjs +2 -3
  10. package/esm2022/public-api.mjs +15 -14
  11. package/fesm2022/fagon-ngx-intellitoolx.mjs +188 -136
  12. package/fesm2022/fagon-ngx-intellitoolx.mjs.map +1 -1
  13. package/lib/form-changes/can-component-deactivate.interface.d.ts +5 -0
  14. package/lib/form-changes/form-changes-tracker.service.d.ts +12 -0
  15. package/lib/{form-update → form-changes}/unsaved-changes.guard.d.ts +5 -5
  16. package/lib/form-errors/form-errors.component.d.ts +1 -1
  17. package/lib/helpers/intellitoolx.helper.d.ts +1 -1
  18. package/package.json +1 -1
  19. package/public-api.d.ts +11 -9
  20. package/esm2022/lib/form-update/confirm-handler.type.mjs +0 -2
  21. package/esm2022/lib/form-update/form-update-message-config.interface.mjs +0 -2
  22. package/esm2022/lib/form-update/form-update-message.component.mjs +0 -53
  23. package/esm2022/lib/form-update/unsaved-changes.guard.mjs +0 -19
  24. /package/lib/{form-update → form-changes}/confirm-handler.type.d.ts +0 -0
  25. /package/lib/{form-update → form-changes}/form-update-message-config.interface.d.ts +0 -0
  26. /package/lib/{form-update → form-changes}/form-update-message.component.d.ts +0 -0
package/README.md CHANGED
@@ -1,10 +1,15 @@
1
1
  # IntelliToolx
2
2
 
3
+ ![npm version](https://img.shields.io/npm/v/@fagon/ngx-intellittolx.svg)
4
+ ![npm downloads](https://img.shields.io/npm/dm/@fagon/ngx-intellittolx.svg)
5
+ ![bundle size](https://img.shields.io/bundlephobia/minzip/@fagon/ngx-intellittolx)
3
6
  ![Angular](https://img.shields.io/badge/Angular-14%2B-red)
4
- ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue)
5
- ![License](https://img.shields.io/badge/License-MIT-green)
7
+ ![TypeScript](https://img.shields.io/badge/TypeScript-ready-blue)
8
+ ![License](https://img.shields.io/npm/l/@fagon/ngx-chronox)
6
9
  ![Reactive Forms](https://img.shields.io/badge/Reactive%20Forms-Supported-orange)
7
10
  ![Standalone Components](https://img.shields.io/badge/Standalone-Compatible-purple)
11
+ ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)
12
+ ![Made with Love](https://img.shields.io/badge/made%20with-❤-red)
8
13
 
9
14
  ## Overview
10
15
 
@@ -17,7 +22,7 @@ Built with scalability, accessibility, and maintainability in mind, IntelliToolx
17
22
  ### Installation
18
23
 
19
24
  ```bash
20
- npm install intellitoolx
25
+ npm intall @fagon/ngx-intellitoolx
21
26
  ```
22
27
 
23
28
  # IntelliToolxHelper
@@ -562,7 +567,7 @@ The component includes built-in messages for common validators:
562
567
  | maxMonthYear | Date is later than allowed |
563
568
  | minMonthYear | Date is earlier than allowed |
564
569
  | exceededAllowedDateDifference | Date difference can only be one month |
565
- | exceededLeastDateAllowed | Start date cannot be greater than end date |
570
+ | startDateAfterEndDate | Start date cannot be greater than end date |
566
571
 
567
572
  ### Adding Control Labels (User-Friendly Messages)
568
573
 
@@ -1124,7 +1129,7 @@ These validators return error keys compatible with the error component:
1124
1129
  | passwordMismatchValidator | passwordMismatch |
1125
1130
  | uniqueEmailsValidator | duplicateEmail |
1126
1131
 
1127
- Best Practices
1132
+ ** Best Practices **
1128
1133
 
1129
1134
  - Use with Reactive Forms only
1130
1135
  - Combine with required validators when necessary
@@ -1141,5 +1146,270 @@ this.form = new FormGroup({
1141
1146
  });
1142
1147
  ```
1143
1148
 
1144
- License
1145
- MIT
1149
+ # Unsaved Changes Protection
1150
+
1151
+ Protect Angular routes and modals from accidental navigation or closing when there are unsaved changes.
1152
+
1153
+ Supports:
1154
+
1155
+ - Angular route navigation
1156
+ - Browser back button
1157
+ - Browser refresh / tab close
1158
+ - Modal close (NG Bootstrap / Material / custom)
1159
+ - Parent + child component setups
1160
+ - Nested forms
1161
+
1162
+ ** The system is built around three core pieces: **
1163
+
1164
+ - UnsavedChangesTrackerService
1165
+ - UnsavedChangesGuard
1166
+ - CanComponentDeactivate interface (for route protection)
1167
+
1168
+ ** Architecture: **
1169
+
1170
+ ```
1171
+ Form → TrackerService → Guard → Confirmation → Continue / Block
1172
+ ```
1173
+
1174
+ The library does NOT depend on your UI layer.
1175
+ Your app controls the confirmation modal.
1176
+
1177
+ ### Core Exports
1178
+
1179
+ ```ts
1180
+ import { UnsavedChangesTrackerService, UnsavedChangesGuard, CanComponentDeactivate } from "ngx-intellitoolx";
1181
+ ```
1182
+
1183
+ ### Protecting Angular Routes
1184
+
1185
+ Add Guard to Route
1186
+
1187
+ ```ts
1188
+ {
1189
+ path: 'add-item',
1190
+ component: AddItemPageComponent,
1191
+ canDeactivate: [UnsavedChangesGuard]
1192
+ }
1193
+ ```
1194
+
1195
+ ### Implement Route Component
1196
+
1197
+ Your routed component must implement CanComponentDeactivate.
1198
+
1199
+ ```ts
1200
+ import { UnsavedChangesTrackerService } from "ngx-intellitoolx";
1201
+ import { UtilityService } from "../services/utility.service";
1202
+
1203
+ @Component({
1204
+ selector: "app-add-item-page",
1205
+ template: `<app-item-form></app-item-form>`,
1206
+ })
1207
+ export class AddItemPageComponent implements CanComponentDeactivate {
1208
+ constructor(
1209
+ private tracker: UnsavedChangesTrackerService,
1210
+ private utils: UtilityService,
1211
+ ) {}
1212
+
1213
+ confirmUnsavedChanges(): Promise<boolean> {
1214
+ return this.utils.confirmUnsavedChanges();
1215
+ }
1216
+ }
1217
+ ```
1218
+
1219
+ ### Track Form Changes (Child Component)
1220
+
1221
+ ```ts
1222
+ @Component({
1223
+ selector: "app-item-form",
1224
+ templateUrl: "./item-form.component.html",
1225
+ })
1226
+ export class ItemFormComponent implements OnInit {
1227
+ form!: FormGroup;
1228
+
1229
+ constructor(
1230
+ private fb: FormBuilder,
1231
+ private tracker: UnsavedChangesTrackerService,
1232
+ ) {}
1233
+
1234
+ ngOnInit(): void {
1235
+ this.form = this.fb.group({
1236
+ name: [""],
1237
+ description: [""],
1238
+ });
1239
+
1240
+ this.tracker.register(this.form);
1241
+ }
1242
+
1243
+ save(): void {
1244
+ // API call
1245
+ this.tracker.markAsPristine();
1246
+ this.form.markAsPristine();
1247
+ }
1248
+ }
1249
+ ```
1250
+
1251
+ ### Protecting Browser Refresh / Tab Close
1252
+
1253
+ Add this inside the routed component:
1254
+
1255
+ ```ts
1256
+ private unregister?: () => void;
1257
+
1258
+ constructor(
1259
+ private tracker: FormChangesTrackerService,
1260
+ public utilservice: UtilityService
1261
+ ) {
1262
+ super();
1263
+ }
1264
+
1265
+ ngOnInit() {
1266
+ this.unregister = IntelliToolxHelper.registerBeforeUnload(() =>
1267
+ this.tracker.hasChanges(),
1268
+ );
1269
+ }
1270
+
1271
+ confirmUnsavedChanges(): Promise<boolean> {
1272
+ return this.utilservice.confirmUnsavedChanges();
1273
+ }
1274
+
1275
+ ngOnDestroy() {
1276
+ this.unregister?.();
1277
+ }
1278
+ ```
1279
+
1280
+ ### Protecting Modals (NG Bootstrap Example)
1281
+
1282
+ Route guards do NOT protect modals.
1283
+ You must intercept modal close manually.
1284
+
1285
+ Modal Form Component
1286
+
1287
+ ```ts
1288
+ import { NgbActiveModal } from "@ng-bootstrap/ng-bootstrap";
1289
+ import { UnsavedChangesTrackerService } from "ngx-intellitoolx";
1290
+ import { UtilityService } from "../utility.service";
1291
+
1292
+ @Component({
1293
+ selector: "app-item-modal",
1294
+ templateUrl: "./item-modal.component.html",
1295
+ })
1296
+ export class ItemModalComponent implements OnInit {
1297
+ form!: FormGroup;
1298
+
1299
+ constructor(
1300
+ private fb: FormBuilder,
1301
+ private tracker: UnsavedChangesTrackerService,
1302
+ private utils: UtilityService,
1303
+ public activeModal: NgbActiveModal,
1304
+ ) {}
1305
+
1306
+ ngOnInit(): void {
1307
+ this.form = this.fb.group({
1308
+ name: [""],
1309
+ description: [""],
1310
+ });
1311
+
1312
+ this.form.valueChanges.subscribe(() => {
1313
+ if (this.form.dirty) {
1314
+ this.tracker.markAsDirty();
1315
+ }
1316
+ });
1317
+ }
1318
+
1319
+ async closeModal() {
1320
+ if (this.tracker.hasChanges()) {
1321
+ const confirmed = await this.utils.confirmUnsavedChanges();
1322
+
1323
+ if (!confirmed) {
1324
+ return; // cancel close
1325
+ }
1326
+ }
1327
+
1328
+ this.activeModal.dismiss();
1329
+ }
1330
+
1331
+ save(): void {
1332
+ this.tracker.markAsPristine();
1333
+ this.form.markAsPristine();
1334
+ this.activeModal.close("saved");
1335
+ }
1336
+ }
1337
+ ```
1338
+
1339
+ ### Modal Template
1340
+
1341
+ ```html
1342
+ <div class="modal-header">
1343
+ <h5 class="modal-title">Add Item</h5>
1344
+ <button type="button" class="btn-close" (click)="closeModal()"></button>
1345
+ </div>
1346
+
1347
+ <div class="modal-body">
1348
+ <form [formGroup]="form">
1349
+ <input formControlName="name" />
1350
+ <textarea formControlName="description"></textarea>
1351
+ </form>
1352
+ </div>
1353
+
1354
+ <div class="modal-footer">
1355
+ <button class="btn btn-secondary" (click)="closeModal()">Cancel</button>
1356
+
1357
+ <button class="btn btn-primary" (click)="save()">Save</button>
1358
+ </div>
1359
+ ```
1360
+
1361
+ ** How It Works **
1362
+
1363
+ | Action | What Happens |
1364
+ | -------------------- | --------------------- |
1365
+ | User edits form | Tracker marks dirty |
1366
+ | User navigates route | Guard checks tracker |
1367
+ | User refreshes page | beforeunload triggers |
1368
+ | User closes modal | Manual interception |
1369
+ | User saves form | Tracker resets |
1370
+
1371
+ ** Parent + Child Structure **
1372
+
1373
+ If your form is nested:
1374
+
1375
+ ```
1376
+ RouteComponent
1377
+ └── Modal
1378
+ └── Form
1379
+
1380
+ Child form → marks tracker dirty
1381
+
1382
+ Route component → implements guard interface
1383
+
1384
+ Modal → manually checks tracker before close
1385
+ ```
1386
+
1387
+ ** Best Practices **
1388
+
1389
+ - Always call markAsPristine() after successful save
1390
+ - Always intercept modal close
1391
+ - Keep confirmation UI inside the consuming app
1392
+ - Do not couple library to UI services
1393
+
1394
+ ** Confirmation Modal Example (App Layer) **
1395
+
1396
+ ```ts
1397
+ @Injectable({ providedIn: "root" })
1398
+ export class UtilityService {
1399
+ constructor(private modal: NgbModal) {}
1400
+
1401
+ confirmUnsavedChanges(): Promise<boolean> {
1402
+ const modalRef = this.modal.open(UnsavedConfirmComponent, {
1403
+ backdrop: "static",
1404
+ });
1405
+
1406
+ return modalRef.result.then(() => true).catch(() => false);
1407
+ }
1408
+ }
1409
+ ```
1410
+
1411
+ 📄 License
1412
+
1413
+ ```
1414
+ MIT © Fagon Technologies
1415
+ ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuLWNvbXBvbmVudC1kZWFjdGl2YXRlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZm9ybS1jaGFuZ2VzL2Nhbi1jb21wb25lbnQtZGVhY3RpdmF0ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSB7XG4gIGhhc1Vuc2F2ZWRDaGFuZ2VzOiAoKSA9PiBib29sZWFuO1xuICBjb25maXJtVW5zYXZlZENoYW5nZXM/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgZ2V0VW5zYXZlZE1lc3NhZ2U/OiAoKSA9PiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1oYW5kbGVyLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0tY2hhbmdlcy9jb25maXJtLWhhbmRsZXIudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29uZmlybUhhbmRsZXIgPSAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcbiJdfQ==
@@ -0,0 +1,47 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { IntelliToolxHelper } from '../helpers/intellitoolx.helper';
3
+ import * as i0 from "@angular/core";
4
+ export class FormChangesTrackerService {
5
+ constructor() {
6
+ this.trackedForms = new Map();
7
+ }
8
+ register(form) {
9
+ const currentRawValue = form.getRawValue?.() ?? form.value;
10
+ this.trackedForms.set(form, {
11
+ initialValue: IntelliToolxHelper.clone(currentRawValue),
12
+ });
13
+ form.markAsPristine();
14
+ }
15
+ hasChanges() {
16
+ // We iterate over entries [form, metadata]
17
+ for (const [form, { initialValue }] of this.trackedForms.entries()) {
18
+ if (IntelliToolxHelper.formHasChanges(initialValue, form)) {
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ }
24
+ unregister(form) {
25
+ this.trackedForms.delete(form);
26
+ }
27
+ reset(form) {
28
+ const entry = this.trackedForms.get(form);
29
+ if (!entry)
30
+ return;
31
+ const currentRawValue = form.getRawValue?.() ?? form.value;
32
+ entry.initialValue = IntelliToolxHelper.clone(currentRawValue);
33
+ form.markAsPristine();
34
+ }
35
+ clearAll() {
36
+ this.trackedForms.clear();
37
+ }
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormChangesTrackerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
39
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormChangesTrackerService, providedIn: 'root' }); }
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormChangesTrackerService, decorators: [{
42
+ type: Injectable,
43
+ args: [{
44
+ providedIn: 'root',
45
+ }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jaGFuZ2VzLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZm9ybS1jaGFuZ2VzL2Zvcm0tY2hhbmdlcy10cmFja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFNcEUsTUFBTSxPQUFPLHlCQUF5QjtJQUh0QztRQUlVLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBSzNCLENBQUM7S0F1Q0w7SUFyQ0MsUUFBUSxDQUFDLElBQXFCO1FBQzVCLE1BQU0sZUFBZSxHQUFJLElBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzFCLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1NBQ3hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNSLDJDQUEyQztRQUMzQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEUsSUFBSSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUN6RCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBcUI7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFxQjtRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsTUFBTSxlQUFlLEdBQUksSUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwRSxLQUFLLENBQUMsWUFBWSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7K0dBNUNVLHlCQUF5QjttSEFBekIseUJBQXlCLGNBRnhCLE1BQU07OzRGQUVQLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlbGxpVG9vbHhIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2ludGVsbGl0b29seC5oZWxwZXInO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNoYW5nZXNUcmFja2VyU2VydmljZSB7XG4gIHByaXZhdGUgdHJhY2tlZEZvcm1zID0gbmV3IE1hcDxcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAge1xuICAgICAgaW5pdGlhbFZhbHVlOiBhbnk7XG4gICAgfVxuICA+KCk7XG5cbiAgcmVnaXN0ZXIoZm9ybTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgY29uc3QgY3VycmVudFJhd1ZhbHVlID0gKGZvcm0gYXMgYW55KS5nZXRSYXdWYWx1ZT8uKCkgPz8gZm9ybS52YWx1ZTtcblxuICAgIHRoaXMudHJhY2tlZEZvcm1zLnNldChmb3JtLCB7XG4gICAgICBpbml0aWFsVmFsdWU6IEludGVsbGlUb29seEhlbHBlci5jbG9uZShjdXJyZW50UmF3VmFsdWUpLFxuICAgIH0pO1xuXG4gICAgZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICB9XG5cbiAgaGFzQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICAvLyBXZSBpdGVyYXRlIG92ZXIgZW50cmllcyBbZm9ybSwgbWV0YWRhdGFdXG4gICAgZm9yIChjb25zdCBbZm9ybSwgeyBpbml0aWFsVmFsdWUgfV0gb2YgdGhpcy50cmFja2VkRm9ybXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoSW50ZWxsaVRvb2x4SGVscGVyLmZvcm1IYXNDaGFuZ2VzKGluaXRpYWxWYWx1ZSwgZm9ybSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIoZm9ybTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgdGhpcy50cmFja2VkRm9ybXMuZGVsZXRlKGZvcm0pO1xuICB9XG5cbiAgcmVzZXQoZm9ybTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnRyYWNrZWRGb3Jtcy5nZXQoZm9ybSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFJhd1ZhbHVlID0gKGZvcm0gYXMgYW55KS5nZXRSYXdWYWx1ZT8uKCkgPz8gZm9ybS52YWx1ZTtcbiAgICBlbnRyeS5pbml0aWFsVmFsdWUgPSBJbnRlbGxpVG9vbHhIZWxwZXIuY2xvbmUoY3VycmVudFJhd1ZhbHVlKTtcblxuICAgIGZvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgfVxuXG4gIGNsZWFyQWxsKCkge1xuICAgIHRoaXMudHJhY2tlZEZvcm1zLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS11cGRhdGUtbWVzc2FnZS1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9mb3JtLWNoYW5nZXMvZm9ybS11cGRhdGUtbWVzc2FnZS1jb25maWcuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEludGVsbGl0b29seEZvcm1VcGRhdGVNZXNzYWdlQ29uZmlnIHtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICB0ZXh0Q29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlckNvbG9yPzogc3RyaW5nO1xuICBmb250V2VpZ2h0PzogbnVtYmVyO1xuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XG4gIHBhZGRpbmc/OiBzdHJpbmc7XG4gIGljb25BbmRNZXNzYWdlR2FwPzogc3RyaW5nO1xuICBpY29uU2l6ZT86IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class IntellitoolxFormUpdateMessage {
6
+ constructor() {
7
+ this.defaultMessage = 'There are no changes to save. Please modify a field to continue.';
8
+ }
9
+ get containerStyles() {
10
+ return {
11
+ padding: this.itxFormUpdateMessageConfig?.padding || '1rem',
12
+ gap: this.itxFormUpdateMessageConfig?.iconAndMessageGap || '0.5rem',
13
+ color: this.itxFormUpdateMessageConfig?.textColor || '#963C00',
14
+ border: '1px solid ' +
15
+ (this.itxFormUpdateMessageConfig?.borderColor || '#f3cd5a'),
16
+ 'background-color': this.itxFormUpdateMessageConfig?.backgroundColor || '#fff3cd',
17
+ 'font-weight': String(this.itxFormUpdateMessageConfig?.fontWeight || 400),
18
+ 'border-radius': this.itxFormUpdateMessageConfig?.borderRadius || '0.5rem',
19
+ };
20
+ }
21
+ get iconStyles() {
22
+ return {
23
+ 'font-size': this.itxFormUpdateMessageConfig?.iconSize || '1rem',
24
+ };
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IntellitoolxFormUpdateMessage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: IntellitoolxFormUpdateMessage, isStandalone: true, selector: "itx-form-update-message", inputs: { itxFormUpdateMessageConfig: "itxFormUpdateMessageConfig" }, ngImport: i0, template: `
28
+ <div class="form-update-message" role="alert" [ngStyle]="containerStyles">
29
+ <span class="form-update-icon" aria-hidden="true" [ngStyle]="iconStyles"
30
+ >⚠</span
31
+ >
32
+ <span>
33
+ {{ itxFormUpdateMessageConfig?.message || defaultMessage }}
34
+ </span>
35
+ </div>
36
+ `, isInline: true, styles: [".form-update-message{display:flex;margin-top:.5rem}.form-update-icon{flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
37
+ }
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IntellitoolxFormUpdateMessage, decorators: [{
39
+ type: Component,
40
+ args: [{ selector: 'itx-form-update-message', standalone: true, imports: [CommonModule], template: `
41
+ <div class="form-update-message" role="alert" [ngStyle]="containerStyles">
42
+ <span class="form-update-icon" aria-hidden="true" [ngStyle]="iconStyles"
43
+ >⚠</span
44
+ >
45
+ <span>
46
+ {{ itxFormUpdateMessageConfig?.message || defaultMessage }}
47
+ </span>
48
+ </div>
49
+ `, styles: [".form-update-message{display:flex;margin-top:.5rem}.form-update-icon{flex-shrink:0}\n"] }]
50
+ }], propDecorators: { itxFormUpdateMessageConfig: [{
51
+ type: Input
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS11cGRhdGUtbWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0tY2hhbmdlcy9mb3JtLXVwZGF0ZS1tZXNzYWdlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQWtCL0MsTUFBTSxPQUFPLDZCQUE2QjtJQWhCMUM7UUFrQkUsbUJBQWMsR0FDWixrRUFBa0UsQ0FBQztLQXVCdEU7SUFyQkMsSUFBSSxlQUFlO1FBQ2pCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLE9BQU8sSUFBSSxNQUFNO1lBQzNELEdBQUcsRUFBRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsaUJBQWlCLElBQUksUUFBUTtZQUNuRSxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLFNBQVMsSUFBSSxTQUFTO1lBQzlELE1BQU0sRUFDSixZQUFZO2dCQUNaLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLFdBQVcsSUFBSSxTQUFTLENBQUM7WUFDN0Qsa0JBQWtCLEVBQ2hCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxlQUFlLElBQUksU0FBUztZQUMvRCxhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxVQUFVLElBQUksR0FBRyxDQUFDO1lBQ3pFLGVBQWUsRUFDYixJQUFJLENBQUMsMEJBQTBCLEVBQUUsWUFBWSxJQUFJLFFBQVE7U0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxRQUFRLElBQUksTUFBTTtTQUNqRSxDQUFDO0lBQ0osQ0FBQzsrR0F6QlUsNkJBQTZCO21HQUE3Qiw2QkFBNkIseUpBWDlCOzs7Ozs7Ozs7R0FTVCw4SkFYUyxZQUFZOzs0RkFhWCw2QkFBNkI7a0JBaEJ6QyxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsWUFFYjs7Ozs7Ozs7O0dBU1Q7OEJBR1EsMEJBQTBCO3NCQUFsQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50ZWxsaXRvb2x4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWcgfSBmcm9tICcuL2Zvcm0tdXBkYXRlLW1lc3NhZ2UtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdHgtZm9ybS11cGRhdGUtbWVzc2FnZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLXVwZGF0ZS1tZXNzYWdlLmNvbXBvbmVudC5jc3MnXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS11cGRhdGUtbWVzc2FnZVwiIHJvbGU9XCJhbGVydFwiIFtuZ1N0eWxlXT1cImNvbnRhaW5lclN0eWxlc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLXVwZGF0ZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW25nU3R5bGVdPVwiaWNvblN0eWxlc1wiXG4gICAgICAgID7imqA8L3NwYW5cbiAgICAgID5cbiAgICAgIDxzcGFuPlxuICAgICAgICB7eyBpdHhGb3JtVXBkYXRlTWVzc2FnZUNvbmZpZz8ubWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZSB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbnRlbGxpdG9vbHhGb3JtVXBkYXRlTWVzc2FnZSB7XG4gIEBJbnB1dCgpIGl0eEZvcm1VcGRhdGVNZXNzYWdlQ29uZmlnPzogSW50ZWxsaXRvb2x4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWc7XG4gIGRlZmF1bHRNZXNzYWdlID1cbiAgICAnVGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gc2F2ZS4gUGxlYXNlIG1vZGlmeSBhIGZpZWxkIHRvIGNvbnRpbnVlLic7XG5cbiAgZ2V0IGNvbnRhaW5lclN0eWxlcygpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFkZGluZzogdGhpcy5pdHhGb3JtVXBkYXRlTWVzc2FnZUNvbmZpZz8ucGFkZGluZyB8fCAnMXJlbScsXG4gICAgICBnYXA6IHRoaXMuaXR4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWc/Lmljb25BbmRNZXNzYWdlR2FwIHx8ICcwLjVyZW0nLFxuICAgICAgY29sb3I6IHRoaXMuaXR4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWc/LnRleHRDb2xvciB8fCAnIzk2M0MwMCcsXG4gICAgICBib3JkZXI6XG4gICAgICAgICcxcHggc29saWQgJyArXG4gICAgICAgICh0aGlzLml0eEZvcm1VcGRhdGVNZXNzYWdlQ29uZmlnPy5ib3JkZXJDb2xvciB8fCAnI2YzY2Q1YScpLFxuICAgICAgJ2JhY2tncm91bmQtY29sb3InOlxuICAgICAgICB0aGlzLml0eEZvcm1VcGRhdGVNZXNzYWdlQ29uZmlnPy5iYWNrZ3JvdW5kQ29sb3IgfHwgJyNmZmYzY2QnLFxuICAgICAgJ2ZvbnQtd2VpZ2h0JzogU3RyaW5nKHRoaXMuaXR4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWc/LmZvbnRXZWlnaHQgfHwgNDAwKSxcbiAgICAgICdib3JkZXItcmFkaXVzJzpcbiAgICAgICAgdGhpcy5pdHhGb3JtVXBkYXRlTWVzc2FnZUNvbmZpZz8uYm9yZGVyUmFkaXVzIHx8ICcwLjVyZW0nLFxuICAgIH07XG4gIH1cblxuICBnZXQgaWNvblN0eWxlcygpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2ZvbnQtc2l6ZSc6IHRoaXMuaXR4Rm9ybVVwZGF0ZU1lc3NhZ2VDb25maWc/Lmljb25TaXplIHx8ICcxcmVtJyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./form-changes-tracker.service";
4
+ export class UnsavedChangesGuard {
5
+ constructor(tracker) {
6
+ this.tracker = tracker;
7
+ }
8
+ async canDeactivate(component) {
9
+ if (!this.tracker.hasChanges()) {
10
+ return true;
11
+ }
12
+ // Component provides its own confirmation (modal)
13
+ if (component.confirmUnsavedChanges) {
14
+ const result = component.confirmUnsavedChanges();
15
+ return typeof result === 'boolean' ? result : await result;
16
+ }
17
+ const message = component.getUnsavedMessage?.() ||
18
+ 'You have unsaved changes. Leave without saving?';
19
+ // Fallback browser confirm
20
+ return confirm(message);
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UnsavedChangesGuard, deps: [{ token: i1.FormChangesTrackerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UnsavedChangesGuard, providedIn: 'root' }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UnsavedChangesGuard, decorators: [{
26
+ type: Injectable,
27
+ args: [{ providedIn: 'root' }]
28
+ }], ctorParameters: function () { return [{ type: i1.FormChangesTrackerService }]; } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zYXZlZC1jaGFuZ2VzLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9mb3JtLWNoYW5nZXMvdW5zYXZlZC1jaGFuZ2VzLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU0zQyxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQW9CLE9BQWtDO1FBQWxDLFlBQU8sR0FBUCxPQUFPLENBQTJCO0lBQUcsQ0FBQztJQUUxRCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQWlDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxrREFBa0Q7UUFDbEQsSUFBSSxTQUFTLENBQUMscUJBQXFCLEVBQUU7WUFDbkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDakQsT0FBTyxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUM7U0FDNUQ7UUFFRCxNQUFNLE9BQU8sR0FDWCxTQUFTLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUMvQixpREFBaUQsQ0FBQztRQUNwRCwyQkFBMkI7UUFDM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQzsrR0FsQlUsbUJBQW1CO21IQUFuQixtQkFBbUIsY0FETixNQUFNOzs0RkFDbkIsbUJBQW1CO2tCQUQvQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbkRlYWN0aXZhdGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSB9IGZyb20gJy4vY2FuLWNvbXBvbmVudC1kZWFjdGl2YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGb3JtQ2hhbmdlc1RyYWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLWNoYW5nZXMtdHJhY2tlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBVbnNhdmVkQ2hhbmdlc0d1YXJkIGltcGxlbWVudHMgQ2FuRGVhY3RpdmF0ZTxDYW5Db21wb25lbnREZWFjdGl2YXRlPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhY2tlcjogRm9ybUNoYW5nZXNUcmFja2VyU2VydmljZSkge31cblxuICBhc3luYyBjYW5EZWFjdGl2YXRlKGNvbXBvbmVudDogQ2FuQ29tcG9uZW50RGVhY3RpdmF0ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy50cmFja2VyLmhhc0NoYW5nZXMoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENvbXBvbmVudCBwcm92aWRlcyBpdHMgb3duIGNvbmZpcm1hdGlvbiAobW9kYWwpXG4gICAgaWYgKGNvbXBvbmVudC5jb25maXJtVW5zYXZlZENoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5jb25maXJtVW5zYXZlZENoYW5nZXMoKTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicgPyByZXN1bHQgOiBhd2FpdCByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjb21wb25lbnQuZ2V0VW5zYXZlZE1lc3NhZ2U/LigpIHx8XG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBMZWF2ZSB3aXRob3V0IHNhdmluZz8nO1xuICAgIC8vIEZhbGxiYWNrIGJyb3dzZXIgY29uZmlybVxuICAgIHJldHVybiBjb25maXJtKG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
@@ -16,7 +16,7 @@ export class IntellitoolxFormErrors {
16
16
  passwordMismatch: 'Password and confirm password do not match.',
17
17
  futureDate: 'Future date is not allowed.',
18
18
  exceededAllowedDateDifference: 'Date difference can only be one month.',
19
- exceededLeastDateAllowed: 'Start date cannot be greater than end date',
19
+ startDateAfterEndDate: 'Start date cannot be greater than end date',
20
20
  duplicateEmail: 'Each email must be unique.',
21
21
  maxWords: 'Exceeded maximum number of words.',
22
22
  maxMonthYear: 'Date is later than allowed.',
@@ -69,7 +69,7 @@ export class IntellitoolxFormErrors {
69
69
  case 'maxMonthYear':
70
70
  case 'minMonthYear':
71
71
  case 'exceededAllowedDateDifference':
72
- case 'exceededLeastDateAllowed':
72
+ case 'startDateAfterEndDate':
73
73
  return customMessage || this.errorMessages[key];
74
74
  default:
75
75
  return customMessage || '';
@@ -107,4 +107,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
107
107
  }], controlLabel: [{
108
108
  type: Input
109
109
  }] } });
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9mb3JtLWVycm9ycy9mb3JtLWVycm9ycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFvQ2pELE1BQU0sT0FBTyxzQkFBc0I7SUFabkM7UUFhVyxZQUFPLEdBQ2QsSUFBSSxDQUFDO1FBQ0Usd0JBQW1CLEdBQXdDLEVBQUUsQ0FBQztRQUM5RCxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFNUMsa0JBQWEsR0FBa0I7WUFDN0IsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxLQUFLLEVBQUUsOEJBQThCO1lBQ3JDLFNBQVMsRUFBRSw2Q0FBNkM7WUFDeEQsU0FBUyxFQUFFLGtEQUFrRDtZQUM3RCxPQUFPLEVBQUUsNENBQTRDO1lBQ3JELGdCQUFnQixFQUFFLDZDQUE2QztZQUMvRCxVQUFVLEVBQUUsNkJBQTZCO1lBQ3pDLDZCQUE2QixFQUFFLHdDQUF3QztZQUN2RSx3QkFBd0IsRUFBRSw0Q0FBNEM7WUFDdEUsY0FBYyxFQUFFLDRCQUE0QjtZQUM1QyxRQUFRLEVBQUUsbUNBQW1DO1lBQzdDLFlBQVksRUFBRSw2QkFBNkI7WUFDM0MsWUFBWSxFQUFFLCtCQUErQjtTQUM5QyxDQUFDO0tBMEVIO0lBeEVDLGVBQWUsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7UUFFL0QsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDOUIs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bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQ29udHJvbCxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JNZXNzYWdlcyB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgcmVxdWlyZWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgbWlubGVuZ3RoOiBzdHJpbmc7XG4gIG1heGxlbmd0aDogc3RyaW5nO1xuICBwYXR0ZXJuOiBzdHJpbmc7XG4gIHBhc3N3b3JkTWlzbWF0Y2g6IHN0cmluZztcbiAgZnV0dXJlRGF0ZTogc3RyaW5nO1xuICBleGNlZWRlZEFsbG93ZWREYXRlRGlmZmVyZW5jZTogc3RyaW5nO1xuICBleGNlZWRlZExlYXN0RGF0ZUFsbG93ZWQ6IHN0cmluZztcbiAgZHVwbGljYXRlRW1haWw6IHN0cmluZztcbiAgbWF4V29yZHM6IHN0cmluZztcbiAgbWF4TW9udGhZZWFyOiBzdHJpbmc7XG4gIG1pbk1vbnRoWWVhcjogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdHgtZm9ybS1lcnJvcnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8udG91Y2hlZCAmJiBjb250cm9sPy5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvciBvZiBjb250cm9sPy5lcnJvcnMgfCBrZXl2YWx1ZVwiPlxuICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoZXJyb3I/LmtleSA/PyAnJywgZXJyb3I/LnZhbHVlKSB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEludGVsbGl0b29seEZvcm1FcnJvcnMge1xuICBASW5wdXQoKSBjb250cm9sOiBGb3JtQ29udHJvbCB8IFVudHlwZWRGb3JtQ29udHJvbCB8IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPVxuICAgIG51bGw7XG4gIEBJbnB1dCgpIGNvbXBvbmVudFZhbGlkYXRpb246IFJlY29yZDxzdHJpbmcsIHsgbWVzc2FnZTogc3RyaW5nIH0+ID0ge307XG4gIEBJbnB1dCgpIGNvbnRyb2xMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgZXJyb3JNZXNzYWdlczogRXJyb3JNZXNzYWdlcyA9IHtcbiAgICByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgIGVtYWlsOiAnVGhlIGVtYWlsIGVudGVyZWQgaXMgaW52YWxpZCcsXG4gICAgbWlubGVuZ3RoOiAnWW91IG11c3QgZW50ZXIgYXQgbGVhc3Qge2xlbmd0aH0gY2hhcmFjdGVycycsXG4gICAgbWF4bGVuZ3RoOiAnWW91IG11c3Qgbm90IGVudGVyIG1vcmUgdGhhbiB7bGVuZ3RofSBjaGFyYWN0ZXJzJyxcbiAgICBwYXR0ZXJuOiAnWW91ciBlbnRyeSBtdXN0IG1hdGNoIHRoZSByZXF1aXJlZCBwYXR0ZXJuJyxcbiAgICBwYXNzd29yZE1pc21hdGNoOiAnUGFzc3dvcmQgYW5kIGNvbmZpcm0gcGFzc3dvcmQgZG8gbm90IG1hdGNoLicsXG4gICAgZnV0dXJlRGF0ZTogJ0Z1dHVyZSBkYXRlIGlzIG5vdCBhbGxvd2VkLicsXG4gICAgZXhjZWVkZWRBbGxvd2VkRGF0ZURpZmZlcmVuY2U6ICdEYXRlIGRpZmZlcmVuY2UgY2FuIG9ubHkgYmUgb25lIG1vbnRoLicsXG4gICAgZXhjZWVkZWRMZWFzdERhdGVBbGxvd2VkOiAnU3RhcnQgZGF0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGVuZCBkYXRlJyxcbiAgICBkdXBsaWNhdGVFbWFpbDogJ0VhY2ggZW1haWwgbXVzdCBiZSB1bmlxdWUuJyxcbiAgICBtYXhXb3JkczogJ0V4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIHdvcmRzLicsXG4gICAgbWF4TW9udGhZZWFyOiAnRGF0ZSBpcyBsYXRlciB0aGFuIGFsbG93ZWQuJyxcbiAgICBtaW5Nb250aFllYXI6ICdEYXRlIGlzIGVhcmxpZXIgdGhhbiBhbGxvd2VkLicsXG4gIH07XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgY3VzdG9tTWVzc2FnZSA9IHRoaXMuY29tcG9uZW50VmFsaWRhdGlvbj8uW2tleV0/Lm1lc3NhZ2U7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8IHRoaXMuZXJyb3JNZXNzYWdlc1trZXldIHx8ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAncGF0dGVybic6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgfHxcbiAgICAgICAgICAgIGBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkICR7dGhpcy5jb250cm9sTGFiZWwgfHwgJ2RhdGEnfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZVxuICAgICAgICAgICAgPyBjdXN0b21NZXNzYWdlXG4gICAgICAgICAgICA6IHRoaXMuY29udHJvbExhYmVsXG4gICAgICAgICAgICAgID8gYCR7dGhpcy5jb250cm9sTGFiZWx9IGNhbm5vdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZS5taW59LmBcbiAgICAgICAgICAgICAgOiBgTnVtYmVyIGNhbm5vdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZS5taW59YDtcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZVxuICAgICAgICAgICAgPyBjdXN0b21NZXNzYWdlXG4gICAgICAgICAgICA6IHRoaXMuY29udHJvbExhYmVsXG4gICAgICAgICAgICAgID8gYCR7dGhpcy5jb250cm9sTGFiZWx9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHt2YWx1ZS5tYXh9LmBcbiAgICAgICAgICAgICAgOiBgTnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHt2YWx1ZS5tYXh9YDtcbiAgICAgICAgY2FzZSAnbWlubGVuZ3RoJzpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSB8fFxuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLm1pbmxlbmd0aC5yZXBsYWNlKFxuICAgICAgICAgICAgICAne2xlbmd0aH0nLFxuICAgICAgICAgICAgICB2YWx1ZT8ucmVxdWlyZWRMZW5ndGggfHwgJycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnbWF4bGVuZ3RoJzpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSB8fFxuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLm1heGxlbmd0aC5yZXBsYWNlKFxuICAgICAgICAgICAgICAne2xlbmd0aH0nLFxuICAgICAgICAgICAgICB2YWx1ZT8ucmVxdWlyZWRMZW5ndGggfHwgJycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnY3VzdG9tTWluVmFsdWUnOlxuICAgICAgICBjYXNlICdjdXN0b21NYXhWYWx1ZSc6XG4gICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2UgfHwgdmFsdWU/Lm1lc3NhZ2UgfHwgJyc7XG4gICAgICAgIGNhc2UgJ25nYkRhdGUnOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjdXN0b21NZXNzYWdlIHx8XG4gICAgICAgICAgICAodGhpcy5jb250cm9sLnZhbHVlID8gJ0ludmFsaWQgZGF0ZSBmb3JtYXQgcHJvdmlkZWQnIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAncGFzc3dvcmRNaXNtYXRjaCc6XG4gICAgICAgIGNhc2UgJ2Z1dHVyZURhdGUnOlxuICAgICAgICBjYXNlICdkdXBsaWNhdGVFbWFpbCc6XG4gICAgICAgIGNhc2UgJ21heFdvcmRzJzpcbiAgICAgICAgY2FzZSAnbWF4TW9udGhZZWFyJzpcbiAgICAgICAgY2FzZSAnbWluTW9udGhZZWFyJzpcbiAgICAgICAgY2FzZSAnZXhjZWVkZWRBbGxvd2VkRGF0ZURpZmZlcmVuY2UnOlxuICAgICAgICBjYXNlICdleGNlZWRlZExlYXN0RGF0ZUFsbG93ZWQnOlxuICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8IHRoaXMuZXJyb3JNZXNzYWdlc1trZXldO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9mb3JtLWVycm9ycy9mb3JtLWVycm9ycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFvQ2pELE1BQU0sT0FBTyxzQkFBc0I7SUFabkM7UUFhVyxZQUFPLEdBQ2QsSUFBSSxDQUFDO1FBQ0Usd0JBQW1CLEdBQXdDLEVBQUUsQ0FBQztRQUM5RCxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFNUMsa0JBQWEsR0FBa0I7WUFDN0IsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxLQUFLLEVBQUUsOEJBQThCO1lBQ3JDLFNBQVMsRUFBRSw2Q0FBNkM7WUFDeEQsU0FBUyxFQUFFLGtEQUFrRDtZQUM3RCxPQUFPLEVBQUUsNENBQTRDO1lBQ3JELGdCQUFnQixFQUFFLDZDQUE2QztZQUMvRCxVQUFVLEVBQUUsNkJBQTZCO1lBQ3pDLDZCQUE2QixFQUFFLHdDQUF3QztZQUN2RSxxQkFBcUIsRUFBRSw0Q0FBNEM7WUFDbkUsY0FBYyxFQUFFLDRCQUE0QjtZQUM1QyxRQUFRLEVBQUUsbUNBQW1DO1lBQzdDLFlBQVksRUFBRSw2QkFBNkI7WUFDM0MsWUFBWSxFQUFFLCtCQUErQjtTQUM5QyxDQUFDO0tBMEVIO0lBeEVDLGVBQWUsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7UUFFL0QsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDOUIs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bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQ29udHJvbCxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JNZXNzYWdlcyB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgcmVxdWlyZWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgbWlubGVuZ3RoOiBzdHJpbmc7XG4gIG1heGxlbmd0aDogc3RyaW5nO1xuICBwYXR0ZXJuOiBzdHJpbmc7XG4gIHBhc3N3b3JkTWlzbWF0Y2g6IHN0cmluZztcbiAgZnV0dXJlRGF0ZTogc3RyaW5nO1xuICBleGNlZWRlZEFsbG93ZWREYXRlRGlmZmVyZW5jZTogc3RyaW5nO1xuICBzdGFydERhdGVBZnRlckVuZERhdGU6IHN0cmluZztcbiAgZHVwbGljYXRlRW1haWw6IHN0cmluZztcbiAgbWF4V29yZHM6IHN0cmluZztcbiAgbWF4TW9udGhZZWFyOiBzdHJpbmc7XG4gIG1pbk1vbnRoWWVhcjogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdHgtZm9ybS1lcnJvcnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbD8udG91Y2hlZCAmJiBjb250cm9sPy5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvciBvZiBjb250cm9sPy5lcnJvcnMgfCBrZXl2YWx1ZVwiPlxuICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoZXJyb3I/LmtleSA/PyAnJywgZXJyb3I/LnZhbHVlKSB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEludGVsbGl0b29seEZvcm1FcnJvcnMge1xuICBASW5wdXQoKSBjb250cm9sOiBGb3JtQ29udHJvbCB8IFVudHlwZWRGb3JtQ29udHJvbCB8IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPVxuICAgIG51bGw7XG4gIEBJbnB1dCgpIGNvbXBvbmVudFZhbGlkYXRpb246IFJlY29yZDxzdHJpbmcsIHsgbWVzc2FnZTogc3RyaW5nIH0+ID0ge307XG4gIEBJbnB1dCgpIGNvbnRyb2xMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgZXJyb3JNZXNzYWdlczogRXJyb3JNZXNzYWdlcyA9IHtcbiAgICByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgIGVtYWlsOiAnVGhlIGVtYWlsIGVudGVyZWQgaXMgaW52YWxpZCcsXG4gICAgbWlubGVuZ3RoOiAnWW91IG11c3QgZW50ZXIgYXQgbGVhc3Qge2xlbmd0aH0gY2hhcmFjdGVycycsXG4gICAgbWF4bGVuZ3RoOiAnWW91IG11c3Qgbm90IGVudGVyIG1vcmUgdGhhbiB7bGVuZ3RofSBjaGFyYWN0ZXJzJyxcbiAgICBwYXR0ZXJuOiAnWW91ciBlbnRyeSBtdXN0IG1hdGNoIHRoZSByZXF1aXJlZCBwYXR0ZXJuJyxcbiAgICBwYXNzd29yZE1pc21hdGNoOiAnUGFzc3dvcmQgYW5kIGNvbmZpcm0gcGFzc3dvcmQgZG8gbm90IG1hdGNoLicsXG4gICAgZnV0dXJlRGF0ZTogJ0Z1dHVyZSBkYXRlIGlzIG5vdCBhbGxvd2VkLicsXG4gICAgZXhjZWVkZWRBbGxvd2VkRGF0ZURpZmZlcmVuY2U6ICdEYXRlIGRpZmZlcmVuY2UgY2FuIG9ubHkgYmUgb25lIG1vbnRoLicsXG4gICAgc3RhcnREYXRlQWZ0ZXJFbmREYXRlOiAnU3RhcnQgZGF0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGVuZCBkYXRlJyxcbiAgICBkdXBsaWNhdGVFbWFpbDogJ0VhY2ggZW1haWwgbXVzdCBiZSB1bmlxdWUuJyxcbiAgICBtYXhXb3JkczogJ0V4Y2VlZGVkIG1heGltdW0gbnVtYmVyIG9mIHdvcmRzLicsXG4gICAgbWF4TW9udGhZZWFyOiAnRGF0ZSBpcyBsYXRlciB0aGFuIGFsbG93ZWQuJyxcbiAgICBtaW5Nb250aFllYXI6ICdEYXRlIGlzIGVhcmxpZXIgdGhhbiBhbGxvd2VkLicsXG4gIH07XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgY3VzdG9tTWVzc2FnZSA9IHRoaXMuY29tcG9uZW50VmFsaWRhdGlvbj8uW2tleV0/Lm1lc3NhZ2U7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8IHRoaXMuZXJyb3JNZXNzYWdlc1trZXldIHx8ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAncGF0dGVybic6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgfHxcbiAgICAgICAgICAgIGBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkICR7dGhpcy5jb250cm9sTGFiZWwgfHwgJ2RhdGEnfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZVxuICAgICAgICAgICAgPyBjdXN0b21NZXNzYWdlXG4gICAgICAgICAgICA6IHRoaXMuY29udHJvbExhYmVsXG4gICAgICAgICAgICAgID8gYCR7dGhpcy5jb250cm9sTGFiZWx9IGNhbm5vdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZS5taW59LmBcbiAgICAgICAgICAgICAgOiBgTnVtYmVyIGNhbm5vdCBiZSBsZXNzIHRoYW4gJHt2YWx1ZS5taW59YDtcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZVxuICAgICAgICAgICAgPyBjdXN0b21NZXNzYWdlXG4gICAgICAgICAgICA6IHRoaXMuY29udHJvbExhYmVsXG4gICAgICAgICAgICAgID8gYCR7dGhpcy5jb250cm9sTGFiZWx9IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHt2YWx1ZS5tYXh9LmBcbiAgICAgICAgICAgICAgOiBgTnVtYmVyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHt2YWx1ZS5tYXh9YDtcbiAgICAgICAgY2FzZSAnbWlubGVuZ3RoJzpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSB8fFxuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLm1pbmxlbmd0aC5yZXBsYWNlKFxuICAgICAgICAgICAgICAne2xlbmd0aH0nLFxuICAgICAgICAgICAgICB2YWx1ZT8ucmVxdWlyZWRMZW5ndGggfHwgJycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnbWF4bGVuZ3RoJzpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSB8fFxuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLm1heGxlbmd0aC5yZXBsYWNlKFxuICAgICAgICAgICAgICAne2xlbmd0aH0nLFxuICAgICAgICAgICAgICB2YWx1ZT8ucmVxdWlyZWRMZW5ndGggfHwgJycsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnY3VzdG9tTWluVmFsdWUnOlxuICAgICAgICBjYXNlICdjdXN0b21NYXhWYWx1ZSc6XG4gICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2UgfHwgdmFsdWU/Lm1lc3NhZ2UgfHwgJyc7XG4gICAgICAgIGNhc2UgJ25nYkRhdGUnOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjdXN0b21NZXNzYWdlIHx8XG4gICAgICAgICAgICAodGhpcy5jb250cm9sLnZhbHVlID8gJ0ludmFsaWQgZGF0ZSBmb3JtYXQgcHJvdmlkZWQnIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAncGFzc3dvcmRNaXNtYXRjaCc6XG4gICAgICAgIGNhc2UgJ2Z1dHVyZURhdGUnOlxuICAgICAgICBjYXNlICdkdXBsaWNhdGVFbWFpbCc6XG4gICAgICAgIGNhc2UgJ21heFdvcmRzJzpcbiAgICAgICAgY2FzZSAnbWF4TW9udGhZZWFyJzpcbiAgICAgICAgY2FzZSAnbWluTW9udGhZZWFyJzpcbiAgICAgICAgY2FzZSAnZXhjZWVkZWRBbGxvd2VkRGF0ZURpZmZlcmVuY2UnOlxuICAgICAgICBjYXNlICdzdGFydERhdGVBZnRlckVuZERhdGUnOlxuICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8IHRoaXMuZXJyb3JNZXNzYWdlc1trZXldO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlIHx8ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19
@@ -86,7 +86,6 @@ export class IntelliToolxHelper {
86
86
  const result = confirmHandler();
87
87
  return typeof result === 'boolean' ? result : await result;
88
88
  }
89
- // fallback (only if handler not provided)
90
89
  return confirm('You have unsaved changes. Continue?');
91
90
  }
92
91
  static registerBeforeUnload(shouldBlock, message) {
@@ -94,7 +93,7 @@ export class IntelliToolxHelper {
94
93
  if (!shouldBlock())
95
94
  return;
96
95
  event.preventDefault();
97
- event.returnValue = message || '';
96
+ event.returnValue = message ?? '';
98
97
  };
99
98
  window.addEventListener('beforeunload', handler);
100
99
  return () => window.removeEventListener('beforeunload', handler);
@@ -153,4 +152,4 @@ export class IntelliToolxHelper {
153
152
  return value;
154
153
  }
155
154
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaXRvb2x4LmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaGVscGVycy9pbnRlbGxpdG9vbHguaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsTUFBTSxDQUFDLHVCQUF1QixDQUFDLElBQXFCO1FBQ2xELE1BQU0sWUFBWSxHQUFJLElBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUF3QjtRQUMzQyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7WUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzFDLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUU7WUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFL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QixDQUFDO2dCQUM3QyxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDckIsSUFBUyxFQUNULFdBQW1CLEVBQ25CLGVBQXVCO1FBRXZCLE9BQU8sSUFBSSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQzVCLEtBQW9DO1FBRXBDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsSUFBSTtnQkFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFNLENBQUM7YUFDL0I7WUFBQyxNQUFNO2dCQUNOLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELE9BQU8sS0FBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb25maXJtSGFuZGxlciB9IGZyb20gJy4uL2Zvcm0tdXBkYXRlL2NvbmZpcm0taGFuZGxlci50eXBlJztcblxuZXhwb3J0IGNsYXNzIEludGVsbGlUb29seEhlbHBlciB7XG4gIHN0YXRpYyBjYXB0dXJlSW5pdGlhbEZvcm1WYWx1ZShmb3JtOiBBYnN0cmFjdENvbnRyb2wpOiBhbnkge1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChmb3JtIGFzIGFueSkuZ2V0UmF3VmFsdWU/LigpID8/IGZvcm0udmFsdWU7XG4gICAgZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHJldHVybiB0aGlzLmNsb25lKGluaXRpYWxWYWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgdHJpbUZvcm1Hcm91cChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgT2JqZWN0LmtleXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgICB0aGlzLnRyaW1Gb3JtR3JvdXAoY29udHJvbC5jb250cm9sc1trZXldKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaCgoY3RybCkgPT4gdGhpcy50cmltRm9ybUdyb3VwKGN0cmwpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLnRyaW0oKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWVwRXF1YWwob2JqMTogYW55LCBvYmoyOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyB0cmVhdCBudWxsLCB1bmRlZmluZWQsIGFuZCBlbXB0eSBzdHJpbmcgYXMgZXF1YWxcbiAgICBpZiAodGhpcy5pc0VtcHR5KG9iajEpICYmIHRoaXMuaXNFbXB0eShvYmoyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXplIG51bWVyaWMgdmFsdWVzXG4gICAgaWYgKHR5cGVvZiBvYmoxID09PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqMiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBOdW1iZXIob2JqMSkgPT09IE51bWJlcihvYmoyKTtcbiAgICB9XG5cbiAgICAvLyBzdHJpY3QgZXF1YWxpdHkgc2hvcnRjdXRcbiAgICBpZiAob2JqMSA9PT0gb2JqMikgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBGaWxlIGNvbXBhcmlzb25cbiAgICBpZiAob2JqMSBpbnN0YW5jZW9mIEZpbGUgJiYgb2JqMiBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG9iajEubmFtZSA9PT0gb2JqMi5uYW1lICYmXG4gICAgICAgIG9iajEuc2l6ZSA9PT0gb2JqMi5zaXplICYmXG4gICAgICAgIG9iajEudHlwZSA9PT0gb2JqMi50eXBlICYmXG4gICAgICAgIG9iajEubGFzdE1vZGlmaWVkID09PSBvYmoyLmxhc3RNb2RpZmllZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBpZiBub3Qgb2JqZWN0cyDihpIgbm90IGVxdWFsXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9iajEgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2Ygb2JqMiAhPT0gJ29iamVjdCcgfHxcbiAgICAgIG9iajEgPT09IG51bGwgfHxcbiAgICAgIG9iajIgPT09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoxKSAmJiBBcnJheS5pc0FycmF5KG9iajIpKSB7XG4gICAgICBpZiAob2JqMS5sZW5ndGggIT09IG9iajIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gb2JqMS5ldmVyeSgodiwgaSkgPT4gdGhpcy5kZWVwRXF1YWwodiwgb2JqMltpXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqMSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmoyKTtcblxuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgIGlmICgha2V5czIuaW5jbHVkZXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmRlZXBFcXVhbChvYmoxW2tleV0sIG9iajJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjbG9uZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTsgLy8gQW5ndWxhciAxNCsgc2FmZVxuICB9XG5cbiAgc3RhdGljIGZvcm1IYXNDaGFuZ2VzKGluaXRpYWxWYWx1ZTogYW55LCBmb3JtOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBmb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgcmV0dXJuICF0aGlzLmRlZXBFcXVhbChpbml0aWFsVmFsdWUsIGN1cnJlbnQpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNvbmZpcm1JZkNoYW5nZWQoXG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbixcbiAgICBjb25maXJtSGFuZGxlcj86IENvbmZpcm1IYW5kbGVyLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWhhc0NoYW5nZXMpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKGNvbmZpcm1IYW5kbGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maXJtSGFuZGxlcigpO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyA/IHJlc3VsdCA6IGF3YWl0IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBmYWxsYmFjayAob25seSBpZiBoYW5kbGVyIG5vdCBwcm92aWRlZClcbiAgICByZXR1cm4gY29uZmlybSgnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBDb250aW51ZT8nKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlckJlZm9yZVVubG9hZChzaG91bGRCbG9jazogKCkgPT4gYm9vbGVhbiwgbWVzc2FnZT86IHN0cmluZykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEJsb2NrKCkpIHJldHVybjtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gbWVzc2FnZSB8fCAnJztcbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVyKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRGb3JtQ29udHJvbDxUID0gYW55PihcbiAgICBmb3JtOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgcGF0aDogc3RyaW5nLFxuICApOiBGb3JtQ29udHJvbDxUPiB8IG51bGwge1xuICAgIGlmICghZm9ybSB8fCAhcGF0aCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgY3VycmVudDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm07XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIC8vIFRyZWF0IG51bWVyaWMgc2VnbWVudCBhcyBGb3JtQXJyYXkgaW5kZXhcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHNlZ21lbnQpO1xuICAgICAgaWYgKCFpc05hTihpbmRleCkgJiYgY3VycmVudCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5hdChpbmRleCk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0KHNlZ21lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCA/IChjdXJyZW50IGFzIEZvcm1Db250cm9sPFQ+KSA6IG51bGw7XG4gIH1cblxuICBzdGF0aWMgY29udmVydEltYWdlVG9CYXNlNjQoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2U2NFN0cmluZyA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBiYXNlNjRTdHJpbmdBcnJheSA9IGJhc2U2NFN0cmluZy5zcGxpdCgnLCcpO1xuICAgICAgICByZXNvbHZlKGJhc2U2NFN0cmluZ0FycmF5WzFdKTtcbiAgICAgIH07XG5cbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VDaGFyYWN0ZXIoXG4gICAgdGV4dDogYW55LFxuICAgIHJlcGxhY2VDaGFyOiBzdHJpbmcsXG4gICAgcmVwbGFjZVdpdGhDaGFyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHQ/LnJlcGxhY2VBbGwocmVwbGFjZUNoYXIsIHJlcGxhY2VXaXRoQ2hhcikgfHwgJyc7XG4gIH1cblxuICBzdGF0aWMgY29udmVydEpzb25TdHJpbmdUb0pzb248VCA9IGFueT4oXG4gICAgdmFsdWU6IFQgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICApOiBUIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyBUO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG59XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWxsaXRvb2x4LmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaGVscGVycy9pbnRlbGxpdG9vbHguaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsTUFBTSxDQUFDLHVCQUF1QixDQUFDLElBQXFCO1FBQ2xELE1BQU0sWUFBWSxHQUFJLElBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUF3QjtRQUMzQyxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7WUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzFDLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUU7WUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFL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LE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDO1lBRUYsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUNyQixJQUFTLEVBQ1QsV0FBbUIsRUFDbkIsZUFBdUI7UUFFdkIsT0FBTyxJQUFJLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsS0FBb0M7UUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJO2dCQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQU0sQ0FBQzthQUMvQjtZQUFDLE1BQU07Z0JBQ04sT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBRUQsT0FBTyxLQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQXJyYXksXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbmZpcm1IYW5kbGVyIH0gZnJvbSAnLi4vZm9ybS1jaGFuZ2VzL2NvbmZpcm0taGFuZGxlci50eXBlJztcblxuZXhwb3J0IGNsYXNzIEludGVsbGlUb29seEhlbHBlciB7XG4gIHN0YXRpYyBjYXB0dXJlSW5pdGlhbEZvcm1WYWx1ZShmb3JtOiBBYnN0cmFjdENvbnRyb2wpOiBhbnkge1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IChmb3JtIGFzIGFueSkuZ2V0UmF3VmFsdWU/LigpID8/IGZvcm0udmFsdWU7XG4gICAgZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHJldHVybiB0aGlzLmNsb25lKGluaXRpYWxWYWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgdHJpbUZvcm1Hcm91cChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgT2JqZWN0LmtleXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PlxuICAgICAgICB0aGlzLnRyaW1Gb3JtR3JvdXAoY29udHJvbC5jb250cm9sc1trZXldKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaCgoY3RybCkgPT4gdGhpcy50cmltRm9ybUdyb3VwKGN0cmwpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLnRyaW0oKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWVwRXF1YWwob2JqMTogYW55LCBvYmoyOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyB0cmVhdCBudWxsLCB1bmRlZmluZWQsIGFuZCBlbXB0eSBzdHJpbmcgYXMgZXF1YWxcbiAgICBpZiAodGhpcy5pc0VtcHR5KG9iajEpICYmIHRoaXMuaXNFbXB0eShvYmoyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXplIG51bWVyaWMgdmFsdWVzXG4gICAgaWYgKHR5cGVvZiBvYmoxID09PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqMiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBOdW1iZXIob2JqMSkgPT09IE51bWJlcihvYmoyKTtcbiAgICB9XG5cbiAgICAvLyBzdHJpY3QgZXF1YWxpdHkgc2hvcnRjdXRcbiAgICBpZiAob2JqMSA9PT0gb2JqMikgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBGaWxlIGNvbXBhcmlzb25cbiAgICBpZiAob2JqMSBpbnN0YW5jZW9mIEZpbGUgJiYgb2JqMiBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG9iajEubmFtZSA9PT0gb2JqMi5uYW1lICYmXG4gICAgICAgIG9iajEuc2l6ZSA9PT0gb2JqMi5zaXplICYmXG4gICAgICAgIG9iajEudHlwZSA9PT0gb2JqMi50eXBlICYmXG4gICAgICAgIG9iajEubGFzdE1vZGlmaWVkID09PSBvYmoyLmxhc3RNb2RpZmllZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBpZiBub3Qgb2JqZWN0cyDihpIgbm90IGVxdWFsXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9iajEgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2Ygb2JqMiAhPT0gJ29iamVjdCcgfHxcbiAgICAgIG9iajEgPT09IG51bGwgfHxcbiAgICAgIG9iajIgPT09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoxKSAmJiBBcnJheS5pc0FycmF5KG9iajIpKSB7XG4gICAgICBpZiAob2JqMS5sZW5ndGggIT09IG9iajIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gb2JqMS5ldmVyeSgodiwgaSkgPT4gdGhpcy5kZWVwRXF1YWwodiwgb2JqMltpXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqMSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmoyKTtcblxuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgIGlmICgha2V5czIuaW5jbHVkZXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmRlZXBFcXVhbChvYmoxW2tleV0sIG9iajJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjbG9uZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTsgLy8gQW5ndWxhciAxNCsgc2FmZVxuICB9XG5cbiAgc3RhdGljIGZvcm1IYXNDaGFuZ2VzKGluaXRpYWxWYWx1ZTogYW55LCBmb3JtOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoIWZvcm0pIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBmb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgcmV0dXJuICF0aGlzLmRlZXBFcXVhbChpbml0aWFsVmFsdWUsIGN1cnJlbnQpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNvbmZpcm1JZkNoYW5nZWQoXG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbixcbiAgICBjb25maXJtSGFuZGxlcj86IENvbmZpcm1IYW5kbGVyLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWhhc0NoYW5nZXMpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKGNvbmZpcm1IYW5kbGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maXJtSGFuZGxlcigpO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyA/IHJlc3VsdCA6IGF3YWl0IHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlybSgnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBDb250aW51ZT8nKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlckJlZm9yZVVubG9hZChzaG91bGRCbG9jazogKCkgPT4gYm9vbGVhbiwgbWVzc2FnZT86IHN0cmluZykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEJsb2NrKCkpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2UgPz8gJyc7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGhhbmRsZXIpO1xuICB9XG5cbiAgc3RhdGljIGdldEZvcm1Db250cm9sPFQgPSBhbnk+KFxuICAgIGZvcm06IEFic3RyYWN0Q29udHJvbCxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICk6IEZvcm1Db250cm9sPFQ+IHwgbnVsbCB7XG4gICAgaWYgKCFmb3JtIHx8ICFwYXRoKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50OiBBYnN0cmFjdENvbnRyb2wgfCBudWxsID0gZm9ybTtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gVHJlYXQgbnVtZXJpYyBzZWdtZW50IGFzIEZvcm1BcnJheSBpbmRleFxuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc2VnbWVudCk7XG4gICAgICBpZiAoIWlzTmFOKGluZGV4KSAmJiBjdXJyZW50IGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmF0KGluZGV4KTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXQoc2VnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudCBpbnN0YW5jZW9mIEZvcm1Db250cm9sID8gKGN1cnJlbnQgYXMgRm9ybUNvbnRyb2w8VD4pIDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0SW1hZ2VUb0Jhc2U2NChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcblxuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IGJhc2U2NFN0cmluZ0FycmF5ID0gYmFzZTY0U3RyaW5nLnNwbGl0KCcsJyk7XG4gICAgICAgIHJlc29sdmUoYmFzZTY0U3RyaW5nQXJyYXlbMV0pO1xuICAgICAgfTtcblxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZUNoYXJhY3RlcihcbiAgICB0ZXh0OiBhbnksXG4gICAgcmVwbGFjZUNoYXI6IHN0cmluZyxcbiAgICByZXBsYWNlV2l0aENoYXI6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dD8ucmVwbGFjZUFsbChyZXBsYWNlQ2hhciwgcmVwbGFjZVdpdGhDaGFyKSB8fCAnJztcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0SnNvblN0cmluZ1RvSnNvbjxUID0gYW55PihcbiAgICB2YWx1ZTogVCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICk6IFQgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gIH1cbn1cbiJdfQ==