angular-hijri-gregorian-date-time-picker 1.5.0

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oaWpyaS1ncmVnb3JpYW4tZGF0ZXBpY2tlci9zcmMvX2ludGVyZmFjZXMvY2FsZW5kYXItbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTW9udGhJbmZvIHtcbiAgZkQ6IERheUluZm87IC8vIEZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbEQ6IERheUluZm87IC8vIExhc3QgZGF5IG9mIHRoZSBtb250aFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFllYXJEYXRhIHtcbiAgW21vbnRoOiBzdHJpbmddOiBNb250aEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YSB7XG4gIFt5ZWFyOiBzdHJpbmddOiBZZWFyRGF0YTtcbn1cblxuLy8gVGltZSB2YWx1ZSBzdHJ1Y3R1cmUgZm9yIHRpbWUgcGlja2VyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVWYWx1ZSB7XG4gIGhvdXI6IG51bWJlcjsgICAvLyAwLTIzIGZvciAyNC1ob3VyIGZvcm1hdFxuICBtaW51dGU6IG51bWJlcjsgLy8gMC01OVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheUluZm8ge1xuICBnRDogc3RyaW5nOyAvLyBHcmVnb3JpYW4gZGF0ZVxuICB1RDogc3RyaW5nOyAvLyBVbSBhbC1RdXJyYSBkYXRlXG4gIGROOiBzdHJpbmc7IC8vIERheSBuYW1lIHNob3J0aGFuZFxuICB1QzogbnVtYmVyOyAvLyBQbGFjZWhvbGRlciBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIGl0IGluIHRoZSBvdXRwdXRcbiAgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47IC8vIE5ldzogaW5kaWNhdGVzIGlmIGRheSBpcyBkaXNhYmxlZCAob3V0IG9mIG1pbi9tYXggcmFuZ2UpXG4gIHRpbWU/OiBUaW1lVmFsdWU7ICAgLy8gTmV3OiBvcHRpb25hbCB0aW1lIGluZm9ybWF0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9kYXlEYXRlIHtcbiAgZ3JlZ29yaWFuPzogc3RyaW5nO1xuICB1bW1BbFF1cmE/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vbnRoRGF5cyA9IERheUluZm9bXTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLWNvbmZpZy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9faW50ZXJmYWNlcy9zdHlsZXMtY29uZmlnLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIHN0eWxlc0NvbmZpZyB7XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgcHJpbWFyeUNvbG9yPzogc3RyaW5nO1xuICBzZWNvbmRhcnlDb2xvcj86IHN0cmluZztcbiAgdG9kYXlzRGF0ZUJnQ29sb3I/OiBzdHJpbmc7XG4gIHRvZGF5c0RhdGVUZXh0Q29sb3I/OiBzdHJpbmc7XG4gIGNvbmZpcm1CdG5UZXh0Q29sb3I/OiBzdHJpbmc7XG4gIGRpc2FibGVkRGF5Q29sb3I/OiBzdHJpbmc7XG4gIGRheU5hbWVDb2xvcj86IHN0cmluZztcbiAgZGF5Q29sb3I/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,375 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as datesDictionary from '../_data/dictionary.json';
3
+ import * as i0 from "@angular/core";
4
+ export class DateUtilitiesService {
5
+ constructor() {
6
+ this.calendarData = datesDictionary['default']; //prod
7
+ // this.calendarData = datesDictionary; //debug
8
+ }
9
+ parseDate(dateStr) {
10
+ if (!dateStr) {
11
+ return null;
12
+ }
13
+ const parts = dateStr?.split('/');
14
+ if (parts.length !== 3) {
15
+ return null;
16
+ }
17
+ const [day, month, year] = parts.map(Number);
18
+ if (isNaN(day) ||
19
+ isNaN(month) ||
20
+ isNaN(year) ||
21
+ day < 1 ||
22
+ day > 31 ||
23
+ month < 1 ||
24
+ month > 12 ||
25
+ year < 1) {
26
+ return null;
27
+ }
28
+ return new Date(year, month - 1, day);
29
+ }
30
+ formatDate(date) {
31
+ const day = String(date.getDate()).padStart(2, '0');
32
+ const month = String(date.getMonth() + 1).padStart(2, '0');
33
+ const year = date.getFullYear();
34
+ return `${day}/${month}/${year}`;
35
+ }
36
+ getDayShortHand(date) {
37
+ return date.toLocaleString('en-US', { weekday: 'short' });
38
+ }
39
+ generateDates(fD, lD, uC) {
40
+ const startDate = this.parseDate(fD?.gD);
41
+ const endDate = this.parseDate(lD?.gD);
42
+ const daysInMonth = [];
43
+ let currentGregorianDate = new Date(startDate);
44
+ let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);
45
+ let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);
46
+ let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);
47
+ let daysInCurrentUmmAlQuraMonth = uC;
48
+ while (currentGregorianDate <= endDate) {
49
+ const ummAlQuraDate = `${currentUmmAlQuraDay
50
+ .toString()
51
+ .padStart(2, '0')}/${currentUmmAlQuraMonth
52
+ .toString()
53
+ .padStart(2, '0')}/${currentUmmAlQuraYear}`;
54
+ daysInMonth.push({
55
+ gD: this.formatDate(currentGregorianDate),
56
+ uD: ummAlQuraDate,
57
+ dN: this.getDayShortHand(currentGregorianDate),
58
+ uC: 0,
59
+ });
60
+ currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);
61
+ currentUmmAlQuraDay += 1;
62
+ if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {
63
+ currentUmmAlQuraDay = 1;
64
+ currentUmmAlQuraMonth += 1;
65
+ if (currentUmmAlQuraMonth > 12) {
66
+ currentUmmAlQuraMonth = 1;
67
+ currentUmmAlQuraYear += 1;
68
+ }
69
+ const nextMonthData = this.calendarData[currentUmmAlQuraYear.toString()]?.[currentUmmAlQuraMonth.toString()];
70
+ daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;
71
+ }
72
+ }
73
+ return daysInMonth;
74
+ }
75
+ convertDate(dateStr, isGregorian) {
76
+ if (!dateStr)
77
+ return null;
78
+ if (isGregorian) {
79
+ // Preprocess Gregorian date
80
+ const gregorianDate = this.parseDate(dateStr);
81
+ if (!gregorianDate)
82
+ return null;
83
+ const formattedDate = this.formatDate(gregorianDate);
84
+ for (const yearKey in this.calendarData) {
85
+ for (const monthKey in this.calendarData[yearKey]) {
86
+ const monthData = this.calendarData[yearKey][monthKey];
87
+ if (this.isDateInMonthRange(formattedDate, monthData.fD?.gD, monthData.lD?.gD)) {
88
+ const daysInMonth = this.generateDates(monthData.fD, monthData.lD, monthData.fD?.uC);
89
+ const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);
90
+ if (dayMatch)
91
+ return dayMatch;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ else {
97
+ const [day, month, year] = dateStr.split('/').map(Number);
98
+ if (isNaN(day) || isNaN(month) || isNaN(year))
99
+ return null;
100
+ for (const yearKey in this.calendarData) {
101
+ for (const monthKey in this.calendarData[yearKey]) {
102
+ const monthData = this.calendarData[yearKey][monthKey];
103
+ if (this.isDateInMonthRange(`${day}/${month}/${year}`, monthData.fD?.uD, monthData.lD?.uD)) {
104
+ const daysInMonth = this.generateDates(monthData.fD, monthData.lD, monthData.fD?.uC);
105
+ const dayMatch = daysInMonth.find((d) => {
106
+ const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);
107
+ return uDay === day && uMonth === month && uYear === year;
108
+ });
109
+ if (dayMatch)
110
+ return dayMatch;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ isDateInMonthRange(dateToCheck, monthStartDate, monthEndDate) {
118
+ if (!monthStartDate || !monthEndDate)
119
+ return false;
120
+ const checkDate = this.parseDate(dateToCheck);
121
+ const startDate = this.parseDate(monthStartDate);
122
+ const endDate = this.parseDate(monthEndDate);
123
+ if (!checkDate || !startDate || !endDate)
124
+ return false;
125
+ return checkDate >= startDate && checkDate <= endDate;
126
+ }
127
+ getMonthData(inputDate, type) {
128
+ const [day, month, year] = inputDate?.split('/').map(Number);
129
+ let isGregorian;
130
+ if (type == 'greg') {
131
+ isGregorian = true;
132
+ }
133
+ else {
134
+ isGregorian = false;
135
+ }
136
+ if (isGregorian) {
137
+ return this.getGregorianMonthData(day, month, year);
138
+ }
139
+ else {
140
+ return this.getUmAlQurraMonthData(day, month, year);
141
+ }
142
+ }
143
+ getGregorianMonthData(day, month, year) {
144
+ const yearData = this.calendarData[year];
145
+ if (!yearData)
146
+ return null;
147
+ const monthData = yearData[month];
148
+ if (!monthData)
149
+ return null;
150
+ const monthArray = [];
151
+ const endDate = new Date(year, month, 0);
152
+ for (let d = 1; d <= endDate.getDate(); d++) {
153
+ const offset = d - 1;
154
+ monthArray.push({
155
+ gD: `${d.toString().padStart(2, '0')}/${month
156
+ .toString()
157
+ .padStart(2, '0')}/${year}`,
158
+ uD: this.calculateUmAlQurraDate(monthData.fD.uD, offset, monthData.fD.uC),
159
+ dN: this.getDayName(new Date(year, month - 1, d).getDay()),
160
+ uC: monthData.fD.uC,
161
+ });
162
+ }
163
+ return monthArray;
164
+ }
165
+ getUmAlQurraMonthData(day, month, year) {
166
+ for (const gregorianYear in this.calendarData) {
167
+ const yearData = this.calendarData[parseInt(gregorianYear)];
168
+ for (const monthIndex in yearData) {
169
+ const monthData = yearData[parseInt(monthIndex)];
170
+ const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);
171
+ if (fYear === year && fMonth === month) {
172
+ const totalDays = monthData.fD.uC;
173
+ const monthArray = [];
174
+ const umAlQurraStartDate = `01/${month
175
+ .toString()
176
+ .padStart(2, '0')}/${year}`;
177
+ const dayDifference = fDay - 1;
178
+ const startGregorianDate = this.calculateGregorianDate(monthData.fD.gD, -dayDifference);
179
+ for (let i = 0; i < totalDays; i++) {
180
+ const uDate = this.calculateUmAlQurraDate(umAlQurraStartDate, i, totalDays);
181
+ const gDate = this.calculateGregorianDate(startGregorianDate, i);
182
+ const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);
183
+ const dayName = this.getDayName(new Date(gYear, gMonth - 1, gDay).getDay());
184
+ monthArray.push({
185
+ gD: gDate,
186
+ uD: uDate,
187
+ dN: dayName,
188
+ uC: totalDays,
189
+ });
190
+ }
191
+ return monthArray;
192
+ }
193
+ }
194
+ }
195
+ return null;
196
+ }
197
+ calculateGregorianDate(startGDate, offset) {
198
+ const [day, month, year] = startGDate?.split('/').map(Number);
199
+ const newDate = new Date(year, month - 1, day + offset);
200
+ return `${newDate.getDate().toString().padStart(2, '0')}/${(newDate.getMonth() + 1)
201
+ .toString()
202
+ .padStart(2, '0')}/${newDate.getFullYear()}`;
203
+ }
204
+ calculateUmAlQurraDate(startUDate, offset, uC) {
205
+ const [day, month, year] = startUDate?.split('/').map(Number);
206
+ let newDay = day + offset;
207
+ let newMonth = month;
208
+ let newYear = year;
209
+ while (newDay > uC) {
210
+ newDay -= uC;
211
+ newMonth += 1;
212
+ }
213
+ while (newMonth > 12) {
214
+ newMonth = 1;
215
+ newYear += 1;
216
+ }
217
+ return `${newDay.toString().padStart(2, '0')}/${newMonth
218
+ .toString()
219
+ .padStart(2, '0')}/${newYear}`;
220
+ }
221
+ getDayName(dayIndex) {
222
+ const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
223
+ return days[dayIndex];
224
+ }
225
+ /// Check date is it in past or future
226
+ checkPastOrFuture(inputDate, targetDate) {
227
+ if (inputDate) {
228
+ const [day, month, year] = inputDate?.split('/').map(Number);
229
+ const dateToCheck = new Date(year, month - 1, day);
230
+ const today = targetDate;
231
+ today.setHours(0, 0, 0, 0);
232
+ if (dateToCheck > today) {
233
+ return 'Future';
234
+ }
235
+ else if (dateToCheck < today) {
236
+ return 'Past';
237
+ }
238
+ else {
239
+ return 'Today';
240
+ }
241
+ }
242
+ }
243
+ /// Convert english numbers to arabic equivalent
244
+ parseEnglish(englishNum) {
245
+ if (!englishNum)
246
+ return englishNum;
247
+ const numStr = String(englishNum);
248
+ const arabicNumbers = [
249
+ '\u0660',
250
+ '\u0661',
251
+ '\u0662',
252
+ '\u0663',
253
+ '\u0664',
254
+ '\u0665',
255
+ '\u0666',
256
+ '\u0667',
257
+ '\u0668',
258
+ '\u0669',
259
+ ];
260
+ return numStr.replace(/[0-9]/g, (digit) => {
261
+ return arabicNumbers[Number(digit)] || digit;
262
+ });
263
+ }
264
+ /// Convert arabic numbers to english equivalent
265
+ parseArabic(arabicNum) {
266
+ return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d) {
267
+ return d.charCodeAt(0) - 1632;
268
+ });
269
+ }
270
+ ///
271
+ convertDateNumerals(date, targetLang) {
272
+ const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
273
+ const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
274
+ const toArabic = (value) => value
275
+ .split('')
276
+ .map((char) => (/\d/.test(char) ? arabicNumbers[+char] : char))
277
+ .join('');
278
+ const toEnglish = (value) => value
279
+ .split('')
280
+ .map((char) => {
281
+ const index = arabicNumbers.indexOf(char);
282
+ return index > -1 ? englishNumbers[index] : char;
283
+ })
284
+ .join('');
285
+ if (targetLang === 'ar') {
286
+ const [day, month, year] = date.split('/');
287
+ return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;
288
+ }
289
+ else {
290
+ const [year, month, day] = date.split('/');
291
+ return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;
292
+ }
293
+ }
294
+ /**
295
+ * Normalize input date to DD/MM/YYYY string format (Gregorian)
296
+ * Accepts Date object or DD/MM/YYYY string
297
+ */
298
+ normalizeDateToString(date) {
299
+ if (!date)
300
+ return null;
301
+ if (date instanceof Date) {
302
+ return this.formatDate(date);
303
+ }
304
+ // Already a string - validate format
305
+ const parsed = this.parseDate(date);
306
+ return parsed ? this.formatDate(parsed) : null;
307
+ }
308
+ /**
309
+ * Compare two dates (Gregorian format DD/MM/YYYY)
310
+ * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2
311
+ */
312
+ compareDates(date1Str, date2Str) {
313
+ const d1 = this.parseDate(date1Str);
314
+ const d2 = this.parseDate(date2Str);
315
+ if (!d1 || !d2)
316
+ return 0;
317
+ if (d1 < d2)
318
+ return -1;
319
+ if (d1 > d2)
320
+ return 1;
321
+ return 0;
322
+ }
323
+ /**
324
+ * Compare two Hijri dates (UM format DD/MM/YYYY)
325
+ * Converts to Gregorian for comparison
326
+ */
327
+ compareHijriDates(hijri1, hijri2) {
328
+ const day1 = this.convertDate(hijri1, false);
329
+ const day2 = this.convertDate(hijri2, false);
330
+ if (!day1?.gD || !day2?.gD)
331
+ return 0;
332
+ return this.compareDates(day1.gD, day2.gD);
333
+ }
334
+ /**
335
+ * Check if a date is within the specified range (inclusive)
336
+ * All dates in Gregorian DD/MM/YYYY format
337
+ */
338
+ isDateInRange(dateStr, minDateStr, maxDateStr) {
339
+ if (!dateStr)
340
+ return false;
341
+ // If no constraints, date is valid
342
+ if (!minDateStr && !maxDateStr)
343
+ return true;
344
+ // Check minimum constraint
345
+ if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {
346
+ return false;
347
+ }
348
+ // Check maximum constraint
349
+ if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {
350
+ return false;
351
+ }
352
+ return true;
353
+ }
354
+ /**
355
+ * Check if a Hijri date is within the specified range
356
+ * Converts to Gregorian for comparison
357
+ */
358
+ isHijriDateInRange(hijriDateStr, minDateStr, maxDateStr) {
359
+ if (!hijriDateStr)
360
+ return false;
361
+ const dayInfo = this.convertDate(hijriDateStr, false);
362
+ if (!dayInfo?.gD)
363
+ return false;
364
+ return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);
365
+ }
366
+ }
367
+ DateUtilitiesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
368
+ DateUtilitiesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, providedIn: 'root' });
369
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, decorators: [{
370
+ type: Injectable,
371
+ args: [{
372
+ providedIn: 'root',
373
+ }]
374
+ }], ctorParameters: function () { return []; } });
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlsaXRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9fc2VydmljZXMvZGF0ZS11dGlsaXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMEJBQTBCLENBQUM7O0FBTTVELE1BQU0sT0FBTyxvQkFBb0I7SUFHL0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFJLGVBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQy9ELCtDQUErQztJQUNqRCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQWU7UUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNaLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDWCxHQUFHLEdBQUcsQ0FBQztZQUNQLEdBQUcsR0FBRyxFQUFFO1lBQ1IsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsRUFBRTtZQUNWLElBQUksR0FBRyxDQUFDLEVBQ1I7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJ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SUFDSCxhQUFhLENBQ1gsT0FBZSxFQUNmLFVBQXlCLEVBQ3pCLFVBQXlCO1FBRXpCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFM0IsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFNUMsMkJBQTJCO1FBQzNCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQ2hCLFlBQW9CLEVBQ3BCLFVBQXlCLEVBQ3pCLFVBQXlCO1FBRXpCLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O2lIQW5kVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkYXRlc0RpY3Rpb25hcnkgZnJvbSAnLi4vX2RhdGEvZGljdGlvbmFyeS5qc29uJztcbmltcG9ydCB7IERhdGEsIERheUluZm8sIE1vbnRoRGF5cyB9IGZyb20gJy4uL19pbnRlcmZhY2VzL2NhbGVuZGFyLW1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhdGVVdGlsaXRpZXNTZXJ2aWNlIHtcbiAgcHVibGljIGNhbGVuZGFyRGF0YTogRGF0YTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhbGVuZGFyRGF0YSA9IChkYXRlc0RpY3Rpb25hcnkgYXMgYW55KVsnZGVmYXVsdCddOyAvL3Byb2RcbiAgICAvLyB0aGlzLmNhbGVuZGFyRGF0YSA9IGRhdGVzRGljdGlvbmFyeTsgLy9kZWJ1Z1xuICB9XG5cbiAgcGFyc2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoIWRhdGVTdHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IGRhdGVTdHI/LnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHBhcnRzLm1hcChOdW1iZXIpO1xuICAgIGlmIChcbiAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgIGlzTmFOKG1vbnRoKSB8fFxuICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgIGRheSA8IDEgfHxcbiAgICAgIGRheSA+IDMxIHx8XG4gICAgICBtb250aCA8IDEgfHxcbiAgICAgIG1vbnRoID4gMTIgfHxcbiAgICAgIHllYXIgPCAxXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgfVxuXG4gIGdldERheVNob3J0SGFuZChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSk7XG4gIH1cblxuICBnZW5lcmF0ZURhdGVzKGZEOiBEYXlJbmZvLCBsRDogRGF5SW5mbywgdUM6IG51bWJlcik6IE1vbnRoRGF5cyB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5wYXJzZURhdGUoZkQ/LmdEKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5wYXJzZURhdGUobEQ/LmdEKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aDogTW9udGhEYXlzID0gW107XG4gICAgbGV0IGN1cnJlbnRHcmVnb3JpYW5EYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICBsZXQgY3VycmVudFVtbUFsUXVyYURheSA9IHBhcnNlSW50KGZEPy51RD8uc3BsaXQoJy8nKVswXSk7XG4gICAgbGV0IGN1cnJlbnRVbW1BbFF1cmFNb250aCA9IHBhcnNlSW50KGZEPy51RD8uc3BsaXQoJy8nKVsxXSk7XG4gICAgbGV0IGN1cnJlbnRVbW1BbFF1cmFZZWFyID0gcGFyc2VJbnQoZkQ/LnVEPy5zcGxpdCgnLycpWzJdKTtcbiAgICBsZXQgZGF5c0luQ3VycmVudFVtbUFsUXVyYU1vbnRoID0gdUM7XG4gICAgd2hpbGUgKGN1cnJlbnRHcmVnb3JpYW5EYXRlIDw9IGVuZERhdGUpIHtcbiAgICAgIGNvbnN0IHVtbUFsUXVyYURhdGUgPSBgJHtjdXJyZW50VW1tQWxRdXJhRGF5XG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC5wYWRTdGFydCgyLCAnMCcpfS8ke2N1cnJlbnRVbW1BbFF1cmFNb250aFxuICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAucGFkU3RhcnQoMiwgJzAnKX0vJHtjdXJyZW50VW1tQWxRdXJhWWVhcn1gO1xuICAgICAgZGF5c0luTW9udGgucHVzaCh7XG4gICAgICAgIGdEOiB0aGlzLmZvcm1hdERhdGUoY3VycmVudEdyZWdvcmlhbkRhdGUpLFxuICAgICAgICB1RDogdW1tQWxRdXJhRGF0ZSxcbiAgICAgICAgZE46IHRoaXMuZ2V0RGF5U2hvcnRIYW5kKGN1cnJlbnRHcmVnb3JpYW5EYXRlKSxcbiAgICAgICAgdUM6IDAsXG4gICAgICB9KTtcbiAgICAgIGN1cnJlbnRHcmVnb3JpYW5EYXRlLnNldERhdGUoY3VycmVudEdyZWdvcmlhbkRhdGUuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICBjdXJyZW50VW1tQWxRdXJhRGF5ICs9IDE7XG4gICAgICBpZiAoY3VycmVudFVtbUFsUXVyYURheSA+IGRheXNJbkN1cnJlbnRVbW1BbFF1cmFNb250aCkge1xuICAgICAgICBjdXJyZW50VW1tQWxRdXJhRGF5ID0gMTtcbiAgICAgICAgY3VycmVudFVtbUFsUXVyYU1vbnRoICs9IDE7XG4gICAgICAgIGlmIChjdXJyZW50VW1tQWxRdXJhTW9udGggPiAxMikge1xuICAgICAgICAgIGN1cnJlbnRVbW1BbFF1cmFNb250aCA9IDE7XG4gICAgICAgICAgY3VycmVudFVtbUFsUXVyYVllYXIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0TW9udGhEYXRhID1cbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRGF0YVtjdXJyZW50VW1tQWxRdXJhWWVhci50b1N0cmluZygpXT8uW1xuICAgICAgICAgICAgY3VycmVudFVtbUFsUXVyYU1vbnRoLnRvU3RyaW5nKClcbiAgICAgICAgICBdO1xuICAgICAgICBkYXlzSW5DdXJyZW50VW1tQWxRdXJhTW9udGggPSBuZXh0TW9udGhEYXRhID8gbmV4dE1vbnRoRGF0YS5mRC51QyA6IDMwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF5c0luTW9udGg7XG4gIH1cblxuICBjb252ZXJ0RGF0ZShkYXRlU3RyOiBzdHJpbmcsIGlzR3JlZ29yaWFuOiBib29sZWFuKTogRGF5SW5mbyB8IG51bGwge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaXNHcmVnb3JpYW4pIHtcbiAgICAgIC8vIFByZXByb2Nlc3MgR3JlZ29yaWFuIGRhdGVcbiAgICAgIGNvbnN0IGdyZWdvcmlhbkRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlU3RyKTtcbiAgICAgIGlmICghZ3JlZ29yaWFuRGF0ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5mb3JtYXREYXRlKGdyZWdvcmlhbkRhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHllYXJLZXkgaW4gdGhpcy5jYWxlbmRhckRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb250aEtleSBpbiB0aGlzLmNhbGVuZGFyRGF0YVt5ZWFyS2V5XSkge1xuICAgICAgICAgIGNvbnN0IG1vbnRoRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJLZXldW21vbnRoS2V5XTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlSW5Nb250aFJhbmdlKFxuICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICBtb250aERhdGEuZkQ/LmdELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQ/LmdEXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZ2VuZXJhdGVEYXRlcyhcbiAgICAgICAgICAgICAgbW9udGhEYXRhLmZELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQsXG4gICAgICAgICAgICAgIG1vbnRoRGF0YS5mRD8udUNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRheU1hdGNoID0gZGF5c0luTW9udGguZmluZCgoZCkgPT4gZC5nRCA9PT0gZm9ybWF0dGVkRGF0ZSk7XG4gICAgICAgICAgICBpZiAoZGF5TWF0Y2gpIHJldHVybiBkYXlNYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gZGF0ZVN0ci5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuXG4gICAgICBpZiAoaXNOYU4oZGF5KSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oeWVhcikpIHJldHVybiBudWxsO1xuXG4gICAgICBmb3IgKGNvbnN0IHllYXJLZXkgaW4gdGhpcy5jYWxlbmRhckRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb250aEtleSBpbiB0aGlzLmNhbGVuZGFyRGF0YVt5ZWFyS2V5XSkge1xuICAgICAgICAgIGNvbnN0IG1vbnRoRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJLZXldW21vbnRoS2V5XTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlSW5Nb250aFJhbmdlKFxuICAgICAgICAgICAgICBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gLFxuICAgICAgICAgICAgICBtb250aERhdGEuZkQ/LnVELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQ/LnVEXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZ2VuZXJhdGVEYXRlcyhcbiAgICAgICAgICAgICAgbW9udGhEYXRhLmZELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQsXG4gICAgICAgICAgICAgIG1vbnRoRGF0YS5mRD8udUNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRheU1hdGNoID0gZGF5c0luTW9udGguZmluZCgoZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBbdURheSwgdU1vbnRoLCB1WWVhcl0gPSBkPy51RD8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVEYXkgPT09IGRheSAmJiB1TW9udGggPT09IG1vbnRoICYmIHVZZWFyID09PSB5ZWFyO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXlNYXRjaCkgcmV0dXJuIGRheU1hdGNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVJbk1vbnRoUmFuZ2UoXG4gICAgZGF0ZVRvQ2hlY2s6IHN0cmluZyxcbiAgICBtb250aFN0YXJ0RGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1vbnRoRW5kRGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghbW9udGhTdGFydERhdGUgfHwgIW1vbnRoRW5kRGF0ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgY2hlY2tEYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVRvQ2hlY2spO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKG1vbnRoU3RhcnREYXRlKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5wYXJzZURhdGUobW9udGhFbmREYXRlKTtcblxuICAgIGlmICghY2hlY2tEYXRlIHx8ICFzdGFydERhdGUgfHwgIWVuZERhdGUpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBjaGVja0RhdGUgPj0gc3RhcnREYXRlICYmIGNoZWNrRGF0ZSA8PSBlbmREYXRlO1xuICB9XG5cbiAgZ2V0TW9udGhEYXRhKGlucHV0RGF0ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBEYXlJbmZvW10gfCBudWxsIHtcbiAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBpbnB1dERhdGU/LnNwbGl0KCcvJykubWFwKE51bWJlcik7XG4gICAgbGV0IGlzR3JlZ29yaWFuOiBib29sZWFuO1xuICAgIGlmICh0eXBlID09ICdncmVnJykge1xuICAgICAgaXNHcmVnb3JpYW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0dyZWdvcmlhbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNHcmVnb3JpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdyZWdvcmlhbk1vbnRoRGF0YShkYXksIG1vbnRoLCB5ZWFyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VW1BbFF1cnJhTW9udGhEYXRhKGRheSwgbW9udGgsIHllYXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldEdyZWdvcmlhbk1vbnRoRGF0YShcbiAgICBkYXk6IG51bWJlcixcbiAgICBtb250aDogbnVtYmVyLFxuICAgIHllYXI6IG51bWJlclxuICApOiBEYXlJbmZvW10gfCBudWxsIHtcbiAgICBjb25zdCB5ZWFyRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJdO1xuICAgIGlmICgheWVhckRhdGEpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1vbnRoRGF0YSA9IHllYXJEYXRhW21vbnRoXTtcbiAgICBpZiAoIW1vbnRoRGF0YSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbW9udGhBcnJheTogRGF5SW5mb1tdID0gW107XG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKTtcbiAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBlbmREYXRlLmdldERhdGUoKTsgZCsrKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBkIC0gMTtcblxuICAgICAgbW9udGhBcnJheS5wdXNoKHtcbiAgICAgICAgZ0Q6IGAke2QudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS8ke21vbnRoXG4gICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAucGFkU3RhcnQoMiwgJzAnKX0vJHt5ZWFyfWAsXG4gICAgICAgIHVEOiB0aGlzLmNhbGN1bGF0ZVVtQWxRdXJyYURhdGUoXG4gICAgICAgICAgbW9udGhEYXRhLmZELnVELFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBtb250aERhdGEuZkQudUNcbiAgICAgICAgKSxcbiAgICAgICAgZE46IHRoaXMuZ2V0RGF5TmFtZShuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGQpLmdldERheSgpKSxcbiAgICAgICAgdUM6IG1vbnRoRGF0YS5mRC51QyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aEFycmF5O1xuICB9XG5cbiAgZ2V0VW1BbFF1cnJhTW9udGhEYXRhKFxuICAgIGRheTogbnVtYmVyLFxuICAgIG1vbnRoOiBudW1iZXIsXG4gICAgeWVhcjogbnVtYmVyXG4gICk6IERheUluZm9bXSB8IG51bGwge1xuICAgIGZvciAoY29uc3QgZ3JlZ29yaWFuWWVhciBpbiB0aGlzLmNhbGVuZGFyRGF0YSkge1xuICAgICAgY29uc3QgeWVhckRhdGEgPSB0aGlzLmNhbGVuZGFyRGF0YVtwYXJzZUludChncmVnb3JpYW5ZZWFyKV07XG5cbiAgICAgIGZvciAoY29uc3QgbW9udGhJbmRleCBpbiB5ZWFyRGF0YSkge1xuICAgICAgICBjb25zdCBtb250aERhdGEgPSB5ZWFyRGF0YVtwYXJzZUludChtb250aEluZGV4KV07XG4gICAgICAgIGNvbnN0IFtmRGF5LCBmTW9udGgsIGZZZWFyXSA9IG1vbnRoRGF0YT8uZkQ/LnVEPy5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuXG4gICAgICAgIGlmIChmWWVhciA9PT0geWVhciAmJiBmTW9udGggPT09IG1vbnRoKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxEYXlzID0gbW9udGhEYXRhLmZELnVDO1xuICAgICAgICAgIGNvbnN0IG1vbnRoQXJyYXk6IERheUluZm9bXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHVtQWxRdXJyYVN0YXJ0RGF0ZSA9IGAwMS8ke21vbnRoXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9LyR7eWVhcn1gO1xuICAgICAgICAgIGNvbnN0IGRheURpZmZlcmVuY2UgPSBmRGF5IC0gMTtcblxuICAgICAgICAgIGNvbnN0IHN0YXJ0R3JlZ29yaWFuRGF0ZSA9IHRoaXMuY2FsY3VsYXRlR3JlZ29yaWFuRGF0ZShcbiAgICAgICAgICAgIG1vbnRoRGF0YS5mRC5nRCxcbiAgICAgICAgICAgIC1kYXlEaWZmZXJlbmNlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxEYXlzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVEYXRlID0gdGhpcy5jYWxjdWxhdGVVbUFsUXVycmFEYXRlKFxuICAgICAgICAgICAgICB1bUFsUXVycmFTdGFydERhdGUsXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIHRvdGFsRGF5c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy5jYWxjdWxhdGVHcmVnb3JpYW5EYXRlKHN0YXJ0R3JlZ29yaWFuRGF0ZSwgaSk7XG4gICAgICAgICAgICBjb25zdCBbZ0RheSwgZ01vbnRoLCBnWWVhcl0gPSBnRGF0ZT8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGRheU5hbWUgPSB0aGlzLmdldERheU5hbWUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKGdZZWFyLCBnTW9udGggLSAxLCBnRGF5KS5nZXREYXkoKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbW9udGhBcnJheS5wdXNoKHtcbiAgICAgICAgICAgICAgZ0Q6IGdEYXRlLFxuICAgICAgICAgICAgICB1RDogdURhdGUsXG4gICAgICAgICAgICAgIGROOiBkYXlOYW1lLFxuICAgICAgICAgICAgICB1QzogdG90YWxEYXlzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoQXJyYXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUdyZWdvcmlhbkRhdGUoc3RhcnRHRGF0ZTogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gc3RhcnRHRGF0ZT8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkgKyBvZmZzZXQpO1xuXG4gICAgcmV0dXJuIGAke25ld0RhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0vJHsoXG4gICAgICBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgKVxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC5wYWRTdGFydCgyLCAnMCcpfS8ke25ld0RhdGUuZ2V0RnVsbFllYXIoKX1gO1xuICB9XG5cbiAgY2FsY3VsYXRlVW1BbFF1cnJhRGF0ZShcbiAgICBzdGFydFVEYXRlOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdUM6IG51bWJlclxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHN0YXJ0VURhdGU/LnNwbGl0KCcvJykubWFwKE51bWJlcik7XG5cbiAgICBsZXQgbmV3RGF5ID0gZGF5ICsgb2Zmc2V0O1xuICAgIGxldCBuZXdNb250aCA9IG1vbnRoO1xuICAgIGxldCBuZXdZZWFyID0geWVhcjtcblxuICAgIHdoaWxlIChuZXdEYXkgPiB1Qykge1xuICAgICAgbmV3RGF5IC09IHVDO1xuICAgICAgbmV3TW9udGggKz0gMTtcbiAgICB9XG5cbiAgICB3aGlsZSAobmV3TW9udGggPiAxMikge1xuICAgICAgbmV3TW9udGggPSAxO1xuICAgICAgbmV3WWVhciArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtuZXdEYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS8ke25ld01vbnRoXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9LyR7bmV3WWVhcn1gO1xuICB9XG5cbiAgZ2V0RGF5TmFtZShkYXlJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXlzID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXTtcbiAgICByZXR1cm4gZGF5c1tkYXlJbmRleF07XG4gIH1cblxuICAvLy8gQ2hlY2sgZGF0ZSBpcyBpdCBpbiBwYXN0IG9yIGZ1dHVyZVxuICBjaGVja1Bhc3RPckZ1dHVyZShpbnB1dERhdGU6IGFueSwgdGFyZ2V0RGF0ZTogYW55KSB7XG4gICAgaWYgKGlucHV0RGF0ZSkge1xuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gaW5wdXREYXRlPy5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICAgICAgY29uc3QgZGF0ZVRvQ2hlY2sgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgICBjb25zdCB0b2RheSA9IHRhcmdldERhdGU7XG4gICAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChkYXRlVG9DaGVjayA+IHRvZGF5KSB7XG4gICAgICAgIHJldHVybiAnRnV0dXJlJztcbiAgICAgIH0gZWxzZSBpZiAoZGF0ZVRvQ2hlY2sgPCB0b2RheSkge1xuICAgICAgICByZXR1cm4gJ1Bhc3QnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdUb2RheSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8vIENvbnZlcnQgZW5nbGlzaCBudW1iZXJzIHRvIGFyYWJpYyBlcXVpdmFsZW50XG4gIHBhcnNlRW5nbGlzaChlbmdsaXNoTnVtOiBhbnkpIHtcbiAgICBpZiAoIWVuZ2xpc2hOdW0pIHJldHVybiBlbmdsaXNoTnVtO1xuICAgIGNvbnN0IG51bVN0ciA9IFN0cmluZyhlbmdsaXNoTnVtKTtcbiAgICBjb25zdCBhcmFiaWNOdW1iZXJzID0gW1xuICAgICAgJ1xcdTA2NjAnLFxuICAgICAgJ1xcdTA2NjEnLFxuICAgICAgJ1xcdTA2NjInLFxuICAgICAgJ1xcdTA2NjMnLFxuICAgICAgJ1xcdTA2NjQnLFxuICAgICAgJ1xcdTA2NjUnLFxuICAgICAgJ1xcdTA2NjYnLFxuICAgICAgJ1xcdTA2NjcnLFxuICAgICAgJ1xcdTA2NjgnLFxuICAgICAgJ1xcdTA2NjknLFxuICAgIF07XG4gICAgcmV0dXJuIG51bVN0ci5yZXBsYWNlKC9bMC05XS9nLCAoZGlnaXQpID0+IHtcbiAgICAgIHJldHVybiBhcmFiaWNOdW1iZXJzW051bWJlcihkaWdpdCldIHx8IGRpZ2l0O1xuICAgIH0pO1xuICB9XG5cbiAgLy8vIENvbnZlcnQgYXJhYmljIG51bWJlcnMgdG8gZW5nbGlzaCBlcXVpdmFsZW50XG4gIHBhcnNlQXJhYmljKGFyYWJpY051bTogYW55KSB7XG4gICAgcmV0dXJuIGFyYWJpY051bS5yZXBsYWNlKC9b2aDZodmi2aPZpNml2abZp9mo2aldL2csIGZ1bmN0aW9uIChkOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkLmNoYXJDb2RlQXQoMCkgLSAxNjMyO1xuICAgIH0pO1xuICB9XG5cbiAgLy8vXG4gIGNvbnZlcnREYXRlTnVtZXJhbHMoZGF0ZTogc3RyaW5nLCB0YXJnZXRMYW5nOiAnZW4nIHwgJ2FyJyk6IHN0cmluZyB7XG4gICAgY29uc3QgYXJhYmljTnVtYmVycyA9IFsn2aAnLCAn2aEnLCAn2aInLCAn2aMnLCAn2aQnLCAn2aUnLCAn2aYnLCAn2acnLCAn2agnLCAn2aknXTtcbiAgICBjb25zdCBlbmdsaXNoTnVtYmVycyA9IFsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOSddO1xuXG4gICAgY29uc3QgdG9BcmFiaWMgPSAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIHZhbHVlXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoY2hhcikgPT4gKC9cXGQvLnRlc3QoY2hhcikgPyBhcmFiaWNOdW1iZXJzWytjaGFyXSA6IGNoYXIpKVxuICAgICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCB0b0VuZ2xpc2ggPSAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIHZhbHVlXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoY2hhcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJhYmljTnVtYmVycy5pbmRleE9mKGNoYXIpO1xuICAgICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gZW5nbGlzaE51bWJlcnNbaW5kZXhdIDogY2hhcjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgaWYgKHRhcmdldExhbmcgPT09ICdhcicpIHtcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGUuc3BsaXQoJy8nKTtcbiAgICAgIHJldHVybiBgJHt0b0FyYWJpYyh5ZWFyKX0vJHt0b0FyYWJpYyhtb250aCl9LyR7dG9BcmFiaWMoZGF5KX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBkYXRlLnNwbGl0KCcvJyk7XG4gICAgICByZXR1cm4gYCR7dG9FbmdsaXNoKGRheSl9LyR7dG9FbmdsaXNoKG1vbnRoKX0vJHt0b0VuZ2xpc2goeWVhcil9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGlucHV0IGRhdGUgdG8gREQvTU0vWVlZWSBzdHJpbmcgZm9ybWF0IChHcmVnb3JpYW4pXG4gICAqIEFjY2VwdHMgRGF0ZSBvYmplY3Qgb3IgREQvTU0vWVlZWSBzdHJpbmdcbiAgICovXG4gIG5vcm1hbGl6ZURhdGVUb1N0cmluZyhkYXRlOiBEYXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGEgc3RyaW5nIC0gdmFsaWRhdGUgZm9ybWF0XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgcmV0dXJuIHBhcnNlZCA/IHRoaXMuZm9ybWF0RGF0ZShwYXJzZWQpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIHR3byBkYXRlcyAoR3JlZ29yaWFuIGZvcm1hdCBERC9NTS9ZWVlZKVxuICAgKiBSZXR1cm5zOiAtMSBpZiBkYXRlMSA8IGRhdGUyLCAwIGlmIGVxdWFsLCAxIGlmIGRhdGUxID4gZGF0ZTJcbiAgICovXG4gIGNvbXBhcmVEYXRlcyhkYXRlMVN0cjogc3RyaW5nLCBkYXRlMlN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBkMSA9IHRoaXMucGFyc2VEYXRlKGRhdGUxU3RyKTtcbiAgICBjb25zdCBkMiA9IHRoaXMucGFyc2VEYXRlKGRhdGUyU3RyKTtcblxuICAgIGlmICghZDEgfHwgIWQyKSByZXR1cm4gMDtcblxuICAgIGlmIChkMSA8IGQyKSByZXR1cm4gLTE7XG4gICAgaWYgKGQxID4gZDIpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIEhpanJpIGRhdGVzIChVTSBmb3JtYXQgREQvTU0vWVlZWSlcbiAgICogQ29udmVydHMgdG8gR3JlZ29yaWFuIGZvciBjb21wYXJpc29uXG4gICAqL1xuICBjb21wYXJlSGlqcmlEYXRlcyhoaWpyaTE6IHN0cmluZywgaGlqcmkyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGRheTEgPSB0aGlzLmNvbnZlcnREYXRlKGhpanJpMSwgZmFsc2UpO1xuICAgIGNvbnN0IGRheTIgPSB0aGlzLmNvbnZlcnREYXRlKGhpanJpMiwgZmFsc2UpO1xuXG4gICAgaWYgKCFkYXkxPy5nRCB8fCAhZGF5Mj8uZ0QpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGVzKGRheTEuZ0QsIGRheTIuZ0QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSAoaW5jbHVzaXZlKVxuICAgKiBBbGwgZGF0ZXMgaW4gR3JlZ29yaWFuIEREL01NL1lZWVkgZm9ybWF0XG4gICAqL1xuICBpc0RhdGVJblJhbmdlKFxuICAgIGRhdGVTdHI6IHN0cmluZyxcbiAgICBtaW5EYXRlU3RyOiBzdHJpbmcgfCBudWxsLFxuICAgIG1heERhdGVTdHI6IHN0cmluZyB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRlU3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiBubyBjb25zdHJhaW50cywgZGF0ZSBpcyB2YWxpZFxuICAgIGlmICghbWluRGF0ZVN0ciAmJiAhbWF4RGF0ZVN0cikgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBDaGVjayBtaW5pbXVtIGNvbnN0cmFpbnRcbiAgICBpZiAobWluRGF0ZVN0ciAmJiB0aGlzLmNvbXBhcmVEYXRlcyhkYXRlU3RyLCBtaW5EYXRlU3RyKSA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXhpbXVtIGNvbnN0cmFpbnRcbiAgICBpZiAobWF4RGF0ZVN0ciAmJiB0aGlzLmNvbXBhcmVEYXRlcyhkYXRlU3RyLCBtYXhEYXRlU3RyKSA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIEhpanJpIGRhdGUgaXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2VcbiAgICogQ29udmVydHMgdG8gR3JlZ29yaWFuIGZvciBjb21wYXJpc29uXG4gICAqL1xuICBpc0hpanJpRGF0ZUluUmFuZ2UoXG4gICAgaGlqcmlEYXRlU3RyOiBzdHJpbmcsXG4gICAgbWluRGF0ZVN0cjogc3RyaW5nIHwgbnVsbCxcbiAgICBtYXhEYXRlU3RyOiBzdHJpbmcgfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGlqcmlEYXRlU3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBkYXlJbmZvID0gdGhpcy5jb252ZXJ0RGF0ZShoaWpyaURhdGVTdHIsIGZhbHNlKTtcbiAgICBpZiAoIWRheUluZm8/LmdEKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5pc0RhdGVJblJhbmdlKGRheUluZm8uZ0QsIG1pbkRhdGVTdHIsIG1heERhdGVTdHIpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1oaWpyaS1ncmVnb3JpYW4tZGF0ZS10aW1lLXBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9hbmd1bGFyLWhpanJpLWdyZWdvcmlhbi1kYXRlLXRpbWUtcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=