@eqproject/eqp-dynamic-module 2.6.43 → 2.6.45
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/private/form-records/list-view-form-record/list-view-form-record.component.mjs +18 -16
- package/esm2020/lib/services/db-date.service.mjs +178 -0
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +199 -22
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +199 -22
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.d.ts +3 -1
- package/lib/services/db-date.service.d.ts +24 -0
- package/package.json +1 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class dbDateService {
|
|
4
|
+
//#region datetime
|
|
5
|
+
/**
|
|
6
|
+
* Parse date to visualize as a string
|
|
7
|
+
*/
|
|
8
|
+
parseDate(date) {
|
|
9
|
+
let newYear = date.getFullYear();
|
|
10
|
+
let newMonth = date.getMonth() + 1;
|
|
11
|
+
let newMonthString;
|
|
12
|
+
if (newMonth < 10) {
|
|
13
|
+
newMonthString = "0" + newMonth.toString();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
newMonthString = newMonth.toString();
|
|
17
|
+
}
|
|
18
|
+
let newDay = date.getDate();
|
|
19
|
+
let newDayString;
|
|
20
|
+
if (newDay < 10) {
|
|
21
|
+
newDayString = "0" + newDay.toString();
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
newDayString = newDay.toString();
|
|
25
|
+
}
|
|
26
|
+
let newHour = date.getHours();
|
|
27
|
+
let newHourString;
|
|
28
|
+
if (newHour < 10) {
|
|
29
|
+
newHourString = "0" + newHour.toString();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
newHourString = newHour.toString();
|
|
33
|
+
}
|
|
34
|
+
let newMinute = date.getMinutes();
|
|
35
|
+
let newMinuteString;
|
|
36
|
+
if (newMinute < 10) {
|
|
37
|
+
newMinuteString = "0" + newMinute.toString();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
newMinuteString = newMinute.toString();
|
|
41
|
+
}
|
|
42
|
+
let dateString = newDayString + "/" + newMonthString + "/" + newYear.toString() + " " + newHourString + ":" + newMinuteString;
|
|
43
|
+
return dateString;
|
|
44
|
+
}
|
|
45
|
+
parseTime(date) {
|
|
46
|
+
let newHour = date.getHours();
|
|
47
|
+
let newHourString;
|
|
48
|
+
if (newHour < 10) {
|
|
49
|
+
newHourString = "0" + newHour.toString();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
newHourString = newHour.toString();
|
|
53
|
+
}
|
|
54
|
+
let newMinute = date.getMinutes();
|
|
55
|
+
let newMinuteString;
|
|
56
|
+
if (newMinute < 10) {
|
|
57
|
+
newMinuteString = "0" + newMinute.toString();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
newMinuteString = newMinute.toString();
|
|
61
|
+
}
|
|
62
|
+
let timeString = newHourString + ":" + newMinuteString;
|
|
63
|
+
return timeString;
|
|
64
|
+
}
|
|
65
|
+
addZeroesOnData(numero) {
|
|
66
|
+
let numerostring = "";
|
|
67
|
+
if (numero < 10) {
|
|
68
|
+
numerostring = "0" + numero.toString();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
numerostring = numero.toString();
|
|
72
|
+
}
|
|
73
|
+
return numerostring;
|
|
74
|
+
}
|
|
75
|
+
parseDatefromDB(dirtyDateMeasurement) {
|
|
76
|
+
if (this.isDateFromServer(dirtyDateMeasurement)) {
|
|
77
|
+
let dirtyDate = dirtyDateMeasurement.toString().split("T");
|
|
78
|
+
let dirtyHour = dirtyDate[1].split(".");
|
|
79
|
+
let yearMonthDay = dirtyDate[0].split("-");
|
|
80
|
+
let hourMinuteSecond = dirtyHour[0].split(":");
|
|
81
|
+
let date = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]), parseInt(hourMinuteSecond[1]));
|
|
82
|
+
let gmtString = date.toString().split(" ")[5].split("T")[1];
|
|
83
|
+
let hour = "";
|
|
84
|
+
let minute = "";
|
|
85
|
+
for (let j = 0; j < gmtString.length; j++) {
|
|
86
|
+
if (j == 0) {
|
|
87
|
+
hour += gmtString[j];
|
|
88
|
+
minute += gmtString[j];
|
|
89
|
+
}
|
|
90
|
+
if (j > 0 && j < 3) {
|
|
91
|
+
hour += gmtString[j];
|
|
92
|
+
}
|
|
93
|
+
if (j > 2) {
|
|
94
|
+
minute += gmtString[j];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
let hourInt = parseInt(hour);
|
|
98
|
+
let minuteInt = parseInt(minute);
|
|
99
|
+
let newDate = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]) + hourInt, parseInt(hourMinuteSecond[1]) + minuteInt);
|
|
100
|
+
return newDate;
|
|
101
|
+
}
|
|
102
|
+
else if (this.isDateInstance(dirtyDateMeasurement)) {
|
|
103
|
+
return dirtyDateMeasurement;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
throw new Error("Not Conversion Date in parseDatefromDB");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
isDateFromServer(date) {
|
|
110
|
+
const isoDateFormat = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,7})?(Z)?$/;
|
|
111
|
+
return typeof date === 'string' && isoDateFormat.test(date);
|
|
112
|
+
}
|
|
113
|
+
isDateInstance(date) {
|
|
114
|
+
return date instanceof Date;
|
|
115
|
+
}
|
|
116
|
+
parseDatefromDBMilliseconds(dirtyDateMeasurement) {
|
|
117
|
+
let dirtyDate = dirtyDateMeasurement.toString().split("T");
|
|
118
|
+
let dirtyHour = dirtyDate[1].split(".");
|
|
119
|
+
let yearMonthDay = dirtyDate[0].split("-");
|
|
120
|
+
let hourMinuteSecond = dirtyHour[0].split(":");
|
|
121
|
+
let date = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]), parseInt(hourMinuteSecond[1]));
|
|
122
|
+
let gmtString = date.toString().split(" ")[5].split("T")[1];
|
|
123
|
+
let hour = "";
|
|
124
|
+
let minute = "";
|
|
125
|
+
for (let j = 0; j < gmtString.length; j++) {
|
|
126
|
+
if (j == 0) {
|
|
127
|
+
hour += gmtString[j];
|
|
128
|
+
minute += gmtString[j];
|
|
129
|
+
}
|
|
130
|
+
if (j > 0 && j < 3) {
|
|
131
|
+
hour += gmtString[j];
|
|
132
|
+
}
|
|
133
|
+
if (j > 2) {
|
|
134
|
+
minute += gmtString[j];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
let hourInt = parseInt(hour);
|
|
138
|
+
let minuteInt = parseInt(minute);
|
|
139
|
+
let newDate = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]) + hourInt, parseInt(hourMinuteSecond[1]) + minuteInt, parseInt(hourMinuteSecond[2]), parseInt(dirtyHour[1]));
|
|
140
|
+
return newDate;
|
|
141
|
+
}
|
|
142
|
+
prepareHourforDB(dirtyHour) {
|
|
143
|
+
let hourMinutes = dirtyHour.toString().split(":");
|
|
144
|
+
let date = new Date();
|
|
145
|
+
date.setHours(parseInt(hourMinutes[0]));
|
|
146
|
+
date.setMinutes(parseInt(hourMinutes[1]));
|
|
147
|
+
date.setSeconds(0);
|
|
148
|
+
date.setMilliseconds(0);
|
|
149
|
+
return date;
|
|
150
|
+
}
|
|
151
|
+
parseForHour(allMinutes) {
|
|
152
|
+
let dirtyHours = allMinutes / 60;
|
|
153
|
+
let hours = Math.floor(dirtyHours);
|
|
154
|
+
let dirtyMinutes = dirtyHours - hours;
|
|
155
|
+
let minutes = this.roundDecimals(dirtyMinutes * 0.6, 2);
|
|
156
|
+
let finalHours = hours + minutes;
|
|
157
|
+
return finalHours;
|
|
158
|
+
}
|
|
159
|
+
//#endregion datetime
|
|
160
|
+
/**
|
|
161
|
+
* Rounds a number to the our preferred number of decimal places.
|
|
162
|
+
* @param number the number we want to round
|
|
163
|
+
* @param decimals how many decimal places we want the rounded number to have
|
|
164
|
+
* @returns the rounded number
|
|
165
|
+
*/
|
|
166
|
+
roundDecimals(number, decimals) {
|
|
167
|
+
return Number(number.toFixed(decimals));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
dbDateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
171
|
+
dbDateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, providedIn: "root" });
|
|
172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, decorators: [{
|
|
173
|
+
type: Injectable,
|
|
174
|
+
args: [{
|
|
175
|
+
providedIn: "root",
|
|
176
|
+
}]
|
|
177
|
+
}] });
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvc2VydmljZXMvZGItZGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxhQUFhO0lBRXRCLGtCQUFrQjtJQUNsQjs7T0FFRztJQUNILFNBQVMsQ0FBQyxJQUFVO1FBQ2hCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksY0FBc0IsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUU7WUFDZixjQUFjLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM5QzthQUFNO1lBQ0gsY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4QztRQUNELElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQ2IsWUFBWSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUM7YUFBTTtZQUNILFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDcEM7UUFDRCxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRTtZQUNkLGFBQWEsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzVD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Ozs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7MkdBNUtRLGFBQWE7K0dBQWIsYUFBYSxjQUZWLE1BQU07NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxuICB9KVxyXG5leHBvcnQgY2xhc3MgZGJEYXRlU2VydmljZSB7XHJcblxyXG4gICAgLy8jcmVnaW9uIGRhdGV0aW1lXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIGRhdGUgdG8gdmlzdWFsaXplIGFzIGEgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHBhcnNlRGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbmV3WWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgIGxldCBuZXdNb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICBsZXQgbmV3TW9udGhTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3TW9udGggPCAxMCkge1xyXG4gICAgICAgICAgICBuZXdNb250aFN0cmluZyA9IFwiMFwiICsgbmV3TW9udGgudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdNb250aFN0cmluZyA9IG5ld01vbnRoLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuZXdEYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIGxldCBuZXdEYXlTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3RGF5IDwgMTApIHtcclxuICAgICAgICAgICAgbmV3RGF5U3RyaW5nID0gXCIwXCIgKyBuZXdEYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdEYXlTdHJpbmcgPSBuZXdEYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld0hvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcclxuICAgICAgICBsZXQgbmV3SG91clN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGlmIChuZXdIb3VyIDwgMTApIHtcclxuICAgICAgICAgICAgbmV3SG91clN0cmluZyA9IFwiMFwiICsgbmV3SG91ci50b1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld0hvdXJTdHJpbmcgPSBuZXdIb3VyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuZXdNaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgICAgIGxldCBuZXdNaW51dGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3TWludXRlIDwgMTApIHtcclxuICAgICAgICAgICAgbmV3TWludXRlU3RyaW5nID0gXCIwXCIgKyBuZXdNaW51dGUudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdNaW51dGVTdHJpbmcgPSBuZXdNaW51dGUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGVTdHJpbmcgPSBuZXdEYXlTdHJpbmcgKyBcIi9cIiArIG5ld01vbnRoU3RyaW5nICsgXCIvXCIgKyBuZXdZZWFyLnRvU3RyaW5nKCkgKyBcIiBcIiArIG5ld0hvdXJTdHJpbmcgKyBcIjpcIiArIG5ld01pbnV0ZVN0cmluZztcclxuICAgICAgICByZXR1cm4gZGF0ZVN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHsgLy8gcGFyc2UgZGF0ZSB0byBnZXQgb25seSB0aGUgdGltZVxyXG4gICAgICAgIGxldCBuZXdIb3VyOiBudW1iZXIgPSBkYXRlLmdldEhvdXJzKCk7XHJcbiAgICAgICAgbGV0IG5ld0hvdXJTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3SG91ciA8IDEwKSB7XHJcbiAgICAgICAgICAgIG5ld0hvdXJTdHJpbmcgPSBcIjBcIiArIG5ld0hvdXIudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdIb3VyU3RyaW5nID0gbmV3SG91ci50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbmV3TWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgICAgICBsZXQgbmV3TWludXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKG5ld01pbnV0ZSA8IDEwKSB7XHJcbiAgICAgICAgICAgIG5ld01pbnV0ZVN0cmluZyA9IFwiMFwiICsgbmV3TWludXRlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV3TWludXRlU3RyaW5nID0gbmV3TWludXRlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0aW1lU3RyaW5nID0gbmV3SG91clN0cmluZyArIFwiOlwiICsgbmV3TWludXRlU3RyaW5nO1xyXG4gICAgICAgIHJldHVybiB0aW1lU3RyaW5nXHJcbiAgICB9XHJcblxyXG4gICAgYWRkWmVyb2VzT25EYXRhKG51bWVybzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbnVtZXJvc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiAobnVtZXJvIDwgMTApIHtcclxuICAgICAgICAgICAgbnVtZXJvc3RyaW5nID0gXCIwXCIgKyBudW1lcm8udG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBudW1lcm9zdHJpbmcgPSBudW1lcm8udG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bWVyb3N0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZURhdGVmcm9tREIoZGlydHlEYXRlTWVhc3VyZW1lbnQpOiBEYXRlIHtcclxuICAgICAgICBpZiAodGhpcy5pc0RhdGVGcm9tU2VydmVyKGRpcnR5RGF0ZU1lYXN1cmVtZW50KSkge1xyXG4gICAgICAgICAgICBsZXQgZGlydHlEYXRlOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZU1lYXN1cmVtZW50LnRvU3RyaW5nKCkuc3BsaXQoXCJUXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGlydHlIb3VyOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZVsxXS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgICAgIGxldCB5ZWFyTW9udGhEYXk6IHN0cmluZ1tdID0gZGlydHlEYXRlWzBdLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgbGV0IGhvdXJNaW51dGVTZWNvbmQ6IHN0cmluZ1tdID0gZGlydHlIb3VyWzBdLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh5ZWFyTW9udGhEYXlbMF0pLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMV0pIC0gMSwgcGFyc2VJbnQoeWVhck1vbnRoRGF5WzJdKSwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFswXSksIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMV0pKTtcclxuICAgICAgICAgICAgbGV0IGdtdFN0cmluZyA9IGRhdGUudG9TdHJpbmcoKS5zcGxpdChcIiBcIilbNV0uc3BsaXQoXCJUXCIpWzFdO1xyXG4gICAgICAgICAgICBsZXQgaG91cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBnbXRTdHJpbmcubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBob3VyICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgICAgICAgICBtaW51dGUgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGogPiAwICYmIGogPCAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSBnbXRTdHJpbmdbal07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaiA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW51dGUgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBob3VySW50ID0gcGFyc2VJbnQoaG91cik7XHJcbiAgICAgICAgICAgIGxldCBtaW51dGVJbnQgPSBwYXJzZUludChtaW51dGUpO1xyXG4gICAgICAgICAgICBsZXQgbmV3RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHllYXJNb250aERheVswXSksIHBhcnNlSW50KHllYXJNb250aERheVsxXSkgLSAxLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMl0pLCBwYXJzZUludChob3VyTWludXRlU2Vjb25kWzBdKSArIGhvdXJJbnQsIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMV0pICsgbWludXRlSW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0RhdGVcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0RhdGVJbnN0YW5jZShkaXJ0eURhdGVNZWFzdXJlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcnR5RGF0ZU1lYXN1cmVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IENvbnZlcnNpb24gRGF0ZSBpbiBwYXJzZURhdGVmcm9tREJcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlzRGF0ZUZyb21TZXJ2ZXIoZGF0ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgaXNvRGF0ZUZvcm1hdCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezEsN30pPyhaKT8kLztcclxuICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnICYmIGlzb0RhdGVGb3JtYXQudGVzdChkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0RhdGVJbnN0YW5jZShkYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHBhcnNlRGF0ZWZyb21EQk1pbGxpc2Vjb25kcyhkaXJ0eURhdGVNZWFzdXJlbWVudCk6IERhdGUgeyAvL2dldCBhIGRhdGUgR01UIGluIGFuZ3VsYXIgZm9ybWF0IGZyb20gREIgKG1pbGxpc2Vjb25kIHByZWNpc2lvbilcclxuICAgICAgICBsZXQgZGlydHlEYXRlOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZU1lYXN1cmVtZW50LnRvU3RyaW5nKCkuc3BsaXQoXCJUXCIpO1xyXG4gICAgICAgIGxldCBkaXJ0eUhvdXI6IHN0cmluZ1tdID0gZGlydHlEYXRlWzFdLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgeWVhck1vbnRoRGF5OiBzdHJpbmdbXSA9IGRpcnR5RGF0ZVswXS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgbGV0IGhvdXJNaW51dGVTZWNvbmQ6IHN0cmluZ1tdID0gZGlydHlIb3VyWzBdLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHllYXJNb250aERheVswXSksIHBhcnNlSW50KHllYXJNb250aERheVsxXSkgLSAxLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMl0pLCBwYXJzZUludChob3VyTWludXRlU2Vjb25kWzBdKSwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFsxXSkpO1xyXG4gICAgICAgIGxldCBnbXRTdHJpbmcgPSBkYXRlLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpWzVdLnNwbGl0KFwiVFwiKVsxXTtcclxuICAgICAgICBsZXQgaG91cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgbWludXRlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ210U3RyaW5nLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChqID09IDApIHtcclxuICAgICAgICAgICAgICAgIGhvdXIgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgbWludXRlICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgaiA8IDMpIHtcclxuICAgICAgICAgICAgICAgIGhvdXIgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChqID4gMikge1xyXG4gICAgICAgICAgICAgICAgbWludXRlICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaG91ckludCA9IHBhcnNlSW50KGhvdXIpO1xyXG4gICAgICAgIGxldCBtaW51dGVJbnQgPSBwYXJzZUludChtaW51dGUpO1xyXG4gICAgICAgIGxldCBuZXdEYXRlOiBEYXRlID0gbmV3IERhdGUocGFyc2VJbnQoeWVhck1vbnRoRGF5WzBdKSwgcGFyc2VJbnQoeWVhck1vbnRoRGF5WzFdKSAtIDEsIHBhcnNlSW50KHllYXJNb250aERheVsyXSksIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMF0pICsgaG91ckludCwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFsxXSkgKyBtaW51dGVJbnQsIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMl0pLCBwYXJzZUludChkaXJ0eUhvdXJbMV0pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0RhdGVcclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlSG91cmZvckRCKGRpcnR5SG91cjogRGF0ZSk6IERhdGUge1xyXG4gICAgICAgIGxldCBob3VyTWludXRlcyA9IGRpcnR5SG91ci50b1N0cmluZygpLnNwbGl0KFwiOlwiKVxyXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KGhvdXJNaW51dGVzWzBdKSlcclxuICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQoaG91ck1pbnV0ZXNbMV0pKVxyXG4gICAgICAgIGRhdGUuc2V0U2Vjb25kcygwKVxyXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKDApXHJcbiAgICAgICAgcmV0dXJuIGRhdGVcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZUZvckhvdXIoYWxsTWludXRlczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgZGlydHlIb3VycyA9IGFsbE1pbnV0ZXMgLyA2MDtcclxuICAgICAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKGRpcnR5SG91cnMpO1xyXG4gICAgICAgIGxldCBkaXJ0eU1pbnV0ZXMgPSBkaXJ0eUhvdXJzIC0gaG91cnM7XHJcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSB0aGlzLnJvdW5kRGVjaW1hbHMoZGlydHlNaW51dGVzICogMC42LCAyKTtcclxuICAgICAgICBsZXQgZmluYWxIb3VycyA9IGhvdXJzICsgbWludXRlcztcclxuICAgICAgICByZXR1cm4gZmluYWxIb3Vyc1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uIGRhdGV0aW1lXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm91bmRzIGEgbnVtYmVyIHRvIHRoZSBvdXIgcHJlZmVycmVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cclxuICAgICAqIEBwYXJhbSBudW1iZXIgdGhlIG51bWJlciB3ZSB3YW50IHRvIHJvdW5kXHJcbiAgICAgKiBAcGFyYW0gZGVjaW1hbHMgaG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgd2Ugd2FudCB0aGUgcm91bmRlZCBudW1iZXIgdG8gaGF2ZVxyXG4gICAgICogQHJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyXHJcbiAgICAgKi9cclxuICAgIHJvdW5kRGVjaW1hbHMobnVtYmVyOiBudW1iZXIsIGRlY2ltYWxzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIobnVtYmVyLnRvRml4ZWQoZGVjaW1hbHMpKTtcclxuICAgIH1cclxufSJdfQ==
|