@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.
- package/esm2020/lib/components/create-non-shift-modal/create-non-shift-modal.component.mjs +237 -0
- package/esm2020/lib/constants/assets.constants.mjs +8 -0
- package/esm2020/lib/models/env.model.mjs +1 -1
- package/esm2020/lib/models/session.model.mjs +2 -0
- package/esm2020/lib/services/http.service.mjs +29 -9
- package/esm2020/lib/services/session.errors.mjs +45 -0
- package/esm2020/lib/services/session.service.mjs +198 -0
- package/esm2020/lib/wis-common.module.mjs +13 -8
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/mis-wis-common.mjs +530 -25
- package/fesm2015/mis-wis-common.mjs.map +1 -1
- package/fesm2020/mis-wis-common.mjs +522 -25
- package/fesm2020/mis-wis-common.mjs.map +1 -1
- package/lib/components/create-non-shift-modal/create-non-shift-modal.component.d.ts +56 -0
- package/lib/constants/assets.constants.d.ts +7 -0
- package/lib/models/env.model.d.ts +1 -0
- package/lib/models/session.model.d.ts +22 -0
- package/lib/services/http.service.d.ts +16 -5
- package/lib/services/session.errors.d.ts +31 -0
- package/lib/services/session.service.d.ts +79 -0
- package/lib/wis-common.module.d.ts +9 -4
- package/package.json +9 -3
- package/public-api.d.ts +4 -0
- package/src/assets/calendar.svg +7 -0
- package/src/assets/images/icons/Wis-icon.svg +4 -0
- package/src/assets/images/icons/brand.png +0 -0
- package/src/assets/images/icons/broascast.svg +3 -0
- package/src/assets/images/icons/bulk-upload.svg +3 -0
- package/src/assets/images/icons/desk-mgmt.svg +6 -0
- package/src/assets/images/icons/employees-sidebar.svg +3 -0
- package/src/assets/images/icons/help-section.svg +4 -0
- package/src/assets/images/icons/home.svg +3 -0
- package/src/assets/images/icons/logout.svg +4 -0
- package/src/assets/images/icons/manage-premise.svg +3 -0
- package/src/assets/images/icons/meeting-room.svg +7 -0
- package/src/assets/images/icons/mis-icon.svg +3 -0
- package/src/assets/images/icons/my-bookings.svg +5 -0
- package/src/assets/images/icons/profile.svg +3 -0
- package/src/assets/images/icons/reception.svg +14 -0
- package/src/assets/images/icons/report.svg +3 -0
- package/src/assets/images/icons/resource-group.svg +3 -0
- package/src/assets/images/icons/roles.svg +3 -0
- package/src/assets/images/icons/sanitize.svg +10 -0
- package/src/assets/images/icons/seat-mgmt.svg +3 -0
- package/src/assets/images/icons/settings-sidebar.svg +3 -0
- package/src/assets/images/icons/signout.svg +4 -0
- package/src/assets/images/icons/user-group.svg +6 -0
- package/src/assets/images/icons/user-permission.svg +5 -0
- package/src/assets/images/icons/utilisation.svg +3 -0
- package/src/assets/images/icons/vaccine_approval.svg +8 -0
- package/src/assets/images/icons/vaccine_upload.png +0 -0
- package/src/assets/images/icons/work-planner-sidebar.svg +3 -0
- 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,
|
|
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 "
|
|
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,
|
|
10
|
+
constructor(env, http) {
|
|
11
11
|
this.env = env;
|
|
12
|
-
this.auth = auth;
|
|
13
12
|
this.http = http;
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
return this.http.get(`${this.env.
|
|
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.
|
|
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.
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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==
|