@doolehealth/service-lib 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +24 -0
  2. package/esm2022/doolehealth-service-lib.mjs +5 -0
  3. package/esm2022/lib/configuration.mjs +5 -0
  4. package/esm2022/lib/models/user.mjs +2 -0
  5. package/esm2022/lib/service-lib.component.mjs +19 -0
  6. package/esm2022/lib/service-lib.module.mjs +33 -0
  7. package/esm2022/lib/services/analytics.service.mjs +73 -0
  8. package/esm2022/lib/services/api-endpoints.service.mjs +51 -0
  9. package/esm2022/lib/services/authentication.service.mjs +400 -0
  10. package/esm2022/lib/services/change-endpoints.service.mjs +90 -0
  11. package/esm2022/lib/services/date.service.mjs +419 -0
  12. package/esm2022/lib/services/doole.service.mjs +1299 -0
  13. package/esm2022/lib/services/encryption.service.mjs +31 -0
  14. package/esm2022/lib/services/error.service.mjs +49 -0
  15. package/esm2022/lib/services/events.service.mjs +63 -0
  16. package/esm2022/lib/services/highcharts.service.mjs +621 -0
  17. package/esm2022/lib/services/http.service.mjs +124 -0
  18. package/esm2022/lib/services/language.service.mjs +38 -0
  19. package/esm2022/lib/services/loading.service.mjs +45 -0
  20. package/esm2022/lib/services/logging.service.mjs +28 -0
  21. package/esm2022/lib/services/navigation.service.mjs +41 -0
  22. package/esm2022/lib/services/network.service.mjs +42 -0
  23. package/esm2022/lib/services/notification.service.mjs +202 -0
  24. package/esm2022/lib/services/opentok.service.mjs +25 -0
  25. package/esm2022/lib/services/roles.service.mjs +44 -0
  26. package/esm2022/lib/services/storage.service.mjs +37 -0
  27. package/esm2022/lib/services/token.service.mjs +59 -0
  28. package/esm2022/lib/util/chatParameters.mjs +17 -0
  29. package/esm2022/lib/util/data-store.mjs +54 -0
  30. package/esm2022/lib/util/environment.mjs +29 -0
  31. package/esm2022/lib/util/language.model.mjs +3 -0
  32. package/esm2022/lib/util/notification-options.mjs +245 -0
  33. package/esm2022/lib/util/query-string-parameters.mjs +11 -0
  34. package/esm2022/lib/util/url-builder.mjs +15 -0
  35. package/esm2022/public-api.mjs +30 -0
  36. package/fesm2022/doolehealth-service-lib.mjs +4025 -0
  37. package/fesm2022/doolehealth-service-lib.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/configuration.d.ts +46 -0
  40. package/lib/models/user.d.ts +133 -0
  41. package/lib/service-lib.component.d.ts +5 -0
  42. package/lib/service-lib.module.d.ts +13 -0
  43. package/lib/services/analytics.service.d.ts +17 -0
  44. package/lib/services/api-endpoints.service.d.ts +13 -0
  45. package/lib/services/authentication.service.d.ts +102 -0
  46. package/lib/services/change-endpoints.service.d.ts +38 -0
  47. package/lib/services/date.service.d.ts +58 -0
  48. package/lib/services/doole.service.d.ts +169 -0
  49. package/lib/services/encryption.service.d.ts +9 -0
  50. package/lib/services/error.service.d.ts +11 -0
  51. package/lib/services/events.service.d.ts +32 -0
  52. package/lib/services/highcharts.service.d.ts +69 -0
  53. package/lib/services/http.service.d.ts +28 -0
  54. package/lib/services/language.service.d.ts +15 -0
  55. package/lib/services/loading.service.d.ts +22 -0
  56. package/lib/services/logging.service.d.ts +9 -0
  57. package/lib/services/navigation.service.d.ts +13 -0
  58. package/lib/services/network.service.d.ts +14 -0
  59. package/lib/services/notification.service.d.ts +25 -0
  60. package/lib/services/opentok.service.d.ts +17 -0
  61. package/lib/services/roles.service.d.ts +28 -0
  62. package/lib/services/storage.service.d.ts +10 -0
  63. package/lib/services/token.service.d.ts +16 -0
  64. package/lib/util/chatParameters.d.ts +25 -0
  65. package/lib/util/data-store.d.ts +13 -0
  66. package/lib/util/environment.d.ts +18 -0
  67. package/lib/util/language.model.d.ts +4 -0
  68. package/lib/util/notification-options.d.ts +145 -0
  69. package/lib/util/query-string-parameters.d.ts +6 -0
  70. package/lib/util/url-builder.d.ts +9 -0
  71. package/package.json +38 -0
  72. package/public-api.d.ts +23 -0
@@ -0,0 +1,419 @@
1
+ import { DatePipe } from '@angular/common';
2
+ import { Injectable } from '@angular/core';
3
+ import moment from 'moment';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@ngx-translate/core";
7
+ export class DateService {
8
+ constructor(datePipe, translate) {
9
+ this.datePipe = datePipe;
10
+ this.translate = translate;
11
+ this.locale = this.getLocale();
12
+ }
13
+ getDateFormat() {
14
+ let lang = this.translate.currentLang;
15
+ let format = 'DD/MM/YY ';
16
+ if (lang === 'en')
17
+ format = 'MM/DD/YY ';
18
+ return format;
19
+ }
20
+ getDateFormat2() {
21
+ let lang = this.translate.currentLang;
22
+ let format = 'dd/MM/YY';
23
+ if (lang === 'en')
24
+ format = 'MM/dd/YY';
25
+ return format;
26
+ }
27
+ getDateFormat3() {
28
+ let lang = this.translate.currentLang;
29
+ let format = 'DD/MM/YYYY';
30
+ if (lang === 'en')
31
+ format = 'MM/DD/YYYY';
32
+ return format;
33
+ }
34
+ getLongFormat() {
35
+ let lang = this.translate.currentLang;
36
+ let format = 'dddd, MMM yyyy';
37
+ if (lang === 'en')
38
+ format = 'MMM, ddd yyyy';
39
+ return format;
40
+ }
41
+ getMonthViewDayHeader(date) {
42
+ let lang = this.translate.currentLang;
43
+ let days = ["D", "L", "M", "X", "J", "V", "S"];
44
+ if (lang === 'ca') {
45
+ days = ["DG", "DL", "DT", "DC", "DJ", "DV", "DS"];
46
+ }
47
+ else if (lang === 'en')
48
+ days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
49
+ let num = date.getDay();
50
+ return days[num];
51
+ }
52
+ formatSelectedDate(date) {
53
+ if (date) {
54
+ let day = this.transformDate(date, this.getformatSelectedDate());
55
+ console.log("selected Day", day);
56
+ return day[0].toUpperCase() + day.slice(1);
57
+ }
58
+ return date;
59
+ }
60
+ getformatSelectedDate() {
61
+ let lang = this.translate.currentLang;
62
+ let format = 'EEEE, d MMMM';
63
+ if (lang === 'en')
64
+ format = 'MMMM d, EEEE';
65
+ return format;
66
+ }
67
+ getLocale() {
68
+ let lang = this.translate.currentLang;
69
+ let locale = 'es-ES';
70
+ if (lang === 'ca') {
71
+ locale = 'ca-ES';
72
+ }
73
+ else if (lang === 'en')
74
+ locale = 'en-US';
75
+ return locale;
76
+ }
77
+ getStartingDayWeek() {
78
+ let lang = this.translate.currentLang;
79
+ let day = '1';
80
+ if (lang == 'en')
81
+ day = '0';
82
+ return day;
83
+ }
84
+ getStartingDayMonth() {
85
+ let lang = this.translate.currentLang;
86
+ let day = 1;
87
+ if (lang == 'en')
88
+ day = 0;
89
+ return day;
90
+ }
91
+ ddMMy() {
92
+ let lang = this.translate.currentLang;
93
+ let format = 'dd/MM/y';
94
+ if (lang === 'en')
95
+ format = 'MM/dd/y';
96
+ return format;
97
+ }
98
+ getShortDateFormat() {
99
+ let lang = this.translate.currentLang;
100
+ let format = 'DD/MM/YY';
101
+ if (lang === 'en')
102
+ format = 'MM/DD/YY';
103
+ return format;
104
+ }
105
+ ddMMyyyyFormat(date) {
106
+ let lang = this.translate.currentLang;
107
+ let format = 'dd/MM/yyyy';
108
+ if (lang === 'en')
109
+ format = 'MM/dd/yyyy';
110
+ let day = this.transformDate(date, format);
111
+ return day[0].toUpperCase() + day.slice(1);
112
+ }
113
+ ddMMyFormat(date) {
114
+ let lang = this.translate.currentLang;
115
+ let format = 'dd MMM y';
116
+ if (lang === 'en')
117
+ format = 'MMM dd y';
118
+ let day = this.transformDate(date, format);
119
+ return day[0].toUpperCase() + day.slice(1);
120
+ }
121
+ ddMMMyyyformat(date) {
122
+ let lang = this.translate.currentLang;
123
+ let format = 'dd MMM yyy';
124
+ if (lang === 'en')
125
+ format = 'MMM dd yyy';
126
+ let day = this.transformDate(date, format);
127
+ return day[0].toUpperCase() + day.slice(1);
128
+ }
129
+ MMMMyyyyFormat(date) {
130
+ let format = 'MMMM yyyy';
131
+ let day = this.transformDate(date, format);
132
+ return day[0].toUpperCase() + day.slice(1);
133
+ }
134
+ getDayMonthYearFormat(date) {
135
+ let lang = this.translate.currentLang;
136
+ let format = 'EEEE, d MMMM YYYY';
137
+ if (lang === 'en')
138
+ format = 'MMMM, d EEEE YYYY';
139
+ let day = this.transformDate(date, format);
140
+ return day[0].toUpperCase() + day.slice(1);
141
+ }
142
+ selectedDateFormat(date) {
143
+ let lang = this.translate.currentLang;
144
+ let format = 'EEEE, d MMMM';
145
+ if (lang === 'en')
146
+ format = 'MMMM d, YYYY';
147
+ let day = this.transformDate(date, format);
148
+ return day[0].toUpperCase() + day.slice(1);
149
+ }
150
+ ddMMyyyyHHmm(date) {
151
+ let lang = this.translate.currentLang;
152
+ let format = 'dd/MM/yyyy HH:mm';
153
+ if (lang === 'en')
154
+ format = 'MM/dd/yyyy hh:mm a';
155
+ let day = this.transformDate(date, format);
156
+ return day[0].toUpperCase() + day.slice(1);
157
+ }
158
+ formatDateLongFormat(date) {
159
+ if (date) {
160
+ let day = this.transformDate(date, this.getLongDateFormat());
161
+ return day[0].toUpperCase() + day.slice(1);
162
+ }
163
+ return date;
164
+ }
165
+ yyyyMMddHHmm(date) {
166
+ if (date) {
167
+ let day = this.transformDate(date, this.yyyyMMddHHmmFormat());
168
+ console.log("selected Day", day);
169
+ return day[0].toUpperCase() + day.slice(1);
170
+ }
171
+ return date;
172
+ }
173
+ yyyyMMddHHmmFormat() {
174
+ let lang = this.translate.currentLang;
175
+ let format = 'yyyy-dd-MM HH:mm';
176
+ if (lang === 'en')
177
+ format = 'yyyy-MM-dd HH:mm a';
178
+ return format;
179
+ }
180
+ getLongDateFormat() {
181
+ let lang = this.translate.currentLang;
182
+ let format = 'EEEE, d MMMM yyyy, HH:mm';
183
+ if (lang === 'en')
184
+ format = 'MMMM, d yyyy, hh:mm a';
185
+ return format;
186
+ }
187
+ getDatetimeControlFormat() {
188
+ let lang = this.translate.currentLang;
189
+ let format = 'D MMM YYYY HH:mm';
190
+ if (lang === 'en')
191
+ format = 'MMM D YY hh:mm a';
192
+ return format;
193
+ }
194
+ getDayMonthFormat() {
195
+ let lang = this.translate.currentLang;
196
+ let format = 'd MMM';
197
+ if (lang === 'en')
198
+ format = 'MMM d';
199
+ return format;
200
+ }
201
+ getDayDotMonthFormat() {
202
+ let lang = this.translate.currentLang;
203
+ let format = 'd. MMM';
204
+ if (lang === 'en')
205
+ format = 'MMM. d';
206
+ return format;
207
+ }
208
+ getSelectedWeek(date) {
209
+ let lang = this.translate.currentLang;
210
+ let format = 'E d MMM';
211
+ if (lang === 'en')
212
+ format = 'MMM d, E';
213
+ let day = this.transformDate(date, format);
214
+ return day[0].toUpperCase() + day.slice(1);
215
+ }
216
+ getSelectedWeekFullDay(date) {
217
+ let lang = this.translate.currentLang;
218
+ let format = 'EEE d MMM';
219
+ if (lang === 'en')
220
+ format = 'MMM d, EEE';
221
+ let day = this.transformDate(date, format);
222
+ return day[0].toUpperCase() + day.slice(1);
223
+ }
224
+ formatDate(date) {
225
+ if (date) {
226
+ date = new Date(date);
227
+ if (this.isToday(date))
228
+ return this.datePipe.transform(date, this.getTimeFormat());
229
+ else {
230
+ let format = this.getDateFormat2();
231
+ return this.transformDate(date, format);
232
+ }
233
+ }
234
+ return date;
235
+ }
236
+ ddMMyyyy(date) {
237
+ let lang = this.translate.currentLang;
238
+ let format = 'dd-MM-yyyy';
239
+ if (lang === 'en')
240
+ format = 'MM-dd-yyyy';
241
+ let day = this.transformDate(date, format);
242
+ return day[0].toUpperCase() + day.slice(1);
243
+ }
244
+ highchartsDatesFornmat() {
245
+ let lang = this.translate.currentLang;
246
+ let format = {};
247
+ if (lang == 'en') {
248
+ // %b: Short month, like 'Jan',%e Day of the month, 1 through 31
249
+ format = {
250
+ millisecond: '%H:%M:%S.%L',
251
+ second: '%l:%M:%S %P',
252
+ minute: '%l:%M %p',
253
+ hour: '%l:%M %p',
254
+ day: '%b. %e',
255
+ week: '%b. %e',
256
+ month: '%b \'%y',
257
+ year: '%Y'
258
+ };
259
+ }
260
+ else {
261
+ format = {
262
+ millisecond: '%H:%M:%S.%L',
263
+ second: '%H:%M:%S',
264
+ minute: '%H:%M',
265
+ hour: '%H:%M',
266
+ day: '%e. %b',
267
+ week: '%e. %b',
268
+ month: '%b \'%y',
269
+ year: '%Y'
270
+ };
271
+ }
272
+ return format;
273
+ }
274
+ yyyyMMddFormat(date) {
275
+ console.log("DATE date: ", date);
276
+ let lang = this.translate.currentLang;
277
+ console.log("DATE lang: ", lang);
278
+ let format = 'yyyy-MM-dd';
279
+ if (lang == 'en')
280
+ format = 'yyyy-dd-MM';
281
+ console.log("DATE format: ", format);
282
+ let day = this.transformDate(date, format);
283
+ console.log("DATE day: ", day);
284
+ return day[0].toUpperCase() + day.slice(1);
285
+ }
286
+ yyyyMMddTHHmmssSSSZFormat(date) {
287
+ const fechaFormateada = this.datePipe.transform(date, 'yyyy-MM-ddTHH:mm:ss.SSS\'Z\'');
288
+ return fechaFormateada;
289
+ }
290
+ convert12to24format(time) {
291
+ console.log("TIME 12to24: ", time);
292
+ var hours = Number(time.match(/^(\d+)/)[1]);
293
+ var minutes = Number(time.match(/:(\d+)/)[1]);
294
+ var AMPM = time.match(/\s(.*)$/)[1];
295
+ if (AMPM == "PM" && hours < 12)
296
+ hours = hours + 12;
297
+ if (AMPM == "AM" && hours == 12)
298
+ hours = hours - 12;
299
+ var sHours = hours.toString();
300
+ var sMinutes = minutes.toString();
301
+ if (hours < 10)
302
+ sHours = "0" + sHours;
303
+ if (minutes < 10)
304
+ sMinutes = "0" + sMinutes;
305
+ let h = sHours + ":" + sMinutes;
306
+ console.log("HOURS: ", h);
307
+ return h;
308
+ }
309
+ format24h(time) {
310
+ let lang = this.translate.currentLang;
311
+ if (lang === 'en') {
312
+ // Check correct time format and split into components
313
+ time = time.toString().match(/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];
314
+ if (time.length > 1) { // If time format correct
315
+ time = time.slice(1); // Remove full string match value
316
+ time[5] = +time[0] < 12 ? ' AM' : ' PM'; // Set AM/PM
317
+ time[0] = +time[0] % 12 || 12; // Adjust hours
318
+ }
319
+ return time.join(''); // return adjusted time or original string
320
+ }
321
+ return time;
322
+ }
323
+ isAmericanFormat() {
324
+ return this.translate.currentLang === 'en';
325
+ }
326
+ getTimeFormat() {
327
+ let lang = this.translate.currentLang;
328
+ let format = 'HH:mm';
329
+ if (lang === 'en')
330
+ format = 'hh:mm a';
331
+ return format;
332
+ }
333
+ isToday(mDate) {
334
+ let date = new Date();
335
+ if (date.getDate() === mDate.getDate() && date.getMonth() === mDate.getMonth() && date.getFullYear() === mDate.getFullYear())
336
+ return true;
337
+ return false;
338
+ }
339
+ transformDate(date, format) {
340
+ const datePipe = new DatePipe(this.getLocale());
341
+ return datePipe.transform(date, format);
342
+ }
343
+ getCalendarDay(epoch) {
344
+ if (!epoch) {
345
+ return null;
346
+ }
347
+ let timeString = 'h:mm A';
348
+ const today = this.translate.instant('agenda.today');
349
+ const yesterday = this.translate.instant('agenda.yesterday');
350
+ return moment(epoch).calendar(null, {
351
+ sameDay: `[${today}] ` + timeString,
352
+ lastDay: `[${yesterday}] ` + timeString,
353
+ lastWeek: 'DD/MM/YY ' + timeString,
354
+ sameElse: 'DD/MM/YY ' + timeString,
355
+ nextDay: 'DD/MM/YY ' + timeString,
356
+ });
357
+ }
358
+ getCalendarDay2(epoch) {
359
+ if (!epoch) {
360
+ return null;
361
+ }
362
+ let timeString = this.getTimeFormat();
363
+ let dateString = this.getShortDateFormat();
364
+ const today = this.translate.instant('agenda.today');
365
+ const yesterday = this.translate.instant('agenda.yesterday');
366
+ return moment(epoch).calendar(null, {
367
+ sameDay: `[${today}] ` + timeString,
368
+ lastDay: `[${yesterday}] ` + timeString,
369
+ sameElse: dateString + ' ' + timeString,
370
+ lastWeek: dateString + ' ' + timeString,
371
+ nextDay: dateString + ' ' + timeString
372
+ });
373
+ }
374
+ getCalendarDayTime(epoch) {
375
+ if (!epoch) {
376
+ return null;
377
+ }
378
+ let timeString = this.getTimeFormat();
379
+ let dateString = this.getLongFormat();
380
+ let lang = this.translate.currentLang;
381
+ const today = this.translate.instant('agenda.today');
382
+ const yesterday = this.translate.instant('agenda.yesterday');
383
+ const to = this.translate.instant('agenda.to');
384
+ const m = moment;
385
+ m.locale(lang);
386
+ return m(epoch).calendar(null, {
387
+ sameDay: `[${today}] ` + `[${to}] ` + timeString,
388
+ lastDay: `[${yesterday}] ` + `[${to}] ` + timeString,
389
+ sameElse: dateString + ' ' + `[${to}] ` + timeString,
390
+ lastWeek: dateString + ' ' + `[${to}] ` + timeString,
391
+ nextDay: dateString + ' ' + `[${to}] ` + timeString
392
+ });
393
+ }
394
+ // return epoch string as specified format
395
+ formatEpoch(epoch) {
396
+ return this.getCalendarDay(epoch);
397
+ }
398
+ getToday() {
399
+ const tzoffset = (new Date()).getTimezoneOffset() * 60000; // offset in milliseconds
400
+ const localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
401
+ let date = localISOTime; // this.dateService.selectedDateFormat(localISOTime);
402
+ return date;
403
+ }
404
+ getCurrentTime() {
405
+ const tzoffset = (new Date()).getTimezoneOffset() * 60000; // offset in milliseconds
406
+ const localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
407
+ let date = localISOTime; // this.dateService.selectedDateFormat(localISOTime);
408
+ return new Date(Date.now() - tzoffset).getTime().toLocaleString();
409
+ }
410
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, deps: [{ token: i1.DatePipe }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
411
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, providedIn: 'root' }); }
412
+ }
413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, decorators: [{
414
+ type: Injectable,
415
+ args: [{
416
+ providedIn: 'root',
417
+ }]
418
+ }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i2.TranslateService }] });
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2VydmljZS1saWIvc3JjL2xpYi9zZXJ2aWNlcy9kYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7O0FBSzVCLE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLFFBQWtCLEVBQVMsU0FBMkI7UUFBdEQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ3hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFHTSxhQUFhO1FBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUN6QixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFdBQVcsQ0FBQTtRQUN0QixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUN4QixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFVBQVUsQ0FBQTtRQUNyQixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQztRQUMxQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFlBQVksQ0FBQTtRQUN2QixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLGdCQUFnQixDQUFDO1FBRTlCLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsZUFBZSxDQUFDO1FBRTNCLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUdNLHFCQUFxQixDQUFDLElBQVM7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUM3QyxJQUFHLElBQUksS0FBSyxJQUFJLEVBQUMsQ0FBQztZQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNsRCxDQUFDO2FBQUssSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNwQixJQUFJLEdBQUksQ0FBQyxLQUFLLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUUxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDdkIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQUk7UUFDNUIsSUFBRyxJQUFJLEVBQUMsQ0FBQztZQUNQLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ00scUJBQXFCO1FBQzFCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLGNBQWMsQ0FBQTtRQUMzQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQTtRQUNwQixJQUFHLElBQUksS0FBSyxJQUFJLEVBQUMsQ0FBQztZQUNoQixNQUFNLEdBQUcsT0FBTyxDQUFBO1FBQ2xCLENBQUM7YUFBSyxJQUFHLElBQUksS0FBSyxJQUFJO1lBQ3BCLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFFbkIsT0FBTyxNQUFNLENBQUM7SUFFaEIsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDYixJQUFHLElBQUksSUFBSSxJQUFJO1lBQ2IsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUVYLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUdNLG1CQUFtQjtRQUN4QixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDWCxJQUFHLElBQUksSUFBSSxJQUFJO1lBQ2IsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUVULE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUlNLEtBQUs7UUFDVixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFFdEIsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFFckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUE7UUFFdkIsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFdEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFJO1FBQ3hCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQztRQUUxQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUV4QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxXQUFXLENBQUMsSUFBSTtRQUNyQixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFeEIsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sY0FBYyxDQUFDLElBQUk7UUFDeEIsSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRTFCLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRXRCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFOUMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFJO1FBRXhCLElBQUksTUFBTSxHQUFFLFdBQVcsQ0FBQztRQUV4QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxJQUFJO1FBQy9CLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBRWpDLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsbUJBQW1CLENBQUM7UUFFN0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBVztRQUVuQyxJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUE7UUFFM0IsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFFMUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBSUQsWUFBWSxDQUFDLElBQUk7UUFDZixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQTtRQUMvQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFJLG9CQUFvQixDQUFDO1FBRS9CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUdNLG9CQUFvQixDQUFDLElBQUs7UUFFL0IsSUFBRyxJQUFJLEVBQUMsQ0FBQztZQUNQLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDN0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFFZCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQUs7UUFFdkIsSUFBRyxJQUFJLEVBQUMsQ0FBQztZQUNQLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLGtCQUFrQixDQUFDO1FBRWhDLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsb0JBQW9CLENBQUM7UUFFaEMsT0FBTyxNQUFNLENBQUM7SUFFaEIsQ0FBQztJQUdNLGlCQUFpQjtRQUN0QixJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBSSwwQkFBMEIsQ0FBQztRQUV6QyxJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLHVCQUF1QixDQUFDO1FBRW5DLE9BQU8sTUFBTSxDQUFDO0lBRWhCLENBQUM7SUFDTSx3QkFBd0I7UUFDN0IsSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUE7UUFFL0IsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztRQUU1QixPQUFPLE1BQU0sQ0FBQztJQUVsQixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUVyQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUVqQixPQUFPLE1BQU0sQ0FBQztJQUVsQixDQUFDO0lBRU0sb0JBQW9CO1FBQ3pCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUV0QixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUVsQixPQUFPLE1BQU0sQ0FBQztJQUVsQixDQUFDO0lBRU0sZUFBZSxDQUFDLElBQVc7UUFFaEMsSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFBO1FBRXRCLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsVUFBVSxDQUFDO1FBRXRCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLHNCQUFzQixDQUFDLElBQVc7UUFFdkMsSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFBO1FBRXhCLElBQUcsSUFBSSxLQUFLLElBQUk7WUFDZCxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFLO1FBQ3JCLElBQUcsSUFBSSxFQUFDLENBQUM7WUFDUCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFckIsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7aUJBQ3pELENBQUM7Z0JBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3pDLENBQUM7UUFFSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBR0QsUUFBUSxDQUFDLElBQUk7UUFDWCxJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUE7UUFDekIsSUFBRyxJQUFJLEtBQUssSUFBSTtZQUNkLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFFdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsc0JBQXNCO1FBRXRCLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFHLElBQUksSUFBSSxJQUFJLEVBQUMsQ0FBQztZQUNiLGdFQUFnRTtZQUNoRSxNQUFNLEdBQUc7Z0JBQ1AsV0FBVyxFQUFFLGFBQWE7Z0JBQzFCLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxTQUFTO2dCQUNoQixJQUFJLEVBQUUsSUFBSTthQUNYLENBQUE7UUFDSCxDQUFDO2FBQUksQ0FBQztZQUNKLE1BQU0sR0FBRztnQkFDUCxXQUFXLEVBQUUsYUFBYTtnQkFDMUIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxPQUFPO2dCQUNiLEdBQUcsRUFBRSxRQUFRO2dCQUNiLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxTQUFTO2dCQUNoQixJQUFJLEVBQUUsSUFBSTthQUNiLENBQUE7UUFDRCxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQUk7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRTFCLElBQUcsSUFBSSxJQUFJLElBQUk7WUFDYixNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRXhCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVNLHlCQUF5QixDQUFDLElBQUs7UUFDcEMsTUFBTSxlQUFlLEdBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDckYsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUNELG1CQUFtQixDQUFDLElBQUk7UUFFdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBRyxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssR0FBQyxFQUFFO1lBQUUsS0FBSyxHQUFHLEtBQUssR0FBQyxFQUFFLENBQUM7UUFDOUMsSUFBRyxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssSUFBRSxFQUFFO1lBQUUsS0FBSyxHQUFHLEtBQUssR0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxJQUFHLEtBQUssR0FBQyxFQUFFO1lBQUUsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDbkMsSUFBRyxPQUFPLEdBQUMsRUFBRTtZQUFFLFFBQVEsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO1FBRXpDLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO1FBRWhDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFJO1FBRVosSUFBSSxJQUFJLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBRyxJQUFJLEtBQUssSUFBSSxFQUFDLENBQUM7WUFDaEIsc0RBQXNEO1lBQ3hELElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFHLENBQUMsS0FBSyxDQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVyRixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7Z0JBQzlDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsaUNBQWlDO2dCQUN6RCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVk7Z0JBQ3JELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsZUFBZTtZQUNoRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsMENBQTBDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUVkLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFJLE9BQU8sQ0FBQTtRQUVyQixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFJLFNBQVMsQ0FBQztRQUV0QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVc7UUFDakIsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUNyQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN6SCxPQUFPLElBQUksQ0FBQTtRQUNiLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTTtRQUN4QixNQUFNLFFBQVEsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxJQUFJLEtBQUssSUFBSSxHQUFHLFVBQVU7WUFDbkMsT0FBTyxFQUFFLElBQUksU0FBUyxJQUFJLEdBQUcsVUFBVTtZQUN2QyxRQUFRLEVBQUcsV0FBVyxHQUFHLFVBQVU7WUFDbkMsUUFBUSxFQUFFLFdBQVcsR0FBRyxVQUFVO1lBQ2xDLE9BQU8sRUFBRyxXQUFXLEdBQUcsVUFBVTtTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNsQyxPQUFPLEVBQUUsSUFBSSxLQUFLLEtBQUssR0FBSSxVQUFVO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLFNBQVMsS0FBSyxHQUFHLFVBQVU7WUFDeEMsUUFBUSxFQUFFLFVBQVUsR0FBRyxHQUFHLEdBQUcsVUFBVTtZQUN2QyxRQUFRLEVBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxVQUFVO1lBQ3hDLE9BQU8sRUFBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLFVBQVU7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELGtCQUFrQixDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9DLE1BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQTtRQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2QsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUM3QixPQUFPLEVBQUUsSUFBSSxLQUFLLEtBQUssR0FBSSxJQUFJLEVBQUUsS0FBSyxHQUFHLFVBQVU7WUFDbkQsT0FBTyxFQUFFLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxVQUFVO1lBQ3RELFFBQVEsRUFBRSxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsVUFBVTtZQUNyRCxRQUFRLEVBQUUsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLFVBQVU7WUFDckQsT0FBTyxFQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxVQUFVO1NBQ3RELENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsV0FBVyxDQUFDLEtBQUs7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLHlCQUF5QjtRQUNwRixNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksR0FBRyxZQUFZLENBQUEsQ0FBQSxxREFBcUQ7UUFDNUUsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMseUJBQXlCO1FBQ3BGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQSxDQUFBLHFEQUFxRDtRQUM1RSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwRSxDQUFDOytHQXJnQlUsV0FBVzttSEFBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlU2VydmljZSB7XG4gIGxvY2FsZTpzdHJpbmc7XG4gIGxhbmd1YWdlOnN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgfVxuXG5cbiAgcHVibGljIGdldERhdGVGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVkgJztcbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9ERC9ZWSAnXG4gICAgcmV0dXJuIGZvcm1hdFxuICB9XG5cbiAgcHVibGljIGdldERhdGVGb3JtYXQyKCl7XG4gICAgbGV0IGxhbmcgPSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ2RkL01NL1lZJztcbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9kZC9ZWSdcbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0ZUZvcm1hdDMoKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVlZWSc7XG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU0vREQvWVlZWSdcbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9uZ0Zvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGRkZCwgTU1NIHl5eXknO1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NLCBkZGQgeXl5eSc7XG5cbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRNb250aFZpZXdEYXlIZWFkZXIoZGF0ZTpEYXRlKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBkYXlzID0gW1wiRFwiLFwiTFwiLCBcIk1cIiwgXCJYXCIsIFwiSlwiLCBcIlZcIiwgXCJTXCJdXG4gICAgaWYobGFuZyA9PT0gJ2NhJyl7XG4gICAgICBkYXlzID0gW1wiREdcIixcIkRMXCIsIFwiRFRcIiwgXCJEQ1wiLCBcIkRKXCIsIFwiRFZcIiwgXCJEU1wiXVxuICAgIH1lbHNlIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBkYXlzID0gIFtcIlN1blwiLFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdXG5cbiAgICBsZXQgbnVtID0gZGF0ZS5nZXREYXkoKVxuICAgIHJldHVybiBkYXlzW251bV1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWxlY3RlZERhdGUoZGF0ZSl7XG4gICAgaWYoZGF0ZSl7XG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIHRoaXMuZ2V0Zm9ybWF0U2VsZWN0ZWREYXRlKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJzZWxlY3RlZCBEYXlcIiwgZGF5KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbiAgcHVibGljIGdldGZvcm1hdFNlbGVjdGVkRGF0ZSgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnRUVFRSwgZCBNTU1NJ1xuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ01NTU0gZCwgRUVFRSc7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2NhbGUoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgbG9jYWxlID0gJ2VzLUVTJ1xuICAgIGlmKGxhbmcgPT09ICdjYScpe1xuICAgICAgbG9jYWxlID0gJ2NhLUVTJ1xuICAgIH1lbHNlIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBsb2NhbGUgPSAnZW4tVVMnO1xuXG4gICAgcmV0dXJuIGxvY2FsZTtcblxuICB9XG5cbiAgcHVibGljIGdldFN0YXJ0aW5nRGF5V2Vlaygpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBkYXkgPSAnMSdcbiAgICBpZihsYW5nID09ICdlbicpXG4gICAgICBkYXkgPSAnMCdcblxuICAgIHJldHVybiBkYXk7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRTdGFydGluZ0RheU1vbnRoKCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGRheSA9IDFcbiAgICBpZihsYW5nID09ICdlbicpXG4gICAgICBkYXkgPSAwXG5cbiAgICByZXR1cm4gZGF5O1xuICB9XG5cbiAgJ2RkL01NL3knXG5cbiAgcHVibGljIGRkTU15KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZC9NTS95J1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU0vZGQveSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgcHVibGljIGdldFNob3J0RGF0ZUZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVknXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9ERC9ZWSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgcHVibGljIGRkTU15eXl5Rm9ybWF0KGRhdGUpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGQvTU0veXl5eSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9kZC95eXl5JztcblxuICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gIH1cblxuICBwdWJsaWMgZGRNTXlGb3JtYXQoZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZCBNTU0geSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gZGQgeSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBkZE1NTXl5eWZvcm1hdChkYXRlKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ2RkIE1NTSB5eXknO1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJylcbiAgICAgIGZvcm1hdCA9ICdNTU0gZGQgeXl5JztcblxuICAgICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgICAgcmV0dXJuIGRheVswXS50b1VwcGVyQ2FzZSgpICsgZGF5LnNsaWNlKDEpXG5cbiAgfVxuXG4gIHB1YmxpYyBNTU1NeXl5eUZvcm1hdChkYXRlKXtcblxuICAgIGxldCBmb3JtYXQgPSdNTU1NIHl5eXknO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXlNb250aFllYXJGb3JtYXQoZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFRUVFLCBkIE1NTU0gWVlZWSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NLCBkIEVFRUUgWVlZWSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZERhdGVGb3JtYXQoZGF0ZTpzdHJpbmcpe1xuXG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFRUVFLCBkIE1NTU0nXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NIGQsIFlZWVknO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG5cblxuICBkZE1NeXl5eUhIbW0oZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZC9NTS95eXl5IEhIOm1tJ1xuICAgIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBmb3JtYXQgPSAgJ01NL2RkL3l5eXkgaGg6bW0gYSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKVxuICB9XG5cblxuICBwdWJsaWMgZm9ybWF0RGF0ZUxvbmdGb3JtYXQoZGF0ZT8pe1xuXG4gICAgaWYoZGF0ZSl7XG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIHRoaXMuZ2V0TG9uZ0RhdGVGb3JtYXQoKSk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuXG4gIH1cblxuICBwdWJsaWMgeXl5eU1NZGRISG1tKGRhdGU/KXtcblxuICAgIGlmKGRhdGUpe1xuICAgICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCB0aGlzLnl5eXlNTWRkSEhtbUZvcm1hdCgpKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2VsZWN0ZWQgRGF5XCIsIGRheSk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgeXl5eU1NZGRISG1tRm9ybWF0KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICd5eXl5LWRkLU1NIEhIOm1tJztcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ3l5eXktTU0tZGQgSEg6bW0gYSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuXG4gIH1cblxuXG4gIHB1YmxpYyBnZXRMb25nRGF0ZUZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAgJ0VFRUUsIGQgTU1NTSB5eXl5LCBISDptbSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NLCBkIHl5eXksIGhoOm1tIGEnO1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcblxuICB9XG4gIHB1YmxpYyBnZXREYXRldGltZUNvbnRyb2xGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ0QgTU1NIFlZWVkgSEg6bW0nXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gRCBZWSBoaDptbSBhJztcblxuICAgICAgcmV0dXJuIGZvcm1hdDtcblxuICB9XG5cbiAgcHVibGljIGdldERheU1vbnRoRm9ybWF0KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkIE1NTSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gZCc7XG5cbiAgICAgIHJldHVybiBmb3JtYXQ7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXREYXlEb3RNb250aEZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZC4gTU1NJztcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ01NTS4gZCc7XG5cbiAgICAgIHJldHVybiBmb3JtYXQ7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFdlZWsoZGF0ZTpzdHJpbmcpe1xuXG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFIGQgTU1NJ1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NIGQsIEUnO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFdlZWtGdWxsRGF5KGRhdGU6c3RyaW5nKXtcblxuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnRUVFIGQgTU1NJ1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NIGQsIEVFRSc7XG5cbiAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIGZvcm1hdCk7XG4gICAgcmV0dXJuIGRheVswXS50b1VwcGVyQ2FzZSgpICsgZGF5LnNsaWNlKDEpO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdERhdGUoZGF0ZT8pe1xuICAgIGlmKGRhdGUpe1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpXG5cbiAgICAgIGlmKHRoaXMuaXNUb2RheShkYXRlKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICB0aGlzLmdldFRpbWVGb3JtYXQoKSlcbiAgICAgIGVsc2V7XG4gICAgICAgIGxldCBmb3JtYXQgPSB0aGlzLmdldERhdGVGb3JtYXQyKClcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpXG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuXG4gIGRkTU15eXl5KGRhdGUpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGQtTU0teXl5eSdcbiAgICBpZihsYW5nID09PSAnZW4nKVxuICAgICAgZm9ybWF0ID0gJ01NLWRkLXl5eXknO1xuXG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSlcbiAgfVxuXG4gIGhpZ2hjaGFydHNEYXRlc0Zvcm5tYXQoKXtcblxuICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0ge307XG4gIGlmKGxhbmcgPT0gJ2VuJyl7XG4gICAgICAvLyAlYjogU2hvcnQgbW9udGgsIGxpa2UgJ0phbicsJWUgRGF5IG9mIHRoZSBtb250aCwgMSB0aHJvdWdoIDMxXG4gICAgICBmb3JtYXQgPSB7XG4gICAgICAgIG1pbGxpc2Vjb25kOiAnJUg6JU06JVMuJUwnLFxuICAgICAgICBzZWNvbmQ6ICclbDolTTolUyAlUCcsXG4gICAgICAgIG1pbnV0ZTogJyVsOiVNICVwJyxcbiAgICAgICAgaG91cjogJyVsOiVNICVwJyxcbiAgICAgICAgZGF5OiAnJWIuICVlJyxcbiAgICAgICAgd2VlazogJyViLiAlZScsXG4gICAgICAgIG1vbnRoOiAnJWIgXFwnJXknLFxuICAgICAgICB5ZWFyOiAnJVknXG4gICAgICB9XG4gICAgfWVsc2V7XG4gICAgICBmb3JtYXQgPSB7XG4gICAgICAgIG1pbGxpc2Vjb25kOiAnJUg6JU06JVMuJUwnLFxuICAgICAgICBzZWNvbmQ6ICclSDolTTolUycsXG4gICAgICAgIG1pbnV0ZTogJyVIOiVNJyxcbiAgICAgICAgaG91cjogJyVIOiVNJyxcbiAgICAgICAgZGF5OiAnJWUuICViJyxcbiAgICAgICAgd2VlazogJyVlLiAlYicsXG4gICAgICAgIG1vbnRoOiAnJWIgXFwnJXknLFxuICAgICAgICB5ZWFyOiAnJVknXG4gICAgfVxuICAgIH1cbiAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICB5eXl5TU1kZEZvcm1hdChkYXRlKXtcbiAgICBjb25zb2xlLmxvZyhcIkRBVEUgZGF0ZTogXCIsIGRhdGUpO1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGNvbnNvbGUubG9nKFwiREFURSBsYW5nOiBcIiwgbGFuZyk7XG4gICAgbGV0IGZvcm1hdCA9ICd5eXl5LU1NLWRkJztcblxuICAgIGlmKGxhbmcgPT0gJ2VuJylcbiAgICAgIGZvcm1hdCA9ICd5eXl5LWRkLU1NJztcblxuICAgIGNvbnNvbGUubG9nKFwiREFURSBmb3JtYXQ6IFwiLCBmb3JtYXQpO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuXG4gICAgY29uc29sZS5sb2coXCJEQVRFIGRheTogXCIsIGRheSk7XG5cbiAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSlcbiAgfVxuXG4gIHB1YmxpYyB5eXl5TU1kZFRISG1tc3NTU1NaRm9ybWF0KGRhdGU/KXtcbiAgICBjb25zdCBmZWNoYUZvcm1hdGVhZGEgPXRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICd5eXl5LU1NLWRkVEhIOm1tOnNzLlNTU1xcJ1pcXCcnKTtcbiAgICByZXR1cm4gZmVjaGFGb3JtYXRlYWRhO1xuICB9XG4gIGNvbnZlcnQxMnRvMjRmb3JtYXQodGltZSl7XG5cbiAgICBjb25zb2xlLmxvZyhcIlRJTUUgMTJ0bzI0OiBcIix0aW1lKTtcbiAgICB2YXIgaG91cnMgPSBOdW1iZXIodGltZS5tYXRjaCgvXihcXGQrKS8pWzFdKTtcbiAgICB2YXIgbWludXRlcyA9IE51bWJlcih0aW1lLm1hdGNoKC86KFxcZCspLylbMV0pO1xuICAgIHZhciBBTVBNID0gdGltZS5tYXRjaCgvXFxzKC4qKSQvKVsxXTtcbiAgICBpZihBTVBNID09IFwiUE1cIiAmJiBob3VyczwxMikgaG91cnMgPSBob3VycysxMjtcbiAgICBpZihBTVBNID09IFwiQU1cIiAmJiBob3Vycz09MTIpIGhvdXJzID0gaG91cnMtMTI7XG4gICAgdmFyIHNIb3VycyA9IGhvdXJzLnRvU3RyaW5nKCk7XG4gICAgdmFyIHNNaW51dGVzID0gbWludXRlcy50b1N0cmluZygpO1xuICAgIGlmKGhvdXJzPDEwKSBzSG91cnMgPSBcIjBcIiArIHNIb3VycztcbiAgICBpZihtaW51dGVzPDEwKSBzTWludXRlcyA9IFwiMFwiICsgc01pbnV0ZXM7XG5cbiAgICBsZXQgaCA9IHNIb3VycyArIFwiOlwiICsgc01pbnV0ZXM7XG5cbiAgICBjb25zb2xlLmxvZyhcIkhPVVJTOiBcIixoKTtcbiAgICByZXR1cm4gaDtcbiAgfVxuXG4gIGZvcm1hdDI0aCh0aW1lKSB7XG5cbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBpZihsYW5nID09PSAnZW4nKXtcbiAgICAgIC8vIENoZWNrIGNvcnJlY3QgdGltZSBmb3JtYXQgYW5kIHNwbGl0IGludG8gY29tcG9uZW50c1xuICAgIHRpbWUgPSB0aW1lLnRvU3RyaW5nICgpLm1hdGNoICgvXihbMDFdXFxkfDJbMC0zXSkoOikoWzAtNV1cXGQpKDpbMC01XVxcZCk/JC8pIHx8IFt0aW1lXTtcblxuICAgIGlmICh0aW1lLmxlbmd0aCA+IDEpIHsgLy8gSWYgdGltZSBmb3JtYXQgY29ycmVjdFxuICAgICAgdGltZSA9IHRpbWUuc2xpY2UgKDEpOyAgLy8gUmVtb3ZlIGZ1bGwgc3RyaW5nIG1hdGNoIHZhbHVlXG4gICAgICB0aW1lWzVdID0gK3RpbWVbMF0gPCAxMiA/ICcgQU0nIDogJyBQTSc7IC8vIFNldCBBTS9QTVxuICAgICAgdGltZVswXSA9ICt0aW1lWzBdICUgMTIgfHwgMTI7IC8vIEFkanVzdCBob3Vyc1xuICAgIH1cbiAgICByZXR1cm4gdGltZS5qb2luICgnJyk7IC8vIHJldHVybiBhZGp1c3RlZCB0aW1lIG9yIG9yaWdpbmFsIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcblxuICB9XG5cbiAgaXNBbWVyaWNhbkZvcm1hdCgpe1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gJ2VuJztcbiAgfVxuXG4gIGdldFRpbWVGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gICdISDptbSdcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gICdoaDptbSBhJztcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBpc1RvZGF5KG1EYXRlOiBEYXRlKXtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICBpZihkYXRlLmdldERhdGUoKSA9PT0gbURhdGUuZ2V0RGF0ZSgpICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbURhdGUuZ2V0TW9udGgoKSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IG1EYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUodGhpcy5nZXRMb2NhbGUoKSk7XG4gICAgcmV0dXJuIGRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCBmb3JtYXQpO1xuICB9XG5cbiAgZ2V0Q2FsZW5kYXJEYXkoZXBvY2g6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFlcG9jaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB0aW1lU3RyaW5nID0gJ2g6bW0gQSc7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG9kYXknKTtcbiAgICBjb25zdCB5ZXN0ZXJkYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEueWVzdGVyZGF5Jyk7XG4gICAgcmV0dXJuIG1vbWVudChlcG9jaCkuY2FsZW5kYXIobnVsbCwge1xuICAgICAgc2FtZURheTogYFske3RvZGF5fV0gYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0RGF5OiBgWyR7eWVzdGVyZGF5fV0gYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0V2VlayA6ICdERC9NTS9ZWSAnICsgdGltZVN0cmluZyxcbiAgICAgIHNhbWVFbHNlOiAnREQvTU0vWVkgJyArIHRpbWVTdHJpbmcsXG4gICAgICBuZXh0RGF5IDogJ0REL01NL1lZICcgKyB0aW1lU3RyaW5nLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2FsZW5kYXJEYXkyKGVwb2NoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghZXBvY2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdGltZVN0cmluZyA9IHRoaXMuZ2V0VGltZUZvcm1hdCgpO1xuICAgIGxldCBkYXRlU3RyaW5nID0gdGhpcy5nZXRTaG9ydERhdGVGb3JtYXQoKTtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FnZW5kYS50b2RheScpO1xuICAgIGNvbnN0IHllc3RlcmRheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FnZW5kYS55ZXN0ZXJkYXknKTtcbiAgICByZXR1cm4gbW9tZW50KGVwb2NoKS5jYWxlbmRhcihudWxsLCB7XG4gICAgICBzYW1lRGF5OiBgWyR7dG9kYXl9XSAgYCAgKyB0aW1lU3RyaW5nLFxuICAgICAgbGFzdERheTogYFske3llc3RlcmRheX1dICBgICsgdGltZVN0cmluZyxcbiAgICAgIHNhbWVFbHNlOiBkYXRlU3RyaW5nICsgJyAnICsgdGltZVN0cmluZyxcbiAgICAgIGxhc3RXZWVrIDogZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmcsXG4gICAgICBuZXh0RGF5IDogZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmdcbiAgICB9KTtcbiAgfVxuXG5cbiAgZ2V0Q2FsZW5kYXJEYXlUaW1lKGVwb2NoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghZXBvY2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdGltZVN0cmluZyA9IHRoaXMuZ2V0VGltZUZvcm1hdCgpO1xuICAgIGxldCBkYXRlU3RyaW5nID0gdGhpcy5nZXRMb25nRm9ybWF0KCk7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG9kYXknKTtcbiAgICBjb25zdCB5ZXN0ZXJkYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEueWVzdGVyZGF5Jyk7XG4gICAgY29uc3QgdG8gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG8nKTtcblxuICAgIGNvbnN0ICBtID0gbW9tZW50XG4gICAgbS5sb2NhbGUobGFuZylcbiAgICByZXR1cm4gbShlcG9jaCkuY2FsZW5kYXIobnVsbCwge1xuICAgICAgc2FtZURheTogYFske3RvZGF5fV0gIGAgICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nLFxuICAgICAgbGFzdERheTogYFske3llc3RlcmRheX1dICBgICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nLFxuICAgICAgc2FtZUVsc2U6IGRhdGVTdHJpbmcgKyAnICcgKyBgWyR7dG99XSAgYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0V2VlazogZGF0ZVN0cmluZyArICcgJyArIGBbJHt0b31dICBgICsgdGltZVN0cmluZyxcbiAgICAgIG5leHREYXkgOiBkYXRlU3RyaW5nICsgJyAnICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nXG4gICAgfSlcbiAgfVxuXG4gIC8vIHJldHVybiBlcG9jaCBzdHJpbmcgYXMgc3BlY2lmaWVkIGZvcm1hdFxuICBmb3JtYXRFcG9jaChlcG9jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FsZW5kYXJEYXkoZXBvY2gpO1xuICB9XG5cbiAgZ2V0VG9kYXkoKXtcbiAgICBjb25zdCB0em9mZnNldCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7IC8vIG9mZnNldCBpbiBtaWxsaXNlY29uZHNcbiAgICBjb25zdCBsb2NhbElTT1RpbWUgPSAobmV3IERhdGUoRGF0ZS5ub3coKSAtIHR6b2Zmc2V0KSkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IGRhdGUgPSBsb2NhbElTT1RpbWUvLyB0aGlzLmRhdGVTZXJ2aWNlLnNlbGVjdGVkRGF0ZUZvcm1hdChsb2NhbElTT1RpbWUpO1xuICAgIHJldHVybiBkYXRlXG4gIH1cblxuICBnZXRDdXJyZW50VGltZSgpe1xuICAgIGNvbnN0IHR6b2Zmc2V0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDsgLy8gb2Zmc2V0IGluIG1pbGxpc2Vjb25kc1xuICAgIGNvbnN0IGxvY2FsSVNPVGltZSA9IChuZXcgRGF0ZShEYXRlLm5vdygpIC0gdHpvZmZzZXQpKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgZGF0ZSA9IGxvY2FsSVNPVGltZS8vIHRoaXMuZGF0ZVNlcnZpY2Uuc2VsZWN0ZWREYXRlRm9ybWF0KGxvY2FsSVNPVGltZSk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgLSB0em9mZnNldCkuZ2V0VGltZSgpLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH1cblxuXG59XG4iXX0=