raise-common-lib 0.0.248 → 0.0.249

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 (62) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +1937 -12
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/common-grid/index.component.js +210 -8
  7. package/esm2015/lib/date-tree-filter/date-tree-filter-popover/index.component.js +761 -0
  8. package/esm2015/lib/date-tree-filter/date-tree-filter.helper.js +679 -0
  9. package/esm2015/lib/raise-common-lib.module.js +4 -1
  10. package/esm2015/public-api.js +3 -1
  11. package/esm2015/raise-common-lib.js +2 -2
  12. package/esm5/lib/common-grid/index.component.js +244 -8
  13. package/esm5/lib/date-tree-filter/date-tree-filter-popover/index.component.js +902 -0
  14. package/esm5/lib/date-tree-filter/date-tree-filter.helper.js +787 -0
  15. package/esm5/lib/raise-common-lib.module.js +4 -1
  16. package/esm5/public-api.js +3 -1
  17. package/esm5/raise-common-lib.js +2 -2
  18. package/fesm2015/raise-common-lib.js +1649 -9
  19. package/fesm2015/raise-common-lib.js.map +1 -1
  20. package/fesm5/raise-common-lib.js +1931 -10
  21. package/fesm5/raise-common-lib.js.map +1 -1
  22. package/lib/common-grid/index.component.d.ts +30 -1
  23. package/lib/date-tree-filter/date-tree-filter-popover/index.component.d.ts +46 -0
  24. package/lib/date-tree-filter/date-tree-filter.helper.d.ts +54 -0
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
  27. package/raise-common-lib.metadata.json +1 -1
  28. package/src/assets/img/arrow_right.svg +4 -4
  29. package/src/assets/img/calendar-disabled.svg +6 -6
  30. package/src/assets/img/calendar.svg +6 -6
  31. package/src/assets/img/calendar_arrow_left.svg +3 -3
  32. package/src/assets/img/calendar_arrow_right.svg +3 -3
  33. package/src/assets/img/checked-vector.svg +3 -3
  34. package/src/assets/img/dialog-close.svg +4 -4
  35. package/src/assets/img/dialog-grow.svg +6 -6
  36. package/src/assets/img/dialog-shrink.svg +6 -6
  37. package/src/assets/img/plus.svg +4 -4
  38. package/src/assets/img/raise_logo_main_new.svg +27 -27
  39. package/src/assets/img/search.svg +4 -4
  40. package/src/assets/img/shrink-icon.svg +6 -6
  41. package/src/assets/img/time-disabled.svg +4 -4
  42. package/src/assets/img/time.svg +4 -4
  43. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  44. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  45. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  46. package/src/assets/img/toolbar-action-combine.svg +4 -4
  47. package/src/assets/img/toolbar-action-edit.svg +4 -4
  48. package/src/assets/img/toolbar-action-expand.svg +7 -7
  49. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  50. package/src/assets/img/toolbar-action-lock.svg +6 -6
  51. package/src/assets/img/toolbar-action-preview.svg +7 -7
  52. package/src/assets/img/toolbar-action-publish.svg +5 -5
  53. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  54. package/src/assets/img/toolbar-action-rename.svg +7 -7
  55. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  56. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  57. package/src/assets/img/toolbar-action-settle.svg +7 -7
  58. package/src/assets/img/toolbar-action-share.svg +5 -5
  59. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  60. package/src/assets/img/toolbar-action-sync.svg +4 -4
  61. package/src/assets/img/toolbar-action-template.svg +6 -6
  62. package/src/assets/img/toolbar-action-workflow.svg +9 -9
@@ -0,0 +1,761 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/date-tree-filter/date-tree-filter-popover/index.component.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { Component, EventEmitter, Input, Output, } from "@angular/core";
7
+ import moment from "moment";
8
+ export class DateTreeFilterPopoverComponent {
9
+ constructor() {
10
+ this.field = "";
11
+ this.sourceRows = [];
12
+ this.dateFields = [];
13
+ this.selectedByField = {};
14
+ this.fieldLabelMap = {};
15
+ this.apply = new EventEmitter();
16
+ this.close = new EventEmitter();
17
+ this.keyword = "";
18
+ this.years = [];
19
+ this.expandStateByField = {};
20
+ this.workingSelectedByField = {};
21
+ }
22
+ /**
23
+ * @param {?} changes
24
+ * @return {?}
25
+ */
26
+ ngOnChanges(changes) {
27
+ if (changes.field ||
28
+ changes.sourceRows ||
29
+ changes.selectedByField ||
30
+ changes.dateFields) {
31
+ this.keyword = "";
32
+ this.workingSelectedByField = this.cloneSelectionMap(this.selectedByField);
33
+ this.rebuildTree();
34
+ }
35
+ }
36
+ /**
37
+ * @return {?}
38
+ */
39
+ closePopover() {
40
+ this.close.emit();
41
+ }
42
+ /**
43
+ * @param {?} value
44
+ * @return {?}
45
+ */
46
+ onKeywordChange(value) {
47
+ this.keyword = value || "";
48
+ }
49
+ /**
50
+ * @return {?}
51
+ */
52
+ getVisibleYears() {
53
+ /** @type {?} */
54
+ const searchText = (this.keyword || "").trim().toLowerCase();
55
+ if (!searchText) {
56
+ return this.years;
57
+ }
58
+ return this.years
59
+ .map((/**
60
+ * @param {?} yearNode
61
+ * @return {?}
62
+ */
63
+ (yearNode) => {
64
+ /** @type {?} */
65
+ const yearMatched = String(yearNode.year).toLowerCase().indexOf(searchText) > -1;
66
+ /** @type {?} */
67
+ const months = yearNode.months
68
+ .map((/**
69
+ * @param {?} monthNode
70
+ * @return {?}
71
+ */
72
+ (monthNode) => {
73
+ /** @type {?} */
74
+ const monthMatched = String(monthNode.label)
75
+ .toLowerCase()
76
+ .indexOf(searchText) > -1;
77
+ /** @type {?} */
78
+ const days = monthNode.days.filter((/**
79
+ * @param {?} dayNode
80
+ * @return {?}
81
+ */
82
+ (dayNode) => {
83
+ return (String(dayNode.label)
84
+ .toLowerCase()
85
+ .indexOf(searchText) > -1);
86
+ }));
87
+ if (yearMatched || monthMatched) {
88
+ return monthNode;
89
+ }
90
+ return Object.assign({}, monthNode, { days: days });
91
+ }))
92
+ .filter((/**
93
+ * @param {?} monthNode
94
+ * @return {?}
95
+ */
96
+ (monthNode) => monthNode.days.length > 0));
97
+ if (yearMatched) {
98
+ return yearNode;
99
+ }
100
+ return Object.assign({}, yearNode, { months: months });
101
+ }))
102
+ .filter((/**
103
+ * @param {?} yearNode
104
+ * @return {?}
105
+ */
106
+ (yearNode) => yearNode.months.length > 0));
107
+ }
108
+ /**
109
+ * @param {?} yearNode
110
+ * @return {?}
111
+ */
112
+ toggleYearExpanded(yearNode) {
113
+ /** @type {?} */
114
+ const state = this.getOrCreateExpandState(this.field);
115
+ state.years[yearNode.key] = !state.years[yearNode.key];
116
+ yearNode.expanded = !!state.years[yearNode.key];
117
+ }
118
+ /**
119
+ * @param {?} monthNode
120
+ * @return {?}
121
+ */
122
+ toggleMonthExpanded(monthNode) {
123
+ /** @type {?} */
124
+ const state = this.getOrCreateExpandState(this.field);
125
+ state.months[monthNode.key] = !state.months[monthNode.key];
126
+ monthNode.expanded = !!state.months[monthNode.key];
127
+ }
128
+ /**
129
+ * @return {?}
130
+ */
131
+ isAllChecked() {
132
+ /** @type {?} */
133
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
134
+ /** @type {?} */
135
+ const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
136
+ if (!enabledDayKeys.length) {
137
+ return false;
138
+ }
139
+ return enabledDayKeys.every((/**
140
+ * @param {?} key
141
+ * @return {?}
142
+ */
143
+ (key) => !!selectedMap[key]));
144
+ }
145
+ /**
146
+ * @return {?}
147
+ */
148
+ isAllIndeterminate() {
149
+ /** @type {?} */
150
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
151
+ /** @type {?} */
152
+ const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
153
+ if (!enabledDayKeys.length) {
154
+ return false;
155
+ }
156
+ /** @type {?} */
157
+ const selectedCount = enabledDayKeys.filter((/**
158
+ * @param {?} key
159
+ * @return {?}
160
+ */
161
+ (key) => !!selectedMap[key]))
162
+ .length;
163
+ return selectedCount > 0 && selectedCount < enabledDayKeys.length;
164
+ }
165
+ /**
166
+ * @param {?} checked
167
+ * @return {?}
168
+ */
169
+ toggleAllDays(checked) {
170
+ /** @type {?} */
171
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
172
+ /** @type {?} */
173
+ const enabledDayKeys = this.getEnabledDayKeysInCurrentField();
174
+ enabledDayKeys.forEach((/**
175
+ * @param {?} key
176
+ * @return {?}
177
+ */
178
+ (key) => {
179
+ if (checked) {
180
+ selectedMap[key] = true;
181
+ }
182
+ else {
183
+ delete selectedMap[key];
184
+ }
185
+ }));
186
+ }
187
+ /**
188
+ * @param {?} dayNode
189
+ * @return {?}
190
+ */
191
+ isDayChecked(dayNode) {
192
+ /** @type {?} */
193
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
194
+ return !!selectedMap[dayNode.key];
195
+ }
196
+ /**
197
+ * @param {?} dayNode
198
+ * @param {?} checked
199
+ * @return {?}
200
+ */
201
+ toggleDay(dayNode, checked) {
202
+ if (dayNode.disabled) {
203
+ return;
204
+ }
205
+ /** @type {?} */
206
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
207
+ if (checked) {
208
+ selectedMap[dayNode.key] = true;
209
+ }
210
+ else {
211
+ delete selectedMap[dayNode.key];
212
+ }
213
+ }
214
+ /**
215
+ * @param {?} monthNode
216
+ * @return {?}
217
+ */
218
+ isMonthDisabled(monthNode) {
219
+ return monthNode.days.every((/**
220
+ * @param {?} dayNode
221
+ * @return {?}
222
+ */
223
+ (dayNode) => dayNode.disabled));
224
+ }
225
+ /**
226
+ * @param {?} monthNode
227
+ * @return {?}
228
+ */
229
+ isMonthChecked(monthNode) {
230
+ if (this.isMonthDisabled(monthNode)) {
231
+ return false;
232
+ }
233
+ /** @type {?} */
234
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
235
+ /** @type {?} */
236
+ const enabledDays = monthNode.days.filter((/**
237
+ * @param {?} dayNode
238
+ * @return {?}
239
+ */
240
+ (dayNode) => !dayNode.disabled));
241
+ return enabledDays.every((/**
242
+ * @param {?} dayNode
243
+ * @return {?}
244
+ */
245
+ (dayNode) => !!selectedMap[dayNode.key]));
246
+ }
247
+ /**
248
+ * @param {?} monthNode
249
+ * @return {?}
250
+ */
251
+ isMonthIndeterminate(monthNode) {
252
+ if (this.isMonthDisabled(monthNode)) {
253
+ return false;
254
+ }
255
+ /** @type {?} */
256
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
257
+ /** @type {?} */
258
+ const enabledDays = monthNode.days.filter((/**
259
+ * @param {?} dayNode
260
+ * @return {?}
261
+ */
262
+ (dayNode) => !dayNode.disabled));
263
+ /** @type {?} */
264
+ const selectedCount = enabledDays.filter((/**
265
+ * @param {?} dayNode
266
+ * @return {?}
267
+ */
268
+ (dayNode) => {
269
+ return !!selectedMap[dayNode.key];
270
+ })).length;
271
+ return selectedCount > 0 && selectedCount < enabledDays.length;
272
+ }
273
+ /**
274
+ * @param {?} monthNode
275
+ * @param {?} checked
276
+ * @return {?}
277
+ */
278
+ toggleMonth(monthNode, checked) {
279
+ if (this.isMonthDisabled(monthNode)) {
280
+ return;
281
+ }
282
+ /** @type {?} */
283
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
284
+ monthNode.days.forEach((/**
285
+ * @param {?} dayNode
286
+ * @return {?}
287
+ */
288
+ (dayNode) => {
289
+ if (dayNode.disabled) {
290
+ return;
291
+ }
292
+ if (checked) {
293
+ selectedMap[dayNode.key] = true;
294
+ }
295
+ else {
296
+ delete selectedMap[dayNode.key];
297
+ }
298
+ }));
299
+ }
300
+ /**
301
+ * @param {?} yearNode
302
+ * @return {?}
303
+ */
304
+ isYearDisabled(yearNode) {
305
+ return yearNode.months.every((/**
306
+ * @param {?} monthNode
307
+ * @return {?}
308
+ */
309
+ (monthNode) => this.isMonthDisabled(monthNode)));
310
+ }
311
+ /**
312
+ * @param {?} yearNode
313
+ * @return {?}
314
+ */
315
+ isYearChecked(yearNode) {
316
+ if (this.isYearDisabled(yearNode)) {
317
+ return false;
318
+ }
319
+ /** @type {?} */
320
+ const enabledMonths = yearNode.months.filter((/**
321
+ * @param {?} monthNode
322
+ * @return {?}
323
+ */
324
+ (monthNode) => !this.isMonthDisabled(monthNode)));
325
+ return enabledMonths.every((/**
326
+ * @param {?} monthNode
327
+ * @return {?}
328
+ */
329
+ (monthNode) => this.isMonthChecked(monthNode)));
330
+ }
331
+ /**
332
+ * @param {?} yearNode
333
+ * @return {?}
334
+ */
335
+ isYearIndeterminate(yearNode) {
336
+ if (this.isYearDisabled(yearNode)) {
337
+ return false;
338
+ }
339
+ /** @type {?} */
340
+ const selectedMap = this.getFieldDaySelectionMap(this.field);
341
+ /** @type {?} */
342
+ const enabledDays = [];
343
+ yearNode.months.forEach((/**
344
+ * @param {?} monthNode
345
+ * @return {?}
346
+ */
347
+ (monthNode) => {
348
+ monthNode.days.forEach((/**
349
+ * @param {?} dayNode
350
+ * @return {?}
351
+ */
352
+ (dayNode) => {
353
+ if (!dayNode.disabled) {
354
+ enabledDays.push(dayNode.key);
355
+ }
356
+ }));
357
+ }));
358
+ /** @type {?} */
359
+ const selectedCount = enabledDays.filter((/**
360
+ * @param {?} key
361
+ * @return {?}
362
+ */
363
+ (key) => !!selectedMap[key])).length;
364
+ return selectedCount > 0 && selectedCount < enabledDays.length;
365
+ }
366
+ /**
367
+ * @param {?} yearNode
368
+ * @param {?} checked
369
+ * @return {?}
370
+ */
371
+ toggleYear(yearNode, checked) {
372
+ if (this.isYearDisabled(yearNode)) {
373
+ return;
374
+ }
375
+ yearNode.months.forEach((/**
376
+ * @param {?} monthNode
377
+ * @return {?}
378
+ */
379
+ (monthNode) => {
380
+ this.toggleMonth(monthNode, checked);
381
+ }));
382
+ }
383
+ /**
384
+ * @return {?}
385
+ */
386
+ clearSelection() {
387
+ if (this.field) {
388
+ this.workingSelectedByField[this.field] = {};
389
+ }
390
+ this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
391
+ this.rebuildTree();
392
+ }
393
+ /**
394
+ * @return {?}
395
+ */
396
+ applySelection() {
397
+ this.apply.emit(this.cloneSelectionMap(this.workingSelectedByField));
398
+ this.closePopover();
399
+ }
400
+ /**
401
+ * @private
402
+ * @return {?}
403
+ */
404
+ rebuildTree() {
405
+ if (!this.field) {
406
+ this.years = [];
407
+ return;
408
+ }
409
+ /** @type {?} */
410
+ const sourceRows = this.sourceRows || [];
411
+ /** @type {?} */
412
+ const rowsByOtherFilters = this.filterRowsBySelectedDateTree(sourceRows, this.field);
413
+ /** @type {?} */
414
+ const availableDayKeyMap = {};
415
+ rowsByOtherFilters.forEach((/**
416
+ * @param {?} row
417
+ * @return {?}
418
+ */
419
+ (row) => {
420
+ /** @type {?} */
421
+ const dayKey = this.getDayKeyByRowValue(row[this.field]);
422
+ if (dayKey) {
423
+ availableDayKeyMap[dayKey] = true;
424
+ }
425
+ }));
426
+ /** @type {?} */
427
+ const groupedMap = {};
428
+ sourceRows.forEach((/**
429
+ * @param {?} row
430
+ * @return {?}
431
+ */
432
+ (row) => {
433
+ /** @type {?} */
434
+ const date = this.parseDateValue(row[this.field]);
435
+ if (!date) {
436
+ return;
437
+ }
438
+ /** @type {?} */
439
+ const year = date.getFullYear();
440
+ /** @type {?} */
441
+ const month = date.getMonth() + 1;
442
+ /** @type {?} */
443
+ const day = date.getDate();
444
+ if (!groupedMap[year]) {
445
+ groupedMap[year] = {};
446
+ }
447
+ if (!groupedMap[year][month]) {
448
+ groupedMap[year][month] = {};
449
+ }
450
+ if (!groupedMap[year][month][day]) {
451
+ groupedMap[year][month][day] = 0;
452
+ }
453
+ groupedMap[year][month][day] += 1;
454
+ }));
455
+ /** @type {?} */
456
+ const expandState = this.getOrCreateExpandState(this.field);
457
+ this.years = Object.keys(groupedMap)
458
+ .map((/**
459
+ * @param {?} key
460
+ * @return {?}
461
+ */
462
+ (key) => Number(key)))
463
+ .sort((/**
464
+ * @param {?} a
465
+ * @param {?} b
466
+ * @return {?}
467
+ */
468
+ (a, b) => b - a))
469
+ .map((/**
470
+ * @param {?} year
471
+ * @return {?}
472
+ */
473
+ (year) => {
474
+ /** @type {?} */
475
+ const months = Object.keys(groupedMap[year])
476
+ .map((/**
477
+ * @param {?} key
478
+ * @return {?}
479
+ */
480
+ (key) => Number(key)))
481
+ .sort((/**
482
+ * @param {?} a
483
+ * @param {?} b
484
+ * @return {?}
485
+ */
486
+ (a, b) => a - b))
487
+ .map((/**
488
+ * @param {?} month
489
+ * @return {?}
490
+ */
491
+ (month) => {
492
+ /** @type {?} */
493
+ const monthKey = year + "-" + this.pad2(month);
494
+ if (expandState.months[monthKey] === undefined) {
495
+ expandState.months[monthKey] = true;
496
+ }
497
+ /** @type {?} */
498
+ const days = Object.keys(groupedMap[year][month])
499
+ .map((/**
500
+ * @param {?} key
501
+ * @return {?}
502
+ */
503
+ (key) => Number(key)))
504
+ .sort((/**
505
+ * @param {?} a
506
+ * @param {?} b
507
+ * @return {?}
508
+ */
509
+ (a, b) => a - b))
510
+ .map((/**
511
+ * @param {?} day
512
+ * @return {?}
513
+ */
514
+ (day) => {
515
+ /** @type {?} */
516
+ const dayKey = this.toDayKey(year, month, day);
517
+ /** @type {?} */
518
+ const dayDate = new Date(year, month - 1, day);
519
+ return {
520
+ key: dayKey,
521
+ day: day,
522
+ label: moment(dayDate).format("D MMM YYYY"),
523
+ count: groupedMap[year][month][day],
524
+ disabled: !availableDayKeyMap[dayKey],
525
+ };
526
+ }));
527
+ return {
528
+ key: monthKey,
529
+ month: month,
530
+ label: moment()
531
+ .month(month - 1)
532
+ .format("MMM"),
533
+ expanded: !!expandState.months[monthKey],
534
+ days: days,
535
+ };
536
+ }));
537
+ /** @type {?} */
538
+ const yearKey = String(year);
539
+ if (expandState.years[yearKey] === undefined) {
540
+ expandState.years[yearKey] = true;
541
+ }
542
+ return {
543
+ key: yearKey,
544
+ year: year,
545
+ expanded: !!expandState.years[yearKey],
546
+ months: months,
547
+ };
548
+ }));
549
+ }
550
+ /**
551
+ * @private
552
+ * @param {?} rows
553
+ * @param {?=} excludeField
554
+ * @return {?}
555
+ */
556
+ filterRowsBySelectedDateTree(rows, excludeField) {
557
+ /** @type {?} */
558
+ let filteredRows = rows ? rows.slice() : [];
559
+ (this.dateFields || []).forEach((/**
560
+ * @param {?} field
561
+ * @return {?}
562
+ */
563
+ (field) => {
564
+ if (excludeField && field === excludeField) {
565
+ return;
566
+ }
567
+ /** @type {?} */
568
+ const selectedMap = this.getFieldDaySelectionMap(field);
569
+ /** @type {?} */
570
+ const selectedKeys = Object.keys(selectedMap);
571
+ if (!selectedKeys.length) {
572
+ return;
573
+ }
574
+ filteredRows = filteredRows.filter((/**
575
+ * @param {?} row
576
+ * @return {?}
577
+ */
578
+ (row) => {
579
+ /** @type {?} */
580
+ const dayKey = this.getDayKeyByRowValue(row[field]);
581
+ return dayKey ? !!selectedMap[dayKey] : false;
582
+ }));
583
+ }));
584
+ return filteredRows;
585
+ }
586
+ /**
587
+ * @private
588
+ * @param {?} value
589
+ * @return {?}
590
+ */
591
+ parseDateValue(value) {
592
+ if (!value) {
593
+ return null;
594
+ }
595
+ if (value instanceof Date) {
596
+ return value;
597
+ }
598
+ /** @type {?} */
599
+ const parsed = moment(value, [
600
+ "YYYY-MM-DD",
601
+ "MM/DD/YYYY",
602
+ "DD/MM/YYYY",
603
+ "YYYY/MM/DD",
604
+ "DD-MMM-YYYY",
605
+ "MMM DD, YYYY",
606
+ moment.ISO_8601,
607
+ ], true);
608
+ if (parsed.isValid()) {
609
+ return parsed.toDate();
610
+ }
611
+ /** @type {?} */
612
+ const fallback = new Date(value);
613
+ return isNaN(fallback.getTime()) ? null : fallback;
614
+ }
615
+ /**
616
+ * @private
617
+ * @param {?} field
618
+ * @return {?}
619
+ */
620
+ getOrCreateExpandState(field) {
621
+ if (!this.expandStateByField[field]) {
622
+ this.expandStateByField[field] = { years: {}, months: {} };
623
+ }
624
+ return this.expandStateByField[field];
625
+ }
626
+ /**
627
+ * @private
628
+ * @param {?} field
629
+ * @return {?}
630
+ */
631
+ getFieldDaySelectionMap(field) {
632
+ if (!this.workingSelectedByField[field]) {
633
+ this.workingSelectedByField[field] = {};
634
+ }
635
+ return this.workingSelectedByField[field];
636
+ }
637
+ /**
638
+ * @private
639
+ * @param {?} year
640
+ * @param {?} month
641
+ * @param {?} day
642
+ * @return {?}
643
+ */
644
+ toDayKey(year, month, day) {
645
+ return year + "-" + this.pad2(month) + "-" + this.pad2(day);
646
+ }
647
+ /**
648
+ * @private
649
+ * @param {?} value
650
+ * @return {?}
651
+ */
652
+ pad2(value) {
653
+ return value < 10 ? "0" + value : String(value);
654
+ }
655
+ /**
656
+ * @private
657
+ * @param {?} value
658
+ * @return {?}
659
+ */
660
+ getDayKeyByRowValue(value) {
661
+ /** @type {?} */
662
+ const date = this.parseDateValue(value);
663
+ if (!date) {
664
+ return "";
665
+ }
666
+ return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
667
+ }
668
+ /**
669
+ * @private
670
+ * @return {?}
671
+ */
672
+ getEnabledDayKeysInCurrentField() {
673
+ /** @type {?} */
674
+ const keys = [];
675
+ this.years.forEach((/**
676
+ * @param {?} yearNode
677
+ * @return {?}
678
+ */
679
+ (yearNode) => {
680
+ yearNode.months.forEach((/**
681
+ * @param {?} monthNode
682
+ * @return {?}
683
+ */
684
+ (monthNode) => {
685
+ monthNode.days.forEach((/**
686
+ * @param {?} dayNode
687
+ * @return {?}
688
+ */
689
+ (dayNode) => {
690
+ if (!dayNode.disabled) {
691
+ keys.push(dayNode.key);
692
+ }
693
+ }));
694
+ }));
695
+ }));
696
+ return keys;
697
+ }
698
+ /**
699
+ * @private
700
+ * @param {?} source
701
+ * @return {?}
702
+ */
703
+ cloneSelectionMap(source) {
704
+ try {
705
+ return source ? JSON.parse(JSON.stringify(source)) : {};
706
+ }
707
+ catch (e) {
708
+ return {};
709
+ }
710
+ }
711
+ }
712
+ DateTreeFilterPopoverComponent.decorators = [
713
+ { type: Component, args: [{
714
+ selector: "rs-date-tree-filter-popover",
715
+ template: "<div class=\"date-tree-filter-popover\">\r\n <div class=\"popover-search\">\r\n <span class=\"search-icon\"><img src=\"/assets/img/search.svg\" alt=\"\" /></span>\r\n <input\r\n type=\"text\"\r\n [placeholder]=\"translation.SEARCH || '.SEARCH'\"\r\n [value]=\"keyword\"\r\n (input)=\"onKeywordChange($event.target.value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"popover-tree\">\r\n <label class=\"tree-row all-row\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllChecked()\"\r\n [indeterminate]=\"isAllIndeterminate()\"\r\n (change)=\"toggleAllDays($event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ translation.ALL || '.ALL' }}</span>\r\n </label>\r\n\r\n <div class=\"year-block\" *ngFor=\"let yearNode of getVisibleYears()\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleYearExpanded(yearNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: yearNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isYearDisabled(yearNode)\"\r\n [checked]=\"isYearChecked(yearNode)\"\r\n [indeterminate]=\"isYearIndeterminate(yearNode)\"\r\n (change)=\"toggleYear(yearNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ yearNode.year }}</span>\r\n </div>\r\n\r\n <div class=\"month-block\" *ngIf=\"yearNode.expanded\">\r\n <div class=\"month-item\" *ngFor=\"let monthNode of yearNode.months\">\r\n <div class=\"tree-row\">\r\n <button\r\n type=\"button\"\r\n class=\"tree-toggle-btn\"\r\n (click)=\"toggleMonthExpanded(monthNode); $event.stopPropagation()\"\r\n >\r\n <span class=\"tree-arrow\" [ngClass]=\"{ expanded: monthNode.expanded }\"></span>\r\n </button>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"isMonthDisabled(monthNode)\"\r\n [checked]=\"isMonthChecked(monthNode)\"\r\n [indeterminate]=\"isMonthIndeterminate(monthNode)\"\r\n (change)=\"toggleMonth(monthNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ monthNode.label }}</span>\r\n </div>\r\n\r\n <div class=\"day-block\" *ngIf=\"monthNode.expanded\">\r\n <label\r\n class=\"tree-row day-row\"\r\n *ngFor=\"let dayNode of monthNode.days\"\r\n [ngClass]=\"{ disabled: dayNode.disabled }\"\r\n >\r\n <span class=\"tree-toggle-spacer\"></span>\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"dayNode.disabled\"\r\n [checked]=\"isDayChecked(dayNode)\"\r\n (change)=\"toggleDay(dayNode, $event.target.checked)\"\r\n />\r\n <span class=\"row-label\">{{ dayNode.label }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"popover-footer\">\r\n <button type=\"button\" (click)=\"clearSelection()\">\r\n {{ translation.CLEAR || '.CLEAR' }}\r\n </button>\r\n <button type=\"button\" class=\"primary-btn\" (click)=\"applySelection()\">\r\n {{ translation.APPLY || '.APPLY' }}\r\n </button>\r\n </div>\r\n</div>\r\n",
716
+ styles: [":host{position:fixed;left:12px;top:12px;z-index:20;width:300px}.date-tree-filter-popover{background:#fff;border:1px solid #eaedf0;border-radius:10px;box-shadow:0 0 4px rgba(0,0,0,.25);padding:4px 8px;display:flex;flex-direction:column;color:#44566c;font-family:Arial}.popover-search{position:relative;padding:4px 0 8px}.popover-search .search-icon{position:absolute;left:10px;top:10px;color:#929dab;font-size:12px;line-height:12px}.popover-search input{width:100%;height:28px;border:1px solid #eaedf0;border-radius:16px;padding:0 10px 0 28px;outline:0;font-size:12px;color:#44566c}.popover-tree{max-height:320px;overflow:auto;padding-right:2px}.tree-row{display:flex;align-items:center;min-height:24px;font-size:11px;line-height:14px;color:#44566c}.tree-row input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;margin:0 6px 0 0;box-sizing:border-box;border:1px solid #d8d8d8;border-radius:3px;background-color:#fff;cursor:pointer;vertical-align:middle;flex-shrink:0}.tree-row input[type=checkbox]:checked{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M0.5 4.31818L3 7.5L5.75 4L8.5 0.5' stroke='white' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:indeterminate{border-color:#1f7bff;background-color:#1f7bff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none'%3E%3Cpath d='M1.5 4.5H7.5' stroke='white' stroke-width='1.2' stroke-linecap='round'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:9px 9px}.tree-row input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.all-row{padding-left:20px;margin-bottom:2px}.year-block{margin-bottom:2px}.month-block{padding-left:20px}.day-block{padding-left:24px}.tree-toggle-btn{width:16px;height:16px;padding:0;margin-right:4px;border:none;background:0 0;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.tree-arrow{display:inline-block;width:6px;height:6px;border-right:1px solid #6c7c90;border-bottom:1px solid #6c7c90;transform:rotate(-45deg);transition:transform .15s}.tree-arrow.expanded{transform:rotate(45deg)}.tree-toggle-spacer{width:20px;display:inline-block}.row-label{color:#44566c}.day-row.disabled .row-label{color:#adb5bd}.popover-footer{margin-top:8px;padding:12px 0 8px;border-top:1px solid #eaedf0;display:flex;justify-content:flex-end;gap:12px}.popover-footer button{min-width:56px;height:26px;padding:0 8px;border-radius:4px;border:1px solid #dbe1e7;background:#fff;font-size:11px;color:#44566c;cursor:pointer}.popover-footer .primary-btn{background:#1364b3;border-color:#1364b3;color:#fff}"]
717
+ }] }
718
+ ];
719
+ DateTreeFilterPopoverComponent.propDecorators = {
720
+ field: [{ type: Input }],
721
+ translation: [{ type: Input }],
722
+ sourceRows: [{ type: Input }],
723
+ dateFields: [{ type: Input }],
724
+ selectedByField: [{ type: Input }],
725
+ fieldLabelMap: [{ type: Input }],
726
+ apply: [{ type: Output }],
727
+ close: [{ type: Output }]
728
+ };
729
+ if (false) {
730
+ /** @type {?} */
731
+ DateTreeFilterPopoverComponent.prototype.field;
732
+ /** @type {?} */
733
+ DateTreeFilterPopoverComponent.prototype.translation;
734
+ /** @type {?} */
735
+ DateTreeFilterPopoverComponent.prototype.sourceRows;
736
+ /** @type {?} */
737
+ DateTreeFilterPopoverComponent.prototype.dateFields;
738
+ /** @type {?} */
739
+ DateTreeFilterPopoverComponent.prototype.selectedByField;
740
+ /** @type {?} */
741
+ DateTreeFilterPopoverComponent.prototype.fieldLabelMap;
742
+ /** @type {?} */
743
+ DateTreeFilterPopoverComponent.prototype.apply;
744
+ /** @type {?} */
745
+ DateTreeFilterPopoverComponent.prototype.close;
746
+ /** @type {?} */
747
+ DateTreeFilterPopoverComponent.prototype.keyword;
748
+ /** @type {?} */
749
+ DateTreeFilterPopoverComponent.prototype.years;
750
+ /**
751
+ * @type {?}
752
+ * @private
753
+ */
754
+ DateTreeFilterPopoverComponent.prototype.expandStateByField;
755
+ /**
756
+ * @type {?}
757
+ * @private
758
+ */
759
+ DateTreeFilterPopoverComponent.prototype.workingSelectedByField;
760
+ }
761
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXRyZWUtZmlsdGVyL2RhdGUtdHJlZS1maWx0ZXItcG9wb3Zlci9pbmRleC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU81QixNQUFNLE9BQU8sOEJBQThCO0lBTDNDO1FBTVcsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV2QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVwQyxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUVqQix1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsMkJBQXNCLEdBQVEsRUFBRSxDQUFDO0lBeVozQyxDQUFDOzs7OztJQXZaQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFDRSxPQUFPLENBQUMsS0FBSztZQUNiLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxlQUFlO1lBQ3ZCLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCO1lBQ0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEQsSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztT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QTBDOztJQUMxQywrQ0FBMkM7O0lBRTNDLGlEQUFvQjs7SUFDcEIsK0NBQXlCOzs7OztJQUV6Qiw0REFBcUM7Ozs7O0lBQ3JDLGdFQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJycy1kYXRlLXRyZWUtZmlsdGVyLXBvcG92ZXJcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2luZGV4LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2luZGV4LmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVRyZWVGaWx0ZXJQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBmaWVsZCA9IFwiXCI7XHJcbiAgQElucHV0KCkgdHJhbnNsYXRpb246IGFueTtcclxuICBASW5wdXQoKSBzb3VyY2VSb3dzOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRhdGVGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRCeUZpZWxkOiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBmaWVsZExhYmVsTWFwOiBhbnkgPSB7fTtcclxuXHJcbiAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMga2V5d29yZCA9IFwiXCI7XHJcbiAgcHVibGljIHllYXJzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGV4cGFuZFN0YXRlQnlGaWVsZDogYW55ID0ge307XHJcbiAgcHJpdmF0ZSB3b3JraW5nU2VsZWN0ZWRCeUZpZWxkOiBhbnkgPSB7fTtcclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICBjaGFuZ2VzLmZpZWxkIHx8XHJcbiAgICAgIGNoYW5nZXMuc291cmNlUm93cyB8fFxyXG4gICAgICBjaGFuZ2VzLnNlbGVjdGVkQnlGaWVsZCB8fFxyXG4gICAgICBjaGFuZ2VzLmRhdGVGaWVsZHNcclxuICAgICkge1xyXG4gICAgICB0aGlzLmtleXdvcmQgPSBcIlwiO1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGQgPSB0aGlzLmNsb25lU2VsZWN0aW9uTWFwKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCeUZpZWxkXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVidWlsZFRyZWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZVBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleXdvcmRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5rZXl3b3JkID0gdmFsdWUgfHwgXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaXNpYmxlWWVhcnMoKTogYW55W10ge1xyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9ICh0aGlzLmtleXdvcmQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXNlYXJjaFRleHQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMueWVhcnM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy55ZWFyc1xyXG4gICAgICAubWFwKCh5ZWFyTm9kZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHllYXJNYXRjaGVkID1cclxuICAgICAgICAgIFN0cmluZyh5ZWFyTm9kZS55ZWFyKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMTtcclxuICAgICAgICBjb25zdCBtb250aHMgPSB5ZWFyTm9kZS5tb250aHNcclxuICAgICAgICAgIC5tYXAoKG1vbnRoTm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb250aE1hdGNoZWQgPVxyXG4gICAgICAgICAgICAgIFN0cmluZyhtb250aE5vZGUubGFiZWwpXHJcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgZGF5cyA9IG1vbnRoTm9kZS5kYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBTdHJpbmcoZGF5Tm9kZS5sYWJlbClcclxuICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgLmluZGV4T2Yoc2VhcmNoVGV4dCkgPiAtMVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoeWVhck1hdGNoZWQgfHwgbW9udGhNYXRjaGVkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoTm9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgbW9udGhOb2RlLCB7IGRheXM6IGRheXMgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZpbHRlcigobW9udGhOb2RlKSA9PiBtb250aE5vZGUuZGF5cy5sZW5ndGggPiAwKTtcclxuICAgICAgICBpZiAoeWVhck1hdGNoZWQpIHtcclxuICAgICAgICAgIHJldHVybiB5ZWFyTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHllYXJOb2RlLCB7IG1vbnRoczogbW9udGhzIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKCh5ZWFyTm9kZSkgPT4geWVhck5vZGUubW9udGhzLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVllYXJFeHBhbmRlZCh5ZWFyTm9kZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0T3JDcmVhdGVFeHBhbmRTdGF0ZSh0aGlzLmZpZWxkKTtcclxuICAgIHN0YXRlLnllYXJzW3llYXJOb2RlLmtleV0gPSAhc3RhdGUueWVhcnNbeWVhck5vZGUua2V5XTtcclxuICAgIHllYXJOb2RlLmV4cGFuZGVkID0gISFzdGF0ZS55ZWFyc1t5ZWFyTm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZU1vbnRoRXhwYW5kZWQobW9udGhOb2RlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRPckNyZWF0ZUV4cGFuZFN0YXRlKHRoaXMuZmllbGQpO1xyXG4gICAgc3RhdGUubW9udGhzW21vbnRoTm9kZS5rZXldID0gIXN0YXRlLm1vbnRoc1ttb250aE5vZGUua2V5XTtcclxuICAgIG1vbnRoTm9kZS5leHBhbmRlZCA9ICEhc3RhdGUubW9udGhzW21vbnRoTm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlLZXlzID0gdGhpcy5nZXRFbmFibGVkRGF5S2V5c0luQ3VycmVudEZpZWxkKCk7XHJcbiAgICBpZiAoIWVuYWJsZWREYXlLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW5hYmxlZERheUtleXMuZXZlcnkoKGtleSkgPT4gISFzZWxlY3RlZE1hcFtrZXldKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0FsbEluZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5S2V5cyA9IHRoaXMuZ2V0RW5hYmxlZERheUtleXNJbkN1cnJlbnRGaWVsZCgpO1xyXG4gICAgaWYgKCFlbmFibGVkRGF5S2V5cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlLZXlzLmZpbHRlcigoa2V5KSA9PiAhIXNlbGVjdGVkTWFwW2tleV0pXHJcbiAgICAgIC5sZW5ndGg7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGVuYWJsZWREYXlLZXlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVBbGxEYXlzKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGNvbnN0IGVuYWJsZWREYXlLZXlzID0gdGhpcy5nZXRFbmFibGVkRGF5S2V5c0luQ3VycmVudEZpZWxkKCk7XHJcbiAgICBlbmFibGVkRGF5S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICBzZWxlY3RlZE1hcFtrZXldID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWxldGUgc2VsZWN0ZWRNYXBba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXlDaGVja2VkKGRheU5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgcmV0dXJuICEhc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZURheShkYXlOb2RlOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChkYXlOb2RlLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcCh0aGlzLmZpZWxkKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XSA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkZWxldGUgc2VsZWN0ZWRNYXBbZGF5Tm9kZS5rZXldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTW9udGhEaXNhYmxlZChtb250aE5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG1vbnRoTm9kZS5kYXlzLmV2ZXJ5KChkYXlOb2RlKSA9PiBkYXlOb2RlLmRpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vbnRoQ2hlY2tlZChtb250aE5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheXMgPSBtb250aE5vZGUuZGF5cy5maWx0ZXIoKGRheU5vZGUpID0+ICFkYXlOb2RlLmRpc2FibGVkKTtcclxuICAgIHJldHVybiBlbmFibGVkRGF5cy5ldmVyeSgoZGF5Tm9kZSkgPT4gISFzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTW9udGhJbmRldGVybWluYXRlKG1vbnRoTm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhOb2RlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAodGhpcy5maWVsZCk7XHJcbiAgICBjb25zdCBlbmFibGVkRGF5cyA9IG1vbnRoTm9kZS5kYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4gIWRheU5vZGUuZGlzYWJsZWQpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlzLmZpbHRlcigoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gISFzZWxlY3RlZE1hcFtkYXlOb2RlLmtleV07XHJcbiAgICB9KS5sZW5ndGg7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGVuYWJsZWREYXlzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVNb250aChtb250aE5vZGU6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoTm9kZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgbW9udGhOb2RlLmRheXMuZm9yRWFjaCgoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICBpZiAoZGF5Tm9kZS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIHNlbGVjdGVkTWFwW2RheU5vZGUua2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNZZWFyRGlzYWJsZWQoeWVhck5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHllYXJOb2RlLm1vbnRocy5ldmVyeSgobW9udGhOb2RlKSA9PlxyXG4gICAgICB0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aE5vZGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzWWVhckNoZWNrZWQoeWVhck5vZGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhck5vZGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVuYWJsZWRNb250aHMgPSB5ZWFyTm9kZS5tb250aHMuZmlsdGVyKFxyXG4gICAgICAobW9udGhOb2RlKSA9PiAhdGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhOb2RlKVxyXG4gICAgKTtcclxuICAgIHJldHVybiBlbmFibGVkTW9udGhzLmV2ZXJ5KChtb250aE5vZGUpID0+IHRoaXMuaXNNb250aENoZWNrZWQobW9udGhOb2RlKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNZZWFySW5kZXRlcm1pbmF0ZSh5ZWFyTm9kZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyTm9kZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRNYXAgPSB0aGlzLmdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKHRoaXMuZmllbGQpO1xyXG4gICAgY29uc3QgZW5hYmxlZERheXMgPSBbXTtcclxuICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgbW9udGhOb2RlLmRheXMuZm9yRWFjaCgoZGF5Tm9kZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF5Tm9kZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgZW5hYmxlZERheXMucHVzaChkYXlOb2RlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGVuYWJsZWREYXlzLmZpbHRlcigoa2V5KSA9PiAhIXNlbGVjdGVkTWFwW2tleV0pLmxlbmd0aDtcclxuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID4gMCAmJiBzZWxlY3RlZENvdW50IDwgZW5hYmxlZERheXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVllYXIoeWVhck5vZGU6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhck5vZGUpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgdGhpcy50b2dnbGVNb250aChtb250aE5vZGUsIGNoZWNrZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZCkge1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGRbdGhpcy5maWVsZF0gPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHkuZW1pdCh0aGlzLmNsb25lU2VsZWN0aW9uTWFwKHRoaXMud29ya2luZ1NlbGVjdGVkQnlGaWVsZCkpO1xyXG4gICAgdGhpcy5yZWJ1aWxkVHJlZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFwcGx5U2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHBseS5lbWl0KHRoaXMuY2xvbmVTZWxlY3Rpb25NYXAodGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkKSk7XHJcbiAgICB0aGlzLmNsb3NlUG9wb3ZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWJ1aWxkVHJlZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZCkge1xyXG4gICAgICB0aGlzLnllYXJzID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNvdXJjZVJvd3MgPSB0aGlzLnNvdXJjZVJvd3MgfHwgW107XHJcbiAgICBjb25zdCByb3dzQnlPdGhlckZpbHRlcnMgPSB0aGlzLmZpbHRlclJvd3NCeVNlbGVjdGVkRGF0ZVRyZWUoXHJcbiAgICAgIHNvdXJjZVJvd3MsXHJcbiAgICAgIHRoaXMuZmllbGRcclxuICAgICk7XHJcbiAgICBjb25zdCBhdmFpbGFibGVEYXlLZXlNYXAgPSB7fTtcclxuICAgIHJvd3NCeU90aGVyRmlsdGVycy5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgY29uc3QgZGF5S2V5ID0gdGhpcy5nZXREYXlLZXlCeVJvd1ZhbHVlKHJvd1t0aGlzLmZpZWxkXSk7XHJcbiAgICAgIGlmIChkYXlLZXkpIHtcclxuICAgICAgICBhdmFpbGFibGVEYXlLZXlNYXBbZGF5S2V5XSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwZWRNYXAgPSB7fTtcclxuICAgIHNvdXJjZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZVZhbHVlKHJvd1t0aGlzLmZpZWxkXSk7XHJcbiAgICAgIGlmICghZGF0ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICBpZiAoIWdyb3VwZWRNYXBbeWVhcl0pIHtcclxuICAgICAgICBncm91cGVkTWFwW3llYXJdID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncm91cGVkTWFwW3llYXJdW21vbnRoXSkge1xyXG4gICAgICAgIGdyb3VwZWRNYXBbeWVhcl1bbW9udGhdID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncm91cGVkTWFwW3llYXJdW21vbnRoXVtkYXldKSB7XHJcbiAgICAgICAgZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSArPSAxO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZXhwYW5kU3RhdGUgPSB0aGlzLmdldE9yQ3JlYXRlRXhwYW5kU3RhdGUodGhpcy5maWVsZCk7XHJcbiAgICB0aGlzLnllYXJzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcClcclxuICAgICAgLm1hcCgoa2V5KSA9PiBOdW1iZXIoa2V5KSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKVxyXG4gICAgICAubWFwKCh5ZWFyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9udGhzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcFt5ZWFyXSlcclxuICAgICAgICAgIC5tYXAoKGtleSkgPT4gTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXHJcbiAgICAgICAgICAubWFwKChtb250aCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb250aEtleSA9IHllYXIgKyBcIi1cIiArIHRoaXMucGFkMihtb250aCk7XHJcbiAgICAgICAgICAgIGlmIChleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBkYXlzID0gT2JqZWN0LmtleXMoZ3JvdXBlZE1hcFt5ZWFyXVttb250aF0pXHJcbiAgICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXHJcbiAgICAgICAgICAgICAgLm1hcCgoZGF5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXlLZXkgPSB0aGlzLnRvRGF5S2V5KHllYXIsIG1vbnRoLCBkYXkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIGtleTogZGF5S2V5LFxyXG4gICAgICAgICAgICAgICAgICBkYXk6IGRheSxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IG1vbWVudChkYXlEYXRlKS5mb3JtYXQoXCJEIE1NTSBZWVlZXCIpLFxyXG4gICAgICAgICAgICAgICAgICBjb3VudDogZ3JvdXBlZE1hcFt5ZWFyXVttb250aF1bZGF5XSxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFhdmFpbGFibGVEYXlLZXlNYXBbZGF5S2V5XSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAga2V5OiBtb250aEtleSxcclxuICAgICAgICAgICAgICBtb250aDogbW9udGgsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IG1vbWVudCgpXHJcbiAgICAgICAgICAgICAgICAubW9udGgobW9udGggLSAxKVxyXG4gICAgICAgICAgICAgICAgLmZvcm1hdChcIk1NTVwiKSxcclxuICAgICAgICAgICAgICBleHBhbmRlZDogISFleHBhbmRTdGF0ZS5tb250aHNbbW9udGhLZXldLFxyXG4gICAgICAgICAgICAgIGRheXM6IGRheXMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCB5ZWFyS2V5ID0gU3RyaW5nKHllYXIpO1xyXG4gICAgICAgIGlmIChleHBhbmRTdGF0ZS55ZWFyc1t5ZWFyS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBleHBhbmRTdGF0ZS55ZWFyc1t5ZWFyS2V5XSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBrZXk6IHllYXJLZXksXHJcbiAgICAgICAgICB5ZWFyOiB5ZWFyLFxyXG4gICAgICAgICAgZXhwYW5kZWQ6ICEhZXhwYW5kU3RhdGUueWVhcnNbeWVhcktleV0sXHJcbiAgICAgICAgICBtb250aHM6IG1vbnRocyxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyUm93c0J5U2VsZWN0ZWREYXRlVHJlZShyb3dzOiBhbnlbXSwgZXhjbHVkZUZpZWxkPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgZmlsdGVyZWRSb3dzID0gcm93cyA/IHJvd3Muc2xpY2UoKSA6IFtdO1xyXG4gICAgKHRoaXMuZGF0ZUZpZWxkcyB8fCBbXSkuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGV4Y2x1ZGVGaWVsZCAmJiBmaWVsZCA9PT0gZXhjbHVkZUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkTWFwID0gdGhpcy5nZXRGaWVsZERheVNlbGVjdGlvbk1hcChmaWVsZCk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkTWFwKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cy5maWx0ZXIoKHJvdykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRheUtleSA9IHRoaXMuZ2V0RGF5S2V5QnlSb3dWYWx1ZShyb3dbZmllbGRdKTtcclxuICAgICAgICByZXR1cm4gZGF5S2V5ID8gISFzZWxlY3RlZE1hcFtkYXlLZXldIDogZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZURhdGVWYWx1ZSh2YWx1ZTogYW55KTogRGF0ZSB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJzZWQgPSBtb21lbnQoXHJcbiAgICAgIHZhbHVlLFxyXG4gICAgICBbXHJcbiAgICAgICAgXCJZWVlZLU1NLUREXCIsXHJcbiAgICAgICAgXCJNTS9ERC9ZWVlZXCIsXHJcbiAgICAgICAgXCJERC9NTS9ZWVlZXCIsXHJcbiAgICAgICAgXCJZWVlZL01NL0REXCIsXHJcbiAgICAgICAgXCJERC1NTU0tWVlZWVwiLFxyXG4gICAgICAgIFwiTU1NIERELCBZWVlZXCIsXHJcbiAgICAgICAgbW9tZW50LklTT184NjAxLFxyXG4gICAgICBdLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gICAgaWYgKHBhcnNlZC5pc1ZhbGlkKCkpIHtcclxuICAgICAgcmV0dXJuIHBhcnNlZC50b0RhdGUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZhbGxiYWNrID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgcmV0dXJuIGlzTmFOKGZhbGxiYWNrLmdldFRpbWUoKSkgPyBudWxsIDogZmFsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9yQ3JlYXRlRXhwYW5kU3RhdGUoZmllbGQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmV4cGFuZFN0YXRlQnlGaWVsZFtmaWVsZF0pIHtcclxuICAgICAgdGhpcy5leHBhbmRTdGF0ZUJ5RmllbGRbZmllbGRdID0geyB5ZWFyczoge30sIG1vbnRoczoge30gfTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmV4cGFuZFN0YXRlQnlGaWVsZFtmaWVsZF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkRGF5U2VsZWN0aW9uTWFwKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXSkge1xyXG4gICAgICB0aGlzLndvcmtpbmdTZWxlY3RlZEJ5RmllbGRbZmllbGRdID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy53b3JraW5nU2VsZWN0ZWRCeUZpZWxkW2ZpZWxkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9EYXlLZXkoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHllYXIgKyBcIi1cIiArIHRoaXMucGFkMihtb250aCkgKyBcIi1cIiArIHRoaXMucGFkMihkYXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWQyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB2YWx1ZSA8IDEwID8gXCIwXCIgKyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERheUtleUJ5Um93VmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucGFyc2VEYXRlVmFsdWUodmFsdWUpO1xyXG4gICAgaWYgKCFkYXRlKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudG9EYXlLZXkoXHJcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSxcclxuICAgICAgZGF0ZS5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVuYWJsZWREYXlLZXlzSW5DdXJyZW50RmllbGQoKSB7XHJcbiAgICBjb25zdCBrZXlzID0gW107XHJcbiAgICB0aGlzLnllYXJzLmZvckVhY2goKHllYXJOb2RlKSA9PiB7XHJcbiAgICAgIHllYXJOb2RlLm1vbnRocy5mb3JFYWNoKChtb250aE5vZGUpID0+IHtcclxuICAgICAgICBtb250aE5vZGUuZGF5cy5mb3JFYWNoKChkYXlOb2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRheU5vZGUuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAga2V5cy5wdXNoKGRheU5vZGUua2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9uZVNlbGVjdGlvbk1hcChzb3VyY2U6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHNvdXJjZSA/IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlKSkgOiB7fTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=