@mis-wis/common 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/esm2020/lib/components/create-non-shift-modal/create-non-shift-modal.component.mjs +237 -0
  2. package/esm2020/lib/constants/assets.constants.mjs +8 -0
  3. package/esm2020/lib/models/env.model.mjs +1 -1
  4. package/esm2020/lib/models/session.model.mjs +2 -0
  5. package/esm2020/lib/services/http.service.mjs +29 -9
  6. package/esm2020/lib/services/session.errors.mjs +45 -0
  7. package/esm2020/lib/services/session.service.mjs +198 -0
  8. package/esm2020/lib/wis-common.module.mjs +13 -8
  9. package/esm2020/public-api.mjs +5 -1
  10. package/fesm2015/mis-wis-common.mjs +530 -25
  11. package/fesm2015/mis-wis-common.mjs.map +1 -1
  12. package/fesm2020/mis-wis-common.mjs +522 -25
  13. package/fesm2020/mis-wis-common.mjs.map +1 -1
  14. package/lib/components/create-non-shift-modal/create-non-shift-modal.component.d.ts +56 -0
  15. package/lib/constants/assets.constants.d.ts +7 -0
  16. package/lib/models/env.model.d.ts +1 -0
  17. package/lib/models/session.model.d.ts +22 -0
  18. package/lib/services/http.service.d.ts +16 -5
  19. package/lib/services/session.errors.d.ts +31 -0
  20. package/lib/services/session.service.d.ts +79 -0
  21. package/lib/wis-common.module.d.ts +9 -4
  22. package/package.json +9 -3
  23. package/public-api.d.ts +4 -0
  24. package/src/assets/calendar.svg +7 -0
  25. package/src/assets/images/icons/Wis-icon.svg +4 -0
  26. package/src/assets/images/icons/brand.png +0 -0
  27. package/src/assets/images/icons/broascast.svg +3 -0
  28. package/src/assets/images/icons/bulk-upload.svg +3 -0
  29. package/src/assets/images/icons/desk-mgmt.svg +6 -0
  30. package/src/assets/images/icons/employees-sidebar.svg +3 -0
  31. package/src/assets/images/icons/help-section.svg +4 -0
  32. package/src/assets/images/icons/home.svg +3 -0
  33. package/src/assets/images/icons/logout.svg +4 -0
  34. package/src/assets/images/icons/manage-premise.svg +3 -0
  35. package/src/assets/images/icons/meeting-room.svg +7 -0
  36. package/src/assets/images/icons/mis-icon.svg +3 -0
  37. package/src/assets/images/icons/my-bookings.svg +5 -0
  38. package/src/assets/images/icons/profile.svg +3 -0
  39. package/src/assets/images/icons/reception.svg +14 -0
  40. package/src/assets/images/icons/report.svg +3 -0
  41. package/src/assets/images/icons/resource-group.svg +3 -0
  42. package/src/assets/images/icons/roles.svg +3 -0
  43. package/src/assets/images/icons/sanitize.svg +10 -0
  44. package/src/assets/images/icons/seat-mgmt.svg +3 -0
  45. package/src/assets/images/icons/settings-sidebar.svg +3 -0
  46. package/src/assets/images/icons/signout.svg +4 -0
  47. package/src/assets/images/icons/user-group.svg +6 -0
  48. package/src/assets/images/icons/user-permission.svg +5 -0
  49. package/src/assets/images/icons/utilisation.svg +3 -0
  50. package/src/assets/images/icons/vaccine_approval.svg +8 -0
  51. package/src/assets/images/icons/vaccine_upload.png +0 -0
  52. package/src/assets/images/icons/work-planner-sidebar.svg +3 -0
  53. package/src/assets/images/icons/workInSyncText.svg +14 -0
@@ -0,0 +1,237 @@
1
+ import { Component, Inject } from "@angular/core";
2
+ import { Validators } from "@angular/forms";
3
+ import dayjs from "dayjs";
4
+ import customParseFormat from "dayjs/plugin/customParseFormat";
5
+ import { CONSTANTS_ASSETS_WIS_COMMON } from "../../constants/assets.constants";
6
+ import { forkJoin } from "rxjs";
7
+ import { finalize } from "rxjs/operators";
8
+ import { MODAL_DATA_VAR } from "mis-crystal-design-system/modal";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "mis-crystal-design-system/modal";
11
+ import * as i2 from "@angular/forms";
12
+ import * as i3 from "../../services/http.service";
13
+ import * as i4 from "mis-crystal-design-system/toast";
14
+ import * as i5 from "@angular/common";
15
+ import * as i6 from "mis-crystal-design-system/dropdown";
16
+ import * as i7 from "mis-crystal-design-system/datepicker_v2";
17
+ dayjs.extend(customParseFormat);
18
+ const PROPERTIES = ["NON_SHIFT_TRIPS_CATEGORIES", "USE_VALID_OFFICE_FOR_IRREGULAR_TRIPS"];
19
+ const DATE_FORMAT = "DD/MM/YYYY";
20
+ const PICKUP_TIME_FORMAT = "DD/MM/YYYY HH/mm/ss";
21
+ export class CreateNonShiftModalComponent {
22
+ constructor(modalData, modalRef, fb, http, toast) {
23
+ this.modalData = modalData;
24
+ this.modalRef = modalRef;
25
+ this.fb = fb;
26
+ this.http = http;
27
+ this.toast = toast;
28
+ this.CONSTANTS_ASSETS_WIS_COMMON = CONSTANTS_ASSETS_WIS_COMMON;
29
+ this.dateConfig = {
30
+ minDate: dayjs().format(DATE_FORMAT),
31
+ format: DATE_FORMAT
32
+ };
33
+ this.offices = [];
34
+ this.locationDropdownData = [];
35
+ this.categoryDropdownData = [];
36
+ this.hoursDropdownData = [];
37
+ this.minutesDropdownData = [];
38
+ this.showOtherAddress = false;
39
+ this.loading = false;
40
+ this.isSubmitting = false;
41
+ this.TYPE_OFFICE = 6;
42
+ this.TYPE_TRANSPORT = 3;
43
+ this.TYPE_OTHER = 4;
44
+ this.properties = {};
45
+ }
46
+ ngOnInit() {
47
+ this.loading = true;
48
+ const $office = this.http.getOffices(this.modalData.nonce);
49
+ const $properties = this.http.getProperties(PROPERTIES);
50
+ forkJoin([$office, $properties])
51
+ .pipe(finalize(() => (this.loading = false)))
52
+ .subscribe({
53
+ next: ([offices, properties]) => {
54
+ this.properties = properties;
55
+ this.initializeForm();
56
+ this.initializeDropdownData(offices);
57
+ this.setupFormListeners();
58
+ },
59
+ error: error => {
60
+ console.error("Error loading form data:", error);
61
+ this.modalRef.close();
62
+ }
63
+ });
64
+ }
65
+ initializeForm() {
66
+ const currentTime = this.modalData?.date ?? dayjs().format(DATE_FORMAT);
67
+ this.createTripsheetForm = this.fb.group({
68
+ direction: [this.modalData?.shiftType === "logout" ? "OUT" : "IN", Validators.required],
69
+ location: [{ label: "", value: "" }],
70
+ otherAddress: "",
71
+ tripCategory: [{ label: "", value: "" }],
72
+ date: [currentTime, Validators.required],
73
+ hours: [{ label: "", value: "" }],
74
+ mins: [{ label: "", value: "" }]
75
+ });
76
+ }
77
+ initializeDropdownData(offices) {
78
+ this.locationDropdownData = offices.map((office) => ({
79
+ label: office.address,
80
+ value: { type: this.TYPE_OFFICE, office: office || null }
81
+ }));
82
+ this.createTripsheetForm.get("location")?.setValue(this.locationDropdownData[0]);
83
+ if (!this.properties?.["USE_VALID_OFFICE_FOR_IRREGULAR_TRIPS"]) {
84
+ this.locationDropdownData.push({ label: "Airport", value: { type: this.TYPE_TRANSPORT, office: null } }, { label: "Other", value: { type: this.TYPE_OTHER, office: null } });
85
+ }
86
+ // Initialize category dropdown
87
+ const categoriesString = this.properties?.["NON_SHIFT_TRIPS_CATEGORIES"];
88
+ if (categoriesString && typeof categoriesString === "string") {
89
+ const categories = categoriesString.split(",").filter(cat => cat && cat.trim());
90
+ if (categories.length > 0) {
91
+ this.categoryDropdownData = categories.map(category => ({
92
+ label: category.trim(),
93
+ value: category.trim()
94
+ }));
95
+ }
96
+ }
97
+ const currentHour = new Date().getHours();
98
+ this.hoursDropdownData = Array.from({ length: 24 }, (_, i) => ({
99
+ label: this.padZero(i),
100
+ value: this.padZero(i)
101
+ }));
102
+ this.createTripsheetForm.patchValue({ hours: this.hoursDropdownData[currentHour] });
103
+ const currentMinute = new Date().getMinutes();
104
+ this.minutesDropdownData = Array.from({ length: 60 }, (_, i) => ({
105
+ label: this.padZero(i),
106
+ value: this.padZero(i)
107
+ }));
108
+ this.createTripsheetForm.patchValue({ mins: this.minutesDropdownData[currentMinute] });
109
+ }
110
+ setupFormListeners() {
111
+ this.createTripsheetForm?.valueChanges.subscribe(value => {
112
+ const { location } = this.createTripsheetForm?.value;
113
+ if (this.showOtherAddress !== (location?.value?.type === this.TYPE_OTHER)) {
114
+ this.showOtherAddress = location?.value?.type === this.TYPE_OTHER;
115
+ if (this.showOtherAddress) {
116
+ this.createTripsheetForm.get("otherAddress")?.setValidators([Validators.required]);
117
+ }
118
+ else {
119
+ this.createTripsheetForm.get("otherAddress")?.clearValidators();
120
+ }
121
+ this.createTripsheetForm.get("otherAddress")?.updateValueAndValidity();
122
+ }
123
+ });
124
+ }
125
+ padZero(num) {
126
+ return num.toString().padStart(2, "0");
127
+ }
128
+ onCancel() {
129
+ this.modalRef.close();
130
+ }
131
+ onSubmit() {
132
+ if (this.createTripsheetForm.invalid) {
133
+ return;
134
+ }
135
+ const formValue = this.createTripsheetForm.value;
136
+ const pickupTime = `${formValue.date} ${formValue.hours.value}/${formValue.mins.value}/00`;
137
+ const pickupTimeDate = dayjs(pickupTime, PICKUP_TIME_FORMAT).toDate();
138
+ if (this.isDateAndTimeFromPast(pickupTimeDate)) {
139
+ this.toast.displayMsg("Please select a future date and time.");
140
+ return;
141
+ }
142
+ if (this.categoryDropdownData.length > 0 && (!formValue.tripCategory || !formValue.tripCategory.value)) {
143
+ this.toast.displayMsg("Please provide a trip category.");
144
+ return;
145
+ }
146
+ if (formValue.location?.value?.type === this.TYPE_OTHER) {
147
+ if (!formValue.otherAddress || formValue.otherAddress.trim() === "") {
148
+ this.toast.displayMsg("Please provide the address.");
149
+ return;
150
+ }
151
+ if (formValue.otherAddress.includes(",")) {
152
+ this.toast.displayMsg("Special character (,) not allowed in address.");
153
+ return;
154
+ }
155
+ }
156
+ this.isSubmitting = true;
157
+ this.http.createEmptyIrregularTripSheet(this.modalData.nonce, formValue.direction).subscribe({
158
+ next: routeTripSheet => {
159
+ const pickupLoc = routeTripSheet.dir === "IN" ? this.modalData.employee.home : this.getLocation(formValue);
160
+ const dropLoc = routeTripSheet.dir === "OUT" ? this.modalData.employee.home : this.getLocation(formValue);
161
+ const pickupTimeFormatted = pickupTime;
162
+ const dropTimeFormatted = pickupTime;
163
+ const employee = { ...this.modalData.employee, employee_status: 1 };
164
+ const addEmployeeParams = {
165
+ tripsheet: routeTripSheet,
166
+ employee: employee,
167
+ pickupLoc: pickupLoc,
168
+ dropLoc: dropLoc,
169
+ pickUpTime: pickupTimeFormatted,
170
+ dropTime: dropTimeFormatted,
171
+ position: 0,
172
+ routeSource: this.modalData.routeSource,
173
+ assetList: this.modalData.assetList
174
+ };
175
+ this.http.addEmployeeToTripSheet(this.modalData.nonce, addEmployeeParams).subscribe({
176
+ next: updatedTripSheet => {
177
+ if (!updatedTripSheet.customMap) {
178
+ updatedTripSheet.customMap = {};
179
+ }
180
+ updatedTripSheet.customMap.tripCategory = formValue.tripCategory?.value || "";
181
+ this.modalRef.close({
182
+ success: true,
183
+ tripsheet: updatedTripSheet
184
+ });
185
+ },
186
+ error: error => {
187
+ console.error("Error adding employee to tripsheet:", error);
188
+ this.toast.displayMsg("Failed to add employee to tripsheet. Please try again.");
189
+ this.isSubmitting = false;
190
+ }
191
+ });
192
+ },
193
+ error: error => {
194
+ console.error("Error creating tripsheet:", error);
195
+ this.toast.displayMsg("Failed to create tripsheet. Please try again.");
196
+ this.isSubmitting = false;
197
+ }
198
+ });
199
+ }
200
+ isDateAndTimeFromPast(date) {
201
+ const now = new Date();
202
+ return date < now;
203
+ }
204
+ getLocation(formValue) {
205
+ const location = formValue.location?.value;
206
+ if (!location) {
207
+ return null;
208
+ }
209
+ const locType = location.type;
210
+ switch (locType) {
211
+ case this.TYPE_OFFICE:
212
+ return location.office;
213
+ case this.TYPE_TRANSPORT:
214
+ return {
215
+ id: null,
216
+ type: this.TYPE_TRANSPORT,
217
+ address: "Airport",
218
+ geoCord: null
219
+ };
220
+ case this.TYPE_OTHER:
221
+ return {
222
+ ...location.office,
223
+ address: formValue.otherAddress || ""
224
+ };
225
+ }
226
+ }
227
+ }
228
+ CreateNonShiftModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateNonShiftModalComponent, deps: [{ token: MODAL_DATA_VAR }, { token: i1.ModalRef }, { token: i2.FormBuilder }, { token: i3.HttpService }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
229
+ CreateNonShiftModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CreateNonShiftModalComponent, selector: "app-create-non-shift-modal", ngImport: i0, template: "<div class=\"createTripsheet\">\n <h2 class=\"modal-header\">Create Non-Shift Tripsheet</h2>\n\n <div *ngIf=\"loading\" class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading...</p>\n </div>\n\n <form\n *ngIf=\"!loading && createTripsheetForm\"\n [formGroup]=\"createTripsheetForm\"\n (ngSubmit)=\"onSubmit()\"\n class=\"createTripsheetForm\"\n id=\"createTripsheetForm\"\n >\n <div class=\"form-content\">\n <!-- Radio buttons row -->\n <div [ngClass]=\"{ 'radio-row': true, disabled: modalData?.shiftSelectionDisabled }\">\n <label class=\"radio-label\">\n <input class=\"modern-checkbox\" type=\"radio\" formControlName=\"direction\" value=\"OUT\" id=\"startLoc\" />\n <span>Start Location Fixed (Logout)</span>\n </label>\n <label class=\"radio-label\">\n <input class=\"modern-checkbox\" type=\"radio\" formControlName=\"direction\" value=\"IN\" id=\"endLoc\" />\n <span>End Location Fixed (Login)</span>\n </label>\n </div>\n\n <!-- Location field -->\n <div class=\"form-field\">\n <div class=\"label-cell\">\n <label class=\"locText\">Location</label>\n </div>\n <div class=\"input-cell\">\n <mis-dropdown\n [searchEnabled]=\"true\"\n [width]=\"'100%'\"\n [height]=\"'40px'\"\n [data]=\"locationDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('location')?.value\"\n [label]=\"'Select location...'\"\n (onChange)=\"createTripsheetForm.get('location')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n\n <!-- Other address field -->\n <div class=\"form-field otherAddress\" *ngIf=\"showOtherAddress\">\n <div class=\"label-cell\">\n <label>Pick/Drop point <sup>*</sup></label>\n </div>\n <div class=\"input-cell\">\n <input type=\"text\" formControlName=\"otherAddress\" class=\"modern-input\" />\n </div>\n </div>\n\n <!-- Trip category field -->\n <div class=\"form-field\" *ngIf=\"categoryDropdownData.length > 0\">\n <div class=\"label-cell\">\n <label>Trip Category</label>\n </div>\n <div class=\"input-cell\">\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'250px'\"\n [height]=\"'40px'\"\n [data]=\"categoryDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('tripCategory')?.value\"\n [label]=\"'Select category...'\"\n (onChange)=\"createTripsheetForm.get('tripCategory')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n\n <!-- Time field -->\n <div class=\"form-field\">\n <div class=\"label-cell\">\n <label class=\"fixedTimeText\">Time</label>\n </div>\n <div class=\"input-cell modern-date-container\">\n <div class=\"date-select\">\n <input\n misTzDp\n readonly\n [dpConfig]=\"dateConfig\"\n [formControl]=\"createTripsheetForm.get('date')\"\n style=\"height: 44px !important; font-size: 16px !important; cursor: pointer; vertical-align: middle !important\"\n />\n <img [src]=\"CONSTANTS_ASSETS_WIS_COMMON.IMAGES.CALENDAR_ICON\" alt=\"Calendar Icon\" class=\"date-icon data-picker-icon\" />\n </div>\n\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'5rem'\"\n [height]=\"'40px'\"\n [data]=\"hoursDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('hours')?.value\"\n [label]=\"'HH'\"\n (onChange)=\"createTripsheetForm.get('hours')?.setValue($event)\"\n ></mis-dropdown>\n\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'5rem'\"\n [height]=\"'40px'\"\n [data]=\"minutesDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('mins')?.value\"\n [label]=\"'MM'\"\n (onChange)=\"createTripsheetForm.get('mins')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n </div>\n\n <div class=\"form-actions\">\n <button mis-button type=\"outline\" (click)=\"onCancel()\" [disabled]=\"isSubmitting\">Cancel</button>\n <button mis-button type=\"primary\" [disabled]=\"isSubmitting || createTripsheetForm?.invalid\">\n {{ isSubmitting ? \"Creating...\" : \"Create\" }}\n </button>\n </div>\n </form>\n</div>\n", styles: [".createTripsheet{width:40rem;margin:auto;background:#fff;border-radius:.5rem;padding:1.25rem}.createTripsheet .modal-header{font-size:1.25rem;font-weight:600;color:#333;margin:0 0 1.25rem;padding-bottom:.9375rem;border-bottom:.0625rem solid #e0e0e0}.createTripsheet .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3.75rem 1.25rem;min-height:12.5rem}.createTripsheet .loading-container .spinner{border:.1875rem solid #f3f3f3;border-top:.1875rem solid #007bff;border-radius:50%;width:2.5rem;height:2.5rem;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.createTripsheet .createTripsheetForm .form-content{display:flex;flex-direction:column}.createTripsheet .createTripsheetForm .form-field{display:flex;align-items:flex-start;gap:1.25rem;padding:.9375rem 0}.createTripsheet .createTripsheetForm .form-field .label-cell{flex:0 0 30%;padding-top:.5rem}.createTripsheet .createTripsheetForm .form-field .label-cell label{font-size:.875rem;font-weight:500;color:#333}.createTripsheet .createTripsheetForm .form-field .input-cell{flex:1;display:flex}.createTripsheet .createTripsheetForm .radio-row{display:flex;gap:1.25rem;padding:.9375rem 0}.createTripsheet .createTripsheetForm .radio-label{font-size:.875rem;display:flex;align-items:center;cursor:pointer;margin:0}.createTripsheet .createTripsheetForm .radio-label .modern-checkbox{margin-right:.625rem;vertical-align:sub;cursor:pointer;width:1rem;height:1rem;accent-color:#007bff}.createTripsheet .createTripsheetForm .radio-label span{-webkit-user-select:none;user-select:none;white-space:nowrap}.createTripsheet .createTripsheetForm .modern-input{width:100%;padding:.5rem .75rem;border:.0625rem solid #ddd;border-radius:.25rem;font-size:.875rem;transition:border-color .3s}.createTripsheet .createTripsheetForm .modern-input:focus{outline:none;border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.createTripsheet .createTripsheetForm .modern-input:disabled{background-color:#f5f5f5;cursor:not-allowed}.createTripsheet .createTripsheetForm sup{color:#dc3545}.createTripsheet .createTripsheetForm ::ng-deep mis-dropdown{display:block;width:100%}.createTripsheet .createTripsheetForm .modern-date-container{position:inherit;float:inherit;display:flex;align-items:center;gap:.625rem}.createTripsheet .createTripsheetForm .ng-invalid{border:.0625rem solid #dc3545}.createTripsheet .createTripsheetForm .form-actions{text-align:right;margin:.625rem;border-top:.0625rem solid #e0e0e0;padding:.625rem;display:flex;justify-content:flex-end;gap:.625rem;margin-bottom:0}.createTripsheet .createTripsheetForm .form-actions button{padding:.625rem 1.5rem;font-size:.875rem;font-weight:500;border-radius:.375rem;border:none;cursor:pointer;transition:all .3s ease;min-width:6.25rem}.createTripsheet .createTripsheetForm .form-actions button[type=primary]{background-color:#0937b2;color:#fff;border:.0625rem solid #0937b2}.createTripsheet .createTripsheetForm .form-actions button[type=outline]{background-color:transparent;color:#6c757d;border:.0625rem solid #ddd}.createTripsheet .createTripsheetForm .form-actions button:disabled{opacity:.6;cursor:not-allowed;box-shadow:none}.date-select{height:2.5rem;border:.0625rem solid #e0e0e0;padding:0;border-radius:.375rem;display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;position:relative;overflow:hidden;left:-.5%;flex-shrink:0}.date-select input{background-color:transparent;display:inline-block;padding:.25rem 0 .25rem .75rem;width:100%;border:none;outline:none;cursor:pointer;font-size:.875rem}.date-select img{position:relative;right:1rem}.radio-row.disabled{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.DropdownComponent, selector: "mis-dropdown", inputs: ["data", "height", "ariaLabel", "width", "label", "itemSizeForCdk", "showOnlyIcon", "higlightSelectedValue", "dropdownListHeight", "dropdownListWidth", "dropdownListPosition", "config", "searchEnabled", "selectedItem", "noDataMessage", "multiLine", "additionalInfoMessage", "scrollIntoView", "searchLabel", "customStyles", "activeItem"], outputs: ["onChange"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i7.TzDatepickerDirective, selector: "input[misTzDp]", inputs: ["dpConfig", "selectedDate", "datesDisabled", "dateMessages", "positionX", "positionY", "offsetX", "offsetY", "allowBookingOnDisabledDay", "disableBoxShadow", "disableOverLay", "openElement"], outputs: ["dateChange"] }] });
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CreateNonShiftModalComponent, decorators: [{
231
+ type: Component,
232
+ args: [{ selector: "app-create-non-shift-modal", template: "<div class=\"createTripsheet\">\n <h2 class=\"modal-header\">Create Non-Shift Tripsheet</h2>\n\n <div *ngIf=\"loading\" class=\"loading-container\">\n <div class=\"spinner\"></div>\n <p>Loading...</p>\n </div>\n\n <form\n *ngIf=\"!loading && createTripsheetForm\"\n [formGroup]=\"createTripsheetForm\"\n (ngSubmit)=\"onSubmit()\"\n class=\"createTripsheetForm\"\n id=\"createTripsheetForm\"\n >\n <div class=\"form-content\">\n <!-- Radio buttons row -->\n <div [ngClass]=\"{ 'radio-row': true, disabled: modalData?.shiftSelectionDisabled }\">\n <label class=\"radio-label\">\n <input class=\"modern-checkbox\" type=\"radio\" formControlName=\"direction\" value=\"OUT\" id=\"startLoc\" />\n <span>Start Location Fixed (Logout)</span>\n </label>\n <label class=\"radio-label\">\n <input class=\"modern-checkbox\" type=\"radio\" formControlName=\"direction\" value=\"IN\" id=\"endLoc\" />\n <span>End Location Fixed (Login)</span>\n </label>\n </div>\n\n <!-- Location field -->\n <div class=\"form-field\">\n <div class=\"label-cell\">\n <label class=\"locText\">Location</label>\n </div>\n <div class=\"input-cell\">\n <mis-dropdown\n [searchEnabled]=\"true\"\n [width]=\"'100%'\"\n [height]=\"'40px'\"\n [data]=\"locationDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('location')?.value\"\n [label]=\"'Select location...'\"\n (onChange)=\"createTripsheetForm.get('location')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n\n <!-- Other address field -->\n <div class=\"form-field otherAddress\" *ngIf=\"showOtherAddress\">\n <div class=\"label-cell\">\n <label>Pick/Drop point <sup>*</sup></label>\n </div>\n <div class=\"input-cell\">\n <input type=\"text\" formControlName=\"otherAddress\" class=\"modern-input\" />\n </div>\n </div>\n\n <!-- Trip category field -->\n <div class=\"form-field\" *ngIf=\"categoryDropdownData.length > 0\">\n <div class=\"label-cell\">\n <label>Trip Category</label>\n </div>\n <div class=\"input-cell\">\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'250px'\"\n [height]=\"'40px'\"\n [data]=\"categoryDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('tripCategory')?.value\"\n [label]=\"'Select category...'\"\n (onChange)=\"createTripsheetForm.get('tripCategory')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n\n <!-- Time field -->\n <div class=\"form-field\">\n <div class=\"label-cell\">\n <label class=\"fixedTimeText\">Time</label>\n </div>\n <div class=\"input-cell modern-date-container\">\n <div class=\"date-select\">\n <input\n misTzDp\n readonly\n [dpConfig]=\"dateConfig\"\n [formControl]=\"createTripsheetForm.get('date')\"\n style=\"height: 44px !important; font-size: 16px !important; cursor: pointer; vertical-align: middle !important\"\n />\n <img [src]=\"CONSTANTS_ASSETS_WIS_COMMON.IMAGES.CALENDAR_ICON\" alt=\"Calendar Icon\" class=\"date-icon data-picker-icon\" />\n </div>\n\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'5rem'\"\n [height]=\"'40px'\"\n [data]=\"hoursDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('hours')?.value\"\n [label]=\"'HH'\"\n (onChange)=\"createTripsheetForm.get('hours')?.setValue($event)\"\n ></mis-dropdown>\n\n <mis-dropdown\n [searchEnabled]=\"false\"\n [width]=\"'5rem'\"\n [height]=\"'40px'\"\n [data]=\"minutesDropdownData\"\n [selectedItem]=\"createTripsheetForm.get('mins')?.value\"\n [label]=\"'MM'\"\n (onChange)=\"createTripsheetForm.get('mins')?.setValue($event)\"\n ></mis-dropdown>\n </div>\n </div>\n </div>\n\n <div class=\"form-actions\">\n <button mis-button type=\"outline\" (click)=\"onCancel()\" [disabled]=\"isSubmitting\">Cancel</button>\n <button mis-button type=\"primary\" [disabled]=\"isSubmitting || createTripsheetForm?.invalid\">\n {{ isSubmitting ? \"Creating...\" : \"Create\" }}\n </button>\n </div>\n </form>\n</div>\n", styles: [".createTripsheet{width:40rem;margin:auto;background:#fff;border-radius:.5rem;padding:1.25rem}.createTripsheet .modal-header{font-size:1.25rem;font-weight:600;color:#333;margin:0 0 1.25rem;padding-bottom:.9375rem;border-bottom:.0625rem solid #e0e0e0}.createTripsheet .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3.75rem 1.25rem;min-height:12.5rem}.createTripsheet .loading-container .spinner{border:.1875rem solid #f3f3f3;border-top:.1875rem solid #007bff;border-radius:50%;width:2.5rem;height:2.5rem;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.createTripsheet .createTripsheetForm .form-content{display:flex;flex-direction:column}.createTripsheet .createTripsheetForm .form-field{display:flex;align-items:flex-start;gap:1.25rem;padding:.9375rem 0}.createTripsheet .createTripsheetForm .form-field .label-cell{flex:0 0 30%;padding-top:.5rem}.createTripsheet .createTripsheetForm .form-field .label-cell label{font-size:.875rem;font-weight:500;color:#333}.createTripsheet .createTripsheetForm .form-field .input-cell{flex:1;display:flex}.createTripsheet .createTripsheetForm .radio-row{display:flex;gap:1.25rem;padding:.9375rem 0}.createTripsheet .createTripsheetForm .radio-label{font-size:.875rem;display:flex;align-items:center;cursor:pointer;margin:0}.createTripsheet .createTripsheetForm .radio-label .modern-checkbox{margin-right:.625rem;vertical-align:sub;cursor:pointer;width:1rem;height:1rem;accent-color:#007bff}.createTripsheet .createTripsheetForm .radio-label span{-webkit-user-select:none;user-select:none;white-space:nowrap}.createTripsheet .createTripsheetForm .modern-input{width:100%;padding:.5rem .75rem;border:.0625rem solid #ddd;border-radius:.25rem;font-size:.875rem;transition:border-color .3s}.createTripsheet .createTripsheetForm .modern-input:focus{outline:none;border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.createTripsheet .createTripsheetForm .modern-input:disabled{background-color:#f5f5f5;cursor:not-allowed}.createTripsheet .createTripsheetForm sup{color:#dc3545}.createTripsheet .createTripsheetForm ::ng-deep mis-dropdown{display:block;width:100%}.createTripsheet .createTripsheetForm .modern-date-container{position:inherit;float:inherit;display:flex;align-items:center;gap:.625rem}.createTripsheet .createTripsheetForm .ng-invalid{border:.0625rem solid #dc3545}.createTripsheet .createTripsheetForm .form-actions{text-align:right;margin:.625rem;border-top:.0625rem solid #e0e0e0;padding:.625rem;display:flex;justify-content:flex-end;gap:.625rem;margin-bottom:0}.createTripsheet .createTripsheetForm .form-actions button{padding:.625rem 1.5rem;font-size:.875rem;font-weight:500;border-radius:.375rem;border:none;cursor:pointer;transition:all .3s ease;min-width:6.25rem}.createTripsheet .createTripsheetForm .form-actions button[type=primary]{background-color:#0937b2;color:#fff;border:.0625rem solid #0937b2}.createTripsheet .createTripsheetForm .form-actions button[type=outline]{background-color:transparent;color:#6c757d;border:.0625rem solid #ddd}.createTripsheet .createTripsheetForm .form-actions button:disabled{opacity:.6;cursor:not-allowed;box-shadow:none}.date-select{height:2.5rem;border:.0625rem solid #e0e0e0;padding:0;border-radius:.375rem;display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;position:relative;overflow:hidden;left:-.5%;flex-shrink:0}.date-select input{background-color:transparent;display:inline-block;padding:.25rem 0 .25rem .75rem;width:100%;border:none;outline:none;cursor:pointer;font-size:.875rem}.date-select img{position:relative;right:1rem}.radio-row.disabled{pointer-events:none;opacity:.5}\n"] }]
233
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
234
+ type: Inject,
235
+ args: [MODAL_DATA_VAR]
236
+ }] }, { type: i1.ModalRef }, { type: i2.FormBuilder }, { type: i3.HttpService }, { type: i4.ToastService }]; } });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW5vbi1zaGlmdC1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvd2lzLWNvbW1vbi9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLW5vbi1zaGlmdC1tb2RhbC9jcmVhdGUtbm9uLXNoaWZ0LW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy93aXMtY29tbW9uL3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtbm9uLXNoaWZ0LW1vZGFsL2NyZWF0ZS1ub24tc2hpZnQtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUcvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFZLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7OztBQUczRSxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFaEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO0FBQzFGLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUNqQyxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO0FBaUJqRCxNQUFNLE9BQU8sNEJBQTRCO0lBNEJ2QyxZQUEyQyxTQUFjLEVBQVUs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QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0UsNEJBQTRCOzswQkFnQ3pCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IGN1c3RvbVBhcnNlRm9ybWF0IGZyb20gXCJkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXRcIjtcbmltcG9ydCB7IElEYXRlUGlja2VyQ29uZmlnIH0gZnJvbSBcIm1pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vZGF0ZXBpY2tlcl92MlwiO1xuaW1wb3J0IHsgQ09OU1RBTlRTX0FTU0VUU19XSVNfQ09NTU9OIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hc3NldHMuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9odHRwLnNlcnZpY2VcIjtcbmltcG9ydCB7IERyb3Bkb3duSXRlbSB9IGZyb20gXCJtaXMtY3J5c3RhbC1kZXNpZ24tc3lzdGVtL2Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgTU9EQUxfREFUQV9WQVIsIE1vZGFsUmVmIH0gZnJvbSBcIm1pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vbW9kYWxcIjtcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJtaXMtY3J5c3RhbC1kZXNpZ24tc3lzdGVtL3RvYXN0XCI7XG5cbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5cbmNvbnN0IFBST1BFUlRJRVMgPSBbXCJOT05fU0hJRlRfVFJJUFNfQ0FURUdPUklFU1wiLCBcIlVTRV9WQUxJRF9PRkZJQ0VfRk9SX0lSUkVHVUxBUl9UUklQU1wiXTtcbmNvbnN0IERBVEVfRk9STUFUID0gXCJERC9NTS9ZWVlZXCI7XG5jb25zdCBQSUNLVVBfVElNRV9GT1JNQVQgPSBcIkREL01NL1lZWVkgSEgvbW0vc3NcIjtcblxuaW50ZXJmYWNlIExvY2F0aW9uVmFsdWUge1xuICB0eXBlOiBudW1iZXI7XG4gIG9mZmljZTogYW55IHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIExvY2F0aW9uRHJvcGRvd25JdGVtIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IExvY2F0aW9uVmFsdWU7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLW5vbi1zaGlmdC1tb2RhbFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NyZWF0ZS1ub24tc2hpZnQtbW9kYWwuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2NyZWF0ZS1ub24tc2hpZnQtbW9kYWwuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlTm9uU2hpZnRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIENPTlNUQU5UU19BU1NFVFNfV0lTX0NPTU1PTiA9IENPTlNUQU5UU19BU1NFVFNfV0lTX0NPTU1PTjtcblxuICBkYXRlQ29uZmlnOiBQYXJ0aWFsPElEYXRlUGlja2VyQ29uZmlnPiA9IHtcbiAgICBtaW5EYXRlOiBkYXlqcygpLmZvcm1hdChEQVRFX0ZPUk1BVCksXG4gICAgZm9ybWF0OiBEQVRFX0ZPUk1BVFxuICB9O1xuICBjcmVhdGVUcmlwc2hlZXRGb3JtITogRm9ybUdyb3VwO1xuICBvZmZpY2VzOiBEcm9wZG93bkl0ZW1bXSA9IFtdO1xuXG4gIGxvY2F0aW9uRHJvcGRvd25EYXRhOiBMb2NhdGlvbkRyb3Bkb3duSXRlbVtdID0gW107XG5cbiAgY2F0ZWdvcnlEcm9wZG93bkRhdGE6IERyb3Bkb3duSXRlbVtdID0gW107XG5cbiAgaG91cnNEcm9wZG93bkRhdGE6IERyb3Bkb3duSXRlbVtdID0gW107XG5cbiAgbWludXRlc0Ryb3Bkb3duRGF0YTogRHJvcGRvd25JdGVtW10gPSBbXTtcblxuICBzaG93T3RoZXJBZGRyZXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSBUWVBFX09GRklDRSA9IDY7XG4gIHJlYWRvbmx5IFRZUEVfVFJBTlNQT1JUID0gMztcbiAgcmVhZG9ubHkgVFlQRV9PVEhFUiA9IDQ7XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE1PREFMX0RBVEFfVkFSKSBwdWJsaWMgbW9kYWxEYXRhOiBhbnksIHByaXZhdGUgbW9kYWxSZWY6IE1vZGFsUmVmLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBodHRwOiBIdHRwU2VydmljZSxwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0ICRvZmZpY2UgPSB0aGlzLmh0dHAuZ2V0T2ZmaWNlcyh0aGlzLm1vZGFsRGF0YS5ub25jZSk7XG4gICAgY29uc3QgJHByb3BlcnRpZXMgPSB0aGlzLmh0dHAuZ2V0UHJvcGVydGllcyhQUk9QRVJUSUVTKTtcblxuICAgIGZvcmtKb2luKFskb2ZmaWNlLCAkcHJvcGVydGllc10pXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoW29mZmljZXMsIHByb3BlcnRpZXNdKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplRHJvcGRvd25EYXRhKG9mZmljZXMpO1xuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtTGlzdGVuZXJzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgZm9ybSBkYXRhOlwiLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5tb2RhbFJlZi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLm1vZGFsRGF0YT8uZGF0ZSA/PyBkYXlqcygpLmZvcm1hdChEQVRFX0ZPUk1BVCk7XG5cbiAgICB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGRpcmVjdGlvbjogW3RoaXMubW9kYWxEYXRhPy5zaGlmdFR5cGUgPT09IFwibG9nb3V0XCIgPyBcIk9VVFwiIDogXCJJTlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGxvY2F0aW9uOiBbeyBsYWJlbDogXCJcIiwgdmFsdWU6IFwiXCIgfV0sXG4gICAgICBvdGhlckFkZHJlc3M6IFwiXCIsXG4gICAgICB0cmlwQ2F0ZWdvcnk6IFt7IGxhYmVsOiBcIlwiLCB2YWx1ZTogXCJcIiB9XSxcbiAgICAgIGRhdGU6IFtjdXJyZW50VGltZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBob3VyczogW3sgbGFiZWw6IFwiXCIsIHZhbHVlOiBcIlwiIH1dLFxuICAgICAgbWluczogW3sgbGFiZWw6IFwiXCIsIHZhbHVlOiBcIlwiIH1dXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEcm9wZG93bkRhdGEob2ZmaWNlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2NhdGlvbkRyb3Bkb3duRGF0YSA9IG9mZmljZXMubWFwKFxuICAgICAgKG9mZmljZTogYW55KTogTG9jYXRpb25Ecm9wZG93bkl0ZW0gPT4gKHtcbiAgICAgICAgbGFiZWw6IG9mZmljZS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogeyB0eXBlOiB0aGlzLlRZUEVfT0ZGSUNFLCBvZmZpY2U6IG9mZmljZSB8fCBudWxsIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KFwibG9jYXRpb25cIik/LnNldFZhbHVlKHRoaXMubG9jYXRpb25Ecm9wZG93bkRhdGFbMF0pO1xuXG4gICAgaWYgKCF0aGlzLnByb3BlcnRpZXM/LltcIlVTRV9WQUxJRF9PRkZJQ0VfRk9SX0lSUkVHVUxBUl9UUklQU1wiXSkge1xuICAgICAgdGhpcy5sb2NhdGlvbkRyb3Bkb3duRGF0YS5wdXNoKFxuICAgICAgICB7IGxhYmVsOiBcIkFpcnBvcnRcIiwgdmFsdWU6IHsgdHlwZTogdGhpcy5UWVBFX1RSQU5TUE9SVCwgb2ZmaWNlOiBudWxsIH0gfSBhcyBMb2NhdGlvbkRyb3Bkb3duSXRlbSxcbiAgICAgICAgeyBsYWJlbDogXCJPdGhlclwiLCB2YWx1ZTogeyB0eXBlOiB0aGlzLlRZUEVfT1RIRVIsIG9mZmljZTogbnVsbCB9IH0gYXMgTG9jYXRpb25Ecm9wZG93bkl0ZW1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjYXRlZ29yeSBkcm9wZG93blxuICAgIGNvbnN0IGNhdGVnb3JpZXNTdHJpbmcgPSB0aGlzLnByb3BlcnRpZXM/LltcIk5PTl9TSElGVF9UUklQU19DQVRFR09SSUVTXCJdO1xuICAgIGlmIChjYXRlZ29yaWVzU3RyaW5nICYmIHR5cGVvZiBjYXRlZ29yaWVzU3RyaW5nID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gY2F0ZWdvcmllc1N0cmluZy5zcGxpdChcIixcIikuZmlsdGVyKGNhdCA9PiBjYXQgJiYgY2F0LnRyaW0oKSk7XG4gICAgICBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlEcm9wZG93bkRhdGEgPSBjYXRlZ29yaWVzLm1hcChjYXRlZ29yeSA9PiAoe1xuICAgICAgICAgIGxhYmVsOiBjYXRlZ29yeS50cmltKCksXG4gICAgICAgICAgdmFsdWU6IGNhdGVnb3J5LnRyaW0oKVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEhvdXIgPSBuZXcgRGF0ZSgpLmdldEhvdXJzKCk7XG4gICAgdGhpcy5ob3Vyc0Ryb3Bkb3duRGF0YSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiAoe1xuICAgICAgbGFiZWw6IHRoaXMucGFkWmVybyhpKSxcbiAgICAgIHZhbHVlOiB0aGlzLnBhZFplcm8oaSlcbiAgICB9KSk7XG4gICAgdGhpcy5jcmVhdGVUcmlwc2hlZXRGb3JtLnBhdGNoVmFsdWUoeyBob3VyczogdGhpcy5ob3Vyc0Ryb3Bkb3duRGF0YVtjdXJyZW50SG91cl0gfSk7XG5cbiAgICBjb25zdCBjdXJyZW50TWludXRlID0gbmV3IERhdGUoKS5nZXRNaW51dGVzKCk7XG4gICAgdGhpcy5taW51dGVzRHJvcGRvd25EYXRhID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNjAgfSwgKF8sIGkpID0+ICh7XG4gICAgICBsYWJlbDogdGhpcy5wYWRaZXJvKGkpLFxuICAgICAgdmFsdWU6IHRoaXMucGFkWmVybyhpKVxuICAgIH0pKTtcbiAgICB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0ucGF0Y2hWYWx1ZSh7IG1pbnM6IHRoaXMubWludXRlc0Ryb3Bkb3duRGF0YVtjdXJyZW50TWludXRlXSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGb3JtTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlVHJpcHNoZWV0Rm9ybT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBjb25zdCB7IGxvY2F0aW9uIH0gPSB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0/LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuc2hvd090aGVyQWRkcmVzcyAhPT0gKGxvY2F0aW9uPy52YWx1ZT8udHlwZSA9PT0gdGhpcy5UWVBFX09USEVSKSkge1xuICAgICAgICB0aGlzLnNob3dPdGhlckFkZHJlc3MgPSBsb2NhdGlvbj8udmFsdWU/LnR5cGUgPT09IHRoaXMuVFlQRV9PVEhFUjtcbiAgICAgICAgaWYgKHRoaXMuc2hvd090aGVyQWRkcmVzcykge1xuICAgICAgICAgIHRoaXMuY3JlYXRlVHJpcHNoZWV0Rm9ybS5nZXQoXCJvdGhlckFkZHJlc3NcIik/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KFwib3RoZXJBZGRyZXNzXCIpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KFwib3RoZXJBZGRyZXNzXCIpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBhZFplcm8obnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBudW0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKCk7XG4gIH1cblxuICBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jcmVhdGVUcmlwc2hlZXRGb3JtLmludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmNyZWF0ZVRyaXBzaGVldEZvcm0udmFsdWU7XG5cbiAgICBjb25zdCBwaWNrdXBUaW1lID0gYCR7Zm9ybVZhbHVlLmRhdGV9ICR7Zm9ybVZhbHVlLmhvdXJzLnZhbHVlfS8ke2Zvcm1WYWx1ZS5taW5zLnZhbHVlfS8wMGA7XG4gICAgY29uc3QgcGlja3VwVGltZURhdGUgPSBkYXlqcyhwaWNrdXBUaW1lLCBQSUNLVVBfVElNRV9GT1JNQVQpLnRvRGF0ZSgpO1xuICAgIGlmICh0aGlzLmlzRGF0ZUFuZFRpbWVGcm9tUGFzdChwaWNrdXBUaW1lRGF0ZSkpIHtcbiAgICAgIHRoaXMudG9hc3QuZGlzcGxheU1zZyhcIlBsZWFzZSBzZWxlY3QgYSBmdXR1cmUgZGF0ZSBhbmQgdGltZS5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlEcm9wZG93bkRhdGEubGVuZ3RoID4gMCAmJiAoIWZvcm1WYWx1ZS50cmlwQ2F0ZWdvcnkgfHwgIWZvcm1WYWx1ZS50cmlwQ2F0ZWdvcnkudmFsdWUpKSB7XG4gICAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coXCJQbGVhc2UgcHJvdmlkZSBhIHRyaXAgY2F0ZWdvcnkuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtVmFsdWUubG9jYXRpb24/LnZhbHVlPy50eXBlID09PSB0aGlzLlRZUEVfT1RIRVIpIHtcbiAgICAgIGlmICghZm9ybVZhbHVlLm90aGVyQWRkcmVzcyB8fCBmb3JtVmFsdWUub3RoZXJBZGRyZXNzLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coXCJQbGVhc2UgcHJvdmlkZSB0aGUgYWRkcmVzcy5cIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUub3RoZXJBZGRyZXNzLmluY2x1ZGVzKFwiLFwiKSkge1xuICAgICAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coXCJTcGVjaWFsIGNoYXJhY3RlciAoLCkgbm90IGFsbG93ZWQgaW4gYWRkcmVzcy5cIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XG5cbiAgICB0aGlzLmh0dHAuY3JlYXRlRW1wdHlJcnJlZ3VsYXJUcmlwU2hlZXQodGhpcy5tb2RhbERhdGEubm9uY2UsIGZvcm1WYWx1ZS5kaXJlY3Rpb24pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByb3V0ZVRyaXBTaGVldCA9PiB7XG4gICAgICAgIGNvbnN0IHBpY2t1cExvYyA9IHJvdXRlVHJpcFNoZWV0LmRpciA9PT0gXCJJTlwiID8gdGhpcy5tb2RhbERhdGEuZW1wbG95ZWUuaG9tZSA6IHRoaXMuZ2V0TG9jYXRpb24oZm9ybVZhbHVlKTtcbiAgICAgICAgY29uc3QgZHJvcExvYyA9IHJvdXRlVHJpcFNoZWV0LmRpciA9PT0gXCJPVVRcIiA/IHRoaXMubW9kYWxEYXRhLmVtcGxveWVlLmhvbWUgOiB0aGlzLmdldExvY2F0aW9uKGZvcm1WYWx1ZSk7XG4gICAgICAgIGNvbnN0IHBpY2t1cFRpbWVGb3JtYXR0ZWQgPSBwaWNrdXBUaW1lO1xuICAgICAgICBjb25zdCBkcm9wVGltZUZvcm1hdHRlZCA9IHBpY2t1cFRpbWU7XG5cbiAgICAgICAgY29uc3QgZW1wbG95ZWUgPSB7IC4uLnRoaXMubW9kYWxEYXRhLmVtcGxveWVlLCBlbXBsb3llZV9zdGF0dXM6IDEgfTtcblxuICAgICAgICBjb25zdCBhZGRFbXBsb3llZVBhcmFtcyA9IHtcbiAgICAgICAgICB0cmlwc2hlZXQ6IHJvdXRlVHJpcFNoZWV0LFxuICAgICAgICAgIGVtcGxveWVlOiBlbXBsb3llZSxcbiAgICAgICAgICBwaWNrdXBMb2M6IHBpY2t1cExvYyxcbiAgICAgICAgICBkcm9wTG9jOiBkcm9wTG9jLFxuICAgICAgICAgIHBpY2tVcFRpbWU6IHBpY2t1cFRpbWVGb3JtYXR0ZWQsXG4gICAgICAgICAgZHJvcFRpbWU6IGRyb3BUaW1lRm9ybWF0dGVkLFxuICAgICAgICAgIHBvc2l0aW9uOiAwLFxuICAgICAgICAgIHJvdXRlU291cmNlOiB0aGlzLm1vZGFsRGF0YS5yb3V0ZVNvdXJjZSxcbiAgICAgICAgICBhc3NldExpc3Q6IHRoaXMubW9kYWxEYXRhLmFzc2V0TGlzdFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaHR0cC5hZGRFbXBsb3llZVRvVHJpcFNoZWV0KHRoaXMubW9kYWxEYXRhLm5vbmNlLCBhZGRFbXBsb3llZVBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiB1cGRhdGVkVHJpcFNoZWV0ID0+IHtcbiAgICAgICAgICAgIGlmICghdXBkYXRlZFRyaXBTaGVldC5jdXN0b21NYXApIHtcbiAgICAgICAgICAgICAgdXBkYXRlZFRyaXBTaGVldC5jdXN0b21NYXAgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZWRUcmlwU2hlZXQuY3VzdG9tTWFwLnRyaXBDYXRlZ29yeSA9IGZvcm1WYWx1ZS50cmlwQ2F0ZWdvcnk/LnZhbHVlIHx8IFwiXCI7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2Uoe1xuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB0cmlwc2hlZXQ6IHVwZGF0ZWRUcmlwU2hlZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBhZGRpbmcgZW1wbG95ZWUgdG8gdHJpcHNoZWV0OlwiLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coXCJGYWlsZWQgdG8gYWRkIGVtcGxveWVlIHRvIHRyaXBzaGVldC4gUGxlYXNlIHRyeSBhZ2Fpbi5cIik7XG4gICAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIHRyaXBzaGVldDpcIiwgZXJyb3IpO1xuICAgICAgICB0aGlzLnRvYXN0LmRpc3BsYXlNc2coXCJGYWlsZWQgdG8gY3JlYXRlIHRyaXBzaGVldC4gUGxlYXNlIHRyeSBhZ2Fpbi5cIik7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZUFuZFRpbWVGcm9tUGFzdChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSA8IG5vdztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9jYXRpb24oZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZm9ybVZhbHVlLmxvY2F0aW9uPy52YWx1ZTtcblxuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY1R5cGUgPSBsb2NhdGlvbi50eXBlO1xuXG4gICAgc3dpdGNoIChsb2NUeXBlKSB7XG4gICAgICBjYXNlIHRoaXMuVFlQRV9PRkZJQ0U6XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5vZmZpY2U7XG5cbiAgICAgIGNhc2UgdGhpcy5UWVBFX1RSQU5TUE9SVDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICB0eXBlOiB0aGlzLlRZUEVfVFJBTlNQT1JULFxuICAgICAgICAgIGFkZHJlc3M6IFwiQWlycG9ydFwiLFxuICAgICAgICAgIGdlb0NvcmQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSB0aGlzLlRZUEVfT1RIRVI6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ubG9jYXRpb24ub2ZmaWNlLFxuICAgICAgICAgIGFkZHJlc3M6IGZvcm1WYWx1ZS5vdGhlckFkZHJlc3MgfHwgXCJcIlxuICAgICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNyZWF0ZVRyaXBzaGVldFwiPlxuICA8aDIgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5DcmVhdGUgTm9uLVNoaWZ0IFRyaXBzaGVldDwvaDI+XG5cbiAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICA8cD5Mb2FkaW5nLi4uPC9wPlxuICA8L2Rpdj5cblxuICA8Zm9ybVxuICAgICpuZ0lmPVwiIWxvYWRpbmcgJiYgY3JlYXRlVHJpcHNoZWV0Rm9ybVwiXG4gICAgW2Zvcm1Hcm91cF09XCJjcmVhdGVUcmlwc2hlZXRGb3JtXCJcbiAgICAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiXG4gICAgY2xhc3M9XCJjcmVhdGVUcmlwc2hlZXRGb3JtXCJcbiAgICBpZD1cImNyZWF0ZVRyaXBzaGVldEZvcm1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGVudFwiPlxuICAgICAgPCEtLSBSYWRpbyBidXR0b25zIHJvdyAtLT5cbiAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyAncmFkaW8tcm93JzogdHJ1ZSwgZGlzYWJsZWQ6IG1vZGFsRGF0YT8uc2hpZnRTZWxlY3Rpb25EaXNhYmxlZCB9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kZXJuLWNoZWNrYm94XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGlyZWN0aW9uXCIgdmFsdWU9XCJPVVRcIiBpZD1cInN0YXJ0TG9jXCIgLz5cbiAgICAgICAgICA8c3Bhbj5TdGFydCBMb2NhdGlvbiBGaXhlZCAoTG9nb3V0KTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtb2Rlcm4tY2hlY2tib3hcIiB0eXBlPVwicmFkaW9cIiBmb3JtQ29udHJvbE5hbWU9XCJkaXJlY3Rpb25cIiB2YWx1ZT1cIklOXCIgaWQ9XCJlbmRMb2NcIiAvPlxuICAgICAgICAgIDxzcGFuPkVuZCBMb2NhdGlvbiBGaXhlZCAoTG9naW4pPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9jYXRpb24gZmllbGQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY2VsbFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxvY1RleHRcIj5Mb2NhdGlvbjwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY2VsbFwiPlxuICAgICAgICAgIDxtaXMtZHJvcGRvd25cbiAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIicxMDAlJ1wiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICBbZGF0YV09XCJsb2NhdGlvbkRyb3Bkb3duRGF0YVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRJdGVtXT1cImNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KCdsb2NhdGlvbicpPy52YWx1ZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBsb2NhdGlvbi4uLidcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KCdsb2NhdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9taXMtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gT3RoZXIgYWRkcmVzcyBmaWVsZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIG90aGVyQWRkcmVzc1wiICpuZ0lmPVwic2hvd090aGVyQWRkcmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY2VsbFwiPlxuICAgICAgICAgIDxsYWJlbD5QaWNrL0Ryb3AgcG9pbnQgPHN1cD4qPC9zdXA+PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jZWxsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwib3RoZXJBZGRyZXNzXCIgY2xhc3M9XCJtb2Rlcm4taW5wdXRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRyaXAgY2F0ZWdvcnkgZmllbGQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ0lmPVwiY2F0ZWdvcnlEcm9wZG93bkRhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY2VsbFwiPlxuICAgICAgICAgIDxsYWJlbD5UcmlwIENhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jZWxsXCI+XG4gICAgICAgICAgPG1pcy1kcm9wZG93blxuICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIicyNTBweCdcIlxuICAgICAgICAgICAgW2hlaWdodF09XCInNDBweCdcIlxuICAgICAgICAgICAgW2RhdGFdPVwiY2F0ZWdvcnlEcm9wZG93bkRhdGFcIlxuICAgICAgICAgICAgW3NlbGVjdGVkSXRlbV09XCJjcmVhdGVUcmlwc2hlZXRGb3JtLmdldCgndHJpcENhdGVnb3J5Jyk/LnZhbHVlXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGNhdGVnb3J5Li4uJ1wiXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwiY3JlYXRlVHJpcHNoZWV0Rm9ybS5nZXQoJ3RyaXBDYXRlZ29yeScpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9taXMtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGltZSBmaWVsZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jZWxsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZml4ZWRUaW1lVGV4dFwiPlRpbWU8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNlbGwgbW9kZXJuLWRhdGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWlzVHpEcFxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICBbZHBDb25maWddPVwiZGF0ZUNvbmZpZ1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjcmVhdGVUcmlwc2hlZXRGb3JtLmdldCgnZGF0ZScpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDQ0cHggIWltcG9ydGFudDsgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7IGN1cnNvcjogcG9pbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZSAhaW1wb3J0YW50XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiQ09OU1RBTlRTX0FTU0VUU19XSVNfQ09NTU9OLklNQUdFUy5DQUxFTkRBUl9JQ09OXCIgYWx0PVwiQ2FsZW5kYXIgSWNvblwiIGNsYXNzPVwiZGF0ZS1pY29uIGRhdGEtcGlja2VyLWljb25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPG1pcy1kcm9wZG93blxuICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIic1cmVtJ1wiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICBbZGF0YV09XCJob3Vyc0Ryb3Bkb3duRGF0YVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRJdGVtXT1cImNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KCdob3VycycpPy52YWx1ZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ0hIJ1wiXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwiY3JlYXRlVHJpcHNoZWV0Rm9ybS5nZXQoJ2hvdXJzJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgID48L21pcy1kcm9wZG93bj5cblxuICAgICAgICAgIDxtaXMtZHJvcGRvd25cbiAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCInNXJlbSdcIlxuICAgICAgICAgICAgW2hlaWdodF09XCInNDBweCdcIlxuICAgICAgICAgICAgW2RhdGFdPVwibWludXRlc0Ryb3Bkb3duRGF0YVwiXG4gICAgICAgICAgICBbc2VsZWN0ZWRJdGVtXT1cImNyZWF0ZVRyaXBzaGVldEZvcm0uZ2V0KCdtaW5zJyk/LnZhbHVlXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInTU0nXCJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjcmVhdGVUcmlwc2hlZXRGb3JtLmdldCgnbWlucycpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9taXMtZHJvcGRvd24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIG1pcy1idXR0b24gdHlwZT1cIm91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmdcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWlzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmcgfHwgY3JlYXRlVHJpcHNoZWV0Rm9ybT8uaW52YWxpZFwiPlxuICAgICAgICB7eyBpc1N1Ym1pdHRpbmcgPyBcIkNyZWF0aW5nLi4uXCIgOiBcIkNyZWF0ZVwiIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /** @format */
2
+ export const CONSTANTS_ASSETS_WIS_COMMON = {
3
+ IMAGES: {
4
+ CALENDAR_ICON: "assets/libraries/wis-common/calendar.svg"
5
+ },
6
+ ICONS: {}
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLmNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy93aXMtY29tbW9uL3NyYy9saWIvY29uc3RhbnRzL2Fzc2V0cy5jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUVkLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHO0lBQ3pDLE1BQU0sRUFBRTtRQUNOLGFBQWEsRUFBRSwwQ0FBMEM7S0FDMUQ7SUFDRCxLQUFLLEVBQUUsRUFBRTtDQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGZvcm1hdCAqL1xuXG5leHBvcnQgY29uc3QgQ09OU1RBTlRTX0FTU0VUU19XSVNfQ09NTU9OID0ge1xuICBJTUFHRVM6IHtcbiAgICBDQUxFTkRBUl9JQ09OOiBcImFzc2V0cy9saWJyYXJpZXMvd2lzLWNvbW1vbi9jYWxlbmRhci5zdmdcIlxuICB9LFxuICBJQ09OUzoge31cbn07XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  /** @format */
2
2
  export {};
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL3dpcy1jb21tb24vc3JjL2xpYi9tb2RlbHMvZW52Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGZvcm1hdCAqL1xuXG5leHBvcnQgbmFtZXNwYWNlIE5zV0lTQ29tbW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBJRW52IHtcbiAgICBlbXBFeHA6IHN0cmluZztcbiAgICB0bXM6IHN0cmluZztcbiAgfVxufVxuIl19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL3dpcy1jb21tb24vc3JjL2xpYi9tb2RlbHMvZW52Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGZvcm1hdCAqL1xuXG5leHBvcnQgbmFtZXNwYWNlIE5zV0lTQ29tbW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBJRW52IHtcbiAgICBlbXBFeHA6IHN0cmluZztcbiAgICB0bXM6IHN0cmluZztcbiAgICBldHM/OiBzdHJpbmc7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy93aXMtY29tbW9uL3NyYy9saWIvbW9kZWxzL3Nlc3Npb24ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBuYW1lc3BhY2UgTnNTZXNzaW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBJQ2xhaW1zIHtcbiAgICBzdWI/OiBzdHJpbmc7XG4gICAgZW1wbG95ZWVHVUlEPzogc3RyaW5nO1xuICAgIGVtcGxveWVlSWQ/OiBzdHJpbmc7XG4gICAgaW50ZXJuYWxfc3NvX3JvbGU/OiBzdHJpbmc7XG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAgIGxvZ2dlZEluVXNlcj86IHN0cmluZztcbiAgICB2ZXRVc2VyRW1haWxJZD86IHN0cmluZztcbiAgICB2ZXRVc2VySWQ/OiBudW1iZXI7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIHJvbGVzPzogc3RyaW5nW107XG4gICAgZXhwPzogbnVtYmVyOyAvLyBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaFxuICAgIGlhdD86IG51bWJlcjtcbiAgICBidXNpbmVzc1VuaXRJZD86IHN0cmluZztcbiAgICBBTExPV0VEX0JVSURTPzogc3RyaW5nW107XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIElJbml0Q29uZmlnIHtcbiAgICBzZXNzaW9uVG9rZW5Db29raWVLZXk/OiBzdHJpbmc7XG4gICAgdmV0VG9rZW5Db29raWVLZXk/OiBzdHJpbmc7XG4gIH1cbn1cbiJdfQ==
@@ -1,27 +1,47 @@
1
1
  import { Inject, Injectable } from "@angular/core";
2
+ import { map } from "rxjs";
2
3
  import { CONSTANTS_WIS_COMMON } from "../constants/emp-web-exp.constants";
3
4
  import * as i0 from "@angular/core";
4
- import * as i1 from "../modules/auth/auth.service";
5
- import * as i2 from "@angular/common/http";
5
+ import * as i1 from "@angular/common/http";
6
6
  const API_URLS = {
7
7
  CONFIGURATIONS: "configurations"
8
8
  };
9
9
  export class HttpService {
10
- constructor(env, auth, http) {
10
+ constructor(env, http) {
11
11
  this.env = env;
12
- this.auth = auth;
13
12
  this.http = http;
14
13
  }
15
- getConfigurations() {
16
- return this.http.get(`${this.env.empExp}/${this.auth.userDetails.buid}/${API_URLS.CONFIGURATIONS}`);
14
+ getProperties(Porperties) {
15
+ return this.http.get(`${this.env.ets}/ets/apis/properties/${Porperties.join(",")}`).pipe(map((res) => {
16
+ return res.reduce((acc, item) => {
17
+ acc[item.propertyName] = item.propertyValue === "true" ? true : item.propertyValue === "false" ? false : item.propertyValue;
18
+ return acc;
19
+ }, {});
20
+ }));
21
+ }
22
+ getOffices(nonce) {
23
+ const body = `CSRF_NONCE=${nonce}&method=getOfficeList`;
24
+ return this.http.post(`${this.env.ets}/Locality_Servlet`, body, { headers: { "Content-Type": "application/x-www-form-urlencoded" } });
25
+ }
26
+ listTransportLocalities(nonce) {
27
+ const body = `CSRF_NONCE=${nonce}&method=listTransportLocalities`;
28
+ return this.http.post(`${this.env.ets}/Locality_Servlet`, body, { headers: { "Content-Type": "application/x-www-form-urlencoded" } });
29
+ }
30
+ createEmptyIrregularTripSheet(nonce, direction) {
31
+ const body = `CSRF_NONCE=${nonce}&method=createEmptyIrregularTripSheet&direction=${direction}`;
32
+ return this.http.post(`${this.env.ets}/Tripsheet_Edit_Servlet`, body, { headers: { "Content-Type": "application/x-www-form-urlencoded" } });
33
+ }
34
+ addEmployeeToTripSheet(nonce, params) {
35
+ const body = `CSRF_NONCE=${nonce}&method=addEmployeeToTripSheet&tripsheet=${encodeURIComponent(JSON.stringify(params.tripsheet))}&employee=${encodeURIComponent(JSON.stringify(params.employee))}&pickupLoc=${encodeURIComponent(JSON.stringify(params.pickupLoc))}&dropLoc=${encodeURIComponent(JSON.stringify(params.dropLoc))}&pickUpTime="${params.pickUpTime}"&dropTime="${params.dropTime}"&position=${params.position}${params.routeSource ? "&routeSource=" + params.routeSource : ""}${params.assetList ? "&assetList=" + encodeURIComponent(JSON.stringify(params.assetList)) : ""}`;
36
+ return this.http.post(`${this.env.ets}/Tripsheet_Edit_Servlet`, body, { headers: { "Content-Type": "application/x-www-form-urlencoded" } });
17
37
  }
18
38
  }
19
- HttpService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HttpService, deps: [{ token: CONSTANTS_WIS_COMMON }, { token: i1.AuthService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
39
+ HttpService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HttpService, deps: [{ token: CONSTANTS_WIS_COMMON }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
20
40
  HttpService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HttpService });
21
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: HttpService, decorators: [{
22
42
  type: Injectable
23
43
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
24
44
  type: Inject,
25
45
  args: [CONSTANTS_WIS_COMMON]
26
- }] }, { type: i1.AuthService }, { type: i2.HttpClient }]; } });
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL3dpcy1jb21tb24vc3JjL2xpYi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7QUFLMUUsTUFBTSxRQUFRLEdBQUc7SUFDZixjQUFjLEVBQUUsZ0JBQWdCO0NBQ2pDLENBQUM7QUFHRixNQUFNLE9BQU8sV0FBVztJQUN0QixZQUFpRCxHQUFxQixFQUFVLElBQWlCLEVBQVUsSUFBZ0I7UUFBMUUsUUFBRyxHQUFILEdBQUcsQ0FBa0I7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUFHLENBQUM7SUFFL0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBc0MsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDM0ksQ0FBQzs7d0dBTFUsV0FBVyxrQkFDRixvQkFBb0I7NEdBRDdCLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsVUFBVTs7MEJBRUksTUFBTTsyQkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDT05TVEFOVFNfV0lTX0NPTU1PTiB9IGZyb20gXCIuLi9jb25zdGFudHMvZW1wLXdlYi1leHAuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOc1dJU0NvbmZpZ3VyYXRpb25zIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWd1cmF0aW9ucy5tb2RlbFwiO1xuaW1wb3J0IHsgTnNXSVNDb21tb24gfSBmcm9tIFwiLi4vbW9kZWxzL2Vudi5tb2RlbFwiO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi4vbW9kdWxlcy9hdXRoL2F1dGguc2VydmljZVwiO1xuXG5jb25zdCBBUElfVVJMUyA9IHtcbiAgQ09ORklHVVJBVElPTlM6IFwiY29uZmlndXJhdGlvbnNcIlxufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEh0dHBTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoQEluamVjdChDT05TVEFOVFNfV0lTX0NPTU1PTikgcHVibGljIGVudjogTnNXSVNDb21tb24uSUVudiwgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7fVxuXG4gIGdldENvbmZpZ3VyYXRpb25zKCk6IE9ic2VydmFibGU8TnNXSVNDb25maWd1cmF0aW9ucy5JQ29uZmlndXJhdGlvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc1dJU0NvbmZpZ3VyYXRpb25zLklDb25maWd1cmF0aW9ucz4oYCR7dGhpcy5lbnYuZW1wRXhwfS8ke3RoaXMuYXV0aC51c2VyRGV0YWlscy5idWlkfS8ke0FQSV9VUkxTLkNPTkZJR1VSQVRJT05TfWApO1xuICB9XG59XG4iXX0=
46
+ }] }, { type: i1.HttpClient }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL3dpcy1jb21tb24vc3JjL2xpYi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7O0FBSzFFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDO0FBR0YsTUFBTSxPQUFPLFdBQVc7SUFDdEIsWUFBaUQsR0FBcUIsRUFBVSxJQUFnQjtRQUEvQyxRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7SUFBRyxDQUFDO0lBRXBHLGFBQWEsQ0FBQyxVQUFvQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHdCQUF3QixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RGLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLElBQVMsRUFBRSxFQUFFO2dCQUN4QyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzVILE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBSztRQUNkLE1BQU0sSUFBSSxHQUFHLGNBQWMsS0FBSyx1QkFBdUIsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBSztRQUMzQixNQUFNLElBQUksR0FBRyxjQUFjLEtBQUssaUNBQWlDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsbUNBQW1DLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUVELDZCQUE2QixDQUFDLEtBQWEsRUFBRSxTQUFpQjtRQUM1RCxNQUFNLElBQUksR0FBRyxjQUFjLEtBQUssbURBQW1ELFNBQVMsRUFBRSxDQUFDO1FBQy9GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcseUJBQXlCLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLG1DQUFtQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlJLENBQUM7SUFFRCxzQkFBc0IsQ0FDcEIsS0FBYSxFQUNiLE1BVUM7UUFFRCxNQUFNLElBQUksR0FBRyxjQUFjLEtBQUssNENBQTRDLGtCQUFrQixDQUM1RixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDakMsYUFBYSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLGtCQUFrQixDQUMvRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDakMsWUFBWSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsTUFBTSxDQUFDLFVBQVUsZUFBZSxNQUFNLENBQUMsUUFBUSxjQUM1SCxNQUFNLENBQUMsUUFDVCxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQy9ELE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM1RixFQUFFLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHlCQUF5QixFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5SSxDQUFDOzt3R0FyRFUsV0FBVyxrQkFDRixvQkFBb0I7NEdBRDdCLFdBQVc7MkZBQVgsV0FBVztrQkFEdkIsVUFBVTs7MEJBRUksTUFBTTsyQkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENPTlNUQU5UU19XSVNfQ09NTU9OIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9lbXAtd2ViLWV4cC5jb25zdGFudHNcIjtcbmltcG9ydCB7IE5zV0lTQ29uZmlndXJhdGlvbnMgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZ3VyYXRpb25zLm1vZGVsXCI7XG5pbXBvcnQgeyBOc1dJU0NvbW1vbiB9IGZyb20gXCIuLi9tb2RlbHMvZW52Lm1vZGVsXCI7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gXCIuLi9tb2R1bGVzL2F1dGgvYXV0aC5zZXJ2aWNlXCI7XG5cbmNvbnN0IEFQSV9VUkxTID0ge1xuICBDT05GSUdVUkFUSU9OUzogXCJjb25maWd1cmF0aW9uc1wiXG59O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KENPTlNUQU5UU19XSVNfQ09NTU9OKSBwdWJsaWMgZW52OiBOc1dJU0NvbW1vbi5JRW52LCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgZ2V0UHJvcGVydGllcyhQb3JwZXJ0aWVzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW52LmV0c30vZXRzL2FwaXMvcHJvcGVydGllcy8ke1BvcnBlcnRpZXMuam9pbihcIixcIil9YCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlcy5yZWR1Y2UoKGFjYzogYW55LCBpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBhY2NbaXRlbS5wcm9wZXJ0eU5hbWVdID0gaXRlbS5wcm9wZXJ0eVZhbHVlID09PSBcInRydWVcIiA/IHRydWUgOiBpdGVtLnByb3BlcnR5VmFsdWUgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDogaXRlbS5wcm9wZXJ0eVZhbHVlO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldE9mZmljZXMobm9uY2UpIHtcbiAgICBjb25zdCBib2R5ID0gYENTUkZfTk9OQ0U9JHtub25jZX0mbWV0aG9kPWdldE9mZmljZUxpc3RgO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudi5ldHN9L0xvY2FsaXR5X1NlcnZsZXRgLCBib2R5LCB7IGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiB9IH0pO1xuICB9XG5cbiAgbGlzdFRyYW5zcG9ydExvY2FsaXRpZXMobm9uY2UpIHtcbiAgICBjb25zdCBib2R5ID0gYENTUkZfTk9OQ0U9JHtub25jZX0mbWV0aG9kPWxpc3RUcmFuc3BvcnRMb2NhbGl0aWVzYDtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5lbnYuZXRzfS9Mb2NhbGl0eV9TZXJ2bGV0YCwgYm9keSwgeyBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSB9KTtcbiAgfVxuXG4gIGNyZWF0ZUVtcHR5SXJyZWd1bGFyVHJpcFNoZWV0KG5vbmNlOiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBib2R5ID0gYENTUkZfTk9OQ0U9JHtub25jZX0mbWV0aG9kPWNyZWF0ZUVtcHR5SXJyZWd1bGFyVHJpcFNoZWV0JmRpcmVjdGlvbj0ke2RpcmVjdGlvbn1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudi5ldHN9L1RyaXBzaGVldF9FZGl0X1NlcnZsZXRgLCBib2R5LCB7IGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiB9IH0pO1xuICB9XG5cbiAgYWRkRW1wbG95ZWVUb1RyaXBTaGVldChcbiAgICBub25jZTogc3RyaW5nLFxuICAgIHBhcmFtczoge1xuICAgICAgdHJpcHNoZWV0OiBhbnk7XG4gICAgICBlbXBsb3llZTogYW55O1xuICAgICAgcGlja3VwTG9jOiBhbnk7XG4gICAgICBkcm9wTG9jOiBhbnk7XG4gICAgICBwaWNrVXBUaW1lOiBzdHJpbmc7XG4gICAgICBkcm9wVGltZTogc3RyaW5nO1xuICAgICAgcG9zaXRpb246IG51bWJlcjtcbiAgICAgIHJvdXRlU291cmNlPzogc3RyaW5nO1xuICAgICAgYXNzZXRMaXN0PzogYW55O1xuICAgIH1cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBib2R5ID0gYENTUkZfTk9OQ0U9JHtub25jZX0mbWV0aG9kPWFkZEVtcGxveWVlVG9UcmlwU2hlZXQmdHJpcHNoZWV0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zLnRyaXBzaGVldClcbiAgICApfSZlbXBsb3llZT0ke2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShwYXJhbXMuZW1wbG95ZWUpKX0mcGlja3VwTG9jPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zLnBpY2t1cExvYylcbiAgICApfSZkcm9wTG9jPSR7ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHBhcmFtcy5kcm9wTG9jKSl9JnBpY2tVcFRpbWU9XCIke3BhcmFtcy5waWNrVXBUaW1lfVwiJmRyb3BUaW1lPVwiJHtwYXJhbXMuZHJvcFRpbWV9XCImcG9zaXRpb249JHtcbiAgICAgIHBhcmFtcy5wb3NpdGlvblxuICAgIH0ke3BhcmFtcy5yb3V0ZVNvdXJjZSA/IFwiJnJvdXRlU291cmNlPVwiICsgcGFyYW1zLnJvdXRlU291cmNlIDogXCJcIn0ke1xuICAgICAgcGFyYW1zLmFzc2V0TGlzdCA/IFwiJmFzc2V0TGlzdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShwYXJhbXMuYXNzZXRMaXN0KSkgOiBcIlwiXG4gICAgfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuZW52LmV0c30vVHJpcHNoZWV0X0VkaXRfU2VydmxldGAsIGJvZHksIHsgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiIH0gfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,45 @@
1
+ export class SessionError extends Error {
2
+ }
3
+ export class SessionTokenNotFoundError extends SessionError {
4
+ constructor() {
5
+ super('Session token was not found.');
6
+ this.name = 'SessionTokenNotFoundError';
7
+ }
8
+ }
9
+ export class SessionTokenExpiredError extends SessionError {
10
+ constructor() {
11
+ super('Session token has expired.');
12
+ this.name = 'SessionTokenExpiredError';
13
+ }
14
+ }
15
+ export class SessionTokenInvalidError extends SessionError {
16
+ constructor() {
17
+ super('Session token could not be decoded.');
18
+ this.name = 'SessionTokenInvalidError';
19
+ }
20
+ }
21
+ export class SessionClaimNotFoundError extends SessionError {
22
+ constructor(claim) {
23
+ super(`Session claim "${claim}" was not found in the token.`);
24
+ this.claim = claim;
25
+ this.name = 'SessionClaimNotFoundError';
26
+ }
27
+ }
28
+ /** Renders failures as `claim (reason), claim (reason)` for error messages. */
29
+ export function describeClaimFailures(failures) {
30
+ return failures.map(f => `${f.claim} (${f.reason})`).join(', ');
31
+ }
32
+ /**
33
+ * Every claim `run`'s `next` failed to read, reported once after the block has finished.
34
+ * Extends `SessionClaimNotFoundError` — and reports the first failure as `claim` — so handlers
35
+ * written against the single-claim error keep working.
36
+ */
37
+ export class SessionClaimsMissingError extends SessionClaimNotFoundError {
38
+ constructor(failures) {
39
+ super(failures[0].claim);
40
+ this.failures = failures;
41
+ this.name = 'SessionClaimsMissingError';
42
+ this.message = `Session claims not found: ${describeClaimFailures(failures)}.`;
43
+ }
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvd2lzLWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL3Nlc3Npb24uZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBZ0IsWUFBYSxTQUFRLEtBQUs7Q0FBRztBQUVuRCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsWUFBWTtJQUN6RDtRQUNFLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLFlBQVk7SUFDeEQ7UUFDRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLDBCQUEwQixDQUFDO0lBQ3pDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxZQUFZO0lBQ3hEO1FBQ0UsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsWUFBWTtJQUN6RCxZQUE0QixLQUFhO1FBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsS0FBSywrQkFBK0IsQ0FBQyxDQUFDO1FBRHBDLFVBQUssR0FBTCxLQUFLLENBQVE7UUFFdkMsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFTRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFFBQWdDO0lBQ3BFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEseUJBQXlCO0lBQ3RFLFlBQTRCLFFBQWdDO1FBQzFELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFEQyxhQUFRLEdBQVIsUUFBUSxDQUF3QjtRQUUxRCxJQUFJLENBQUMsSUFBSSxHQUFHLDJCQUEyQixDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDakYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlc3Npb25FcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVG9rZW5Ob3RGb3VuZEVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1Nlc3Npb24gdG9rZW4gd2FzIG5vdCBmb3VuZC4nKTtcbiAgICB0aGlzLm5hbWUgPSAnU2Vzc2lvblRva2VuTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ub2tlbkV4cGlyZWRFcnJvciBleHRlbmRzIFNlc3Npb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdTZXNzaW9uIHRva2VuIGhhcyBleHBpcmVkLicpO1xuICAgIHRoaXMubmFtZSA9ICdTZXNzaW9uVG9rZW5FeHBpcmVkRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVG9rZW5JbnZhbGlkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignU2Vzc2lvbiB0b2tlbiBjb3VsZCBub3QgYmUgZGVjb2RlZC4nKTtcbiAgICB0aGlzLm5hbWUgPSAnU2Vzc2lvblRva2VuSW52YWxpZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkNsYWltTm90Rm91bmRFcnJvciBleHRlbmRzIFNlc3Npb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjbGFpbTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFNlc3Npb24gY2xhaW0gXCIke2NsYWltfVwiIHdhcyBub3QgZm91bmQgaW4gdGhlIHRva2VuLmApO1xuICAgIHRoaXMubmFtZSA9ICdTZXNzaW9uQ2xhaW1Ob3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBTZXNzaW9uQ2xhaW1GYWlsdXJlUmVhc29uID0gJ2Fic2VudCcgfCAnYmxhbmsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uQ2xhaW1GYWlsdXJlIHtcbiAgY2xhaW06IHN0cmluZztcbiAgcmVhc29uOiBTZXNzaW9uQ2xhaW1GYWlsdXJlUmVhc29uO1xufVxuXG4vKiogUmVuZGVycyBmYWlsdXJlcyBhcyBgY2xhaW0gKHJlYXNvbiksIGNsYWltIChyZWFzb24pYCBmb3IgZXJyb3IgbWVzc2FnZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVDbGFpbUZhaWx1cmVzKGZhaWx1cmVzOiBJU2Vzc2lvbkNsYWltRmFpbHVyZVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZhaWx1cmVzLm1hcChmID0+IGAke2YuY2xhaW19ICgke2YucmVhc29ufSlgKS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGNsYWltIGBydW5gJ3MgYG5leHRgIGZhaWxlZCB0byByZWFkLCByZXBvcnRlZCBvbmNlIGFmdGVyIHRoZSBibG9jayBoYXMgZmluaXNoZWQuXG4gKiBFeHRlbmRzIGBTZXNzaW9uQ2xhaW1Ob3RGb3VuZEVycm9yYCDigJQgYW5kIHJlcG9ydHMgdGhlIGZpcnN0IGZhaWx1cmUgYXMgYGNsYWltYCDigJQgc28gaGFuZGxlcnNcbiAqIHdyaXR0ZW4gYWdhaW5zdCB0aGUgc2luZ2xlLWNsYWltIGVycm9yIGtlZXAgd29ya2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25DbGFpbXNNaXNzaW5nRXJyb3IgZXh0ZW5kcyBTZXNzaW9uQ2xhaW1Ob3RGb3VuZEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGZhaWx1cmVzOiBJU2Vzc2lvbkNsYWltRmFpbHVyZVtdKSB7XG4gICAgc3VwZXIoZmFpbHVyZXNbMF0uY2xhaW0pO1xuICAgIHRoaXMubmFtZSA9ICdTZXNzaW9uQ2xhaW1zTWlzc2luZ0Vycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBgU2Vzc2lvbiBjbGFpbXMgbm90IGZvdW5kOiAke2Rlc2NyaWJlQ2xhaW1GYWlsdXJlcyhmYWlsdXJlcyl9LmA7XG4gIH1cbn1cbiJdfQ==