@annalib/anna-core 22.3.2 → 22.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/annalib-anna-core.mjs +4 -4
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -15
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +14 -14
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -11
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +36 -36
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -15
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -22
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +14 -14
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +23 -23
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -15
- package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +44 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +284 -284
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +43 -43
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +38 -38
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +11 -11
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +38 -38
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -26
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +53 -53
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -25
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -16
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1170 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +132 -132
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +66 -66
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +176 -176
- package/esm2022/lib/anna-core.module.mjs +221 -0
- package/{esm2020 → esm2022}/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +151 -151
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +364 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +237 -237
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +180 -180
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +306 -306
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +291 -291
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +806 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -64
- package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -189
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +57 -57
- package/{fesm2020 → fesm2022}/annalib-anna-core.mjs +5752 -5721
- package/fesm2022/annalib-anna-core.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +42 -42
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +119 -118
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
- package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
- package/lib/anna-core.module.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +175 -174
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
- package/package.json +5 -11
- package/public-api.d.ts +42 -42
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -44
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1157
- package/esm2020/lib/anna-core.module.mjs +0 -221
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -788
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
- package/fesm2015/annalib-anna-core.mjs +0 -5857
- package/fesm2015/annalib-anna-core.mjs.map +0 -1
- package/fesm2020/annalib-anna-core.mjs.map +0 -1
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
// Angular import statements
|
|
2
|
+
import { DatePipe } from "@angular/common";
|
|
3
|
+
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
4
|
+
// Third party import statements
|
|
5
|
+
import { NgbCalendar, NgbDate, NgbDatepickerConfig } from "@ng-bootstrap/ng-bootstrap";
|
|
6
|
+
import dayjs from "dayjs";
|
|
7
|
+
import { AnnaDateTimeFormatService } from '../../../anna-core-shared-lib/services/anna-date-time-format.service';
|
|
8
|
+
import { AnnaGlobalConfigService } from '../../../anna-core-shared-lib/services/anna-global-config.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
11
|
+
import * as i2 from "../../../anna-core-shared-lib/services/anna-date-time-format.service";
|
|
12
|
+
import * as i3 from "../../../anna-core-shared-lib/services/anna-global-config.service";
|
|
13
|
+
import * as i4 from "@angular/common";
|
|
14
|
+
import * as i5 from "@angular/forms";
|
|
15
|
+
// User defined import statements
|
|
16
|
+
export class AnnaWeekCalendarComponent {
|
|
17
|
+
ngOnChanges(changes) {
|
|
18
|
+
//if some values are not sent, setting the default values
|
|
19
|
+
this._defaultValues = this.globalConfigService.defaultWeekCalendarConfig;
|
|
20
|
+
this.config = { ...this._defaultValues, ...this.config };
|
|
21
|
+
if (this.config.selectCurrentWeek) {
|
|
22
|
+
this.initializeWeekData();
|
|
23
|
+
this.fromDate && this.selectWeek(this.fromDate);
|
|
24
|
+
}
|
|
25
|
+
this.formatter = this.formattedDates();
|
|
26
|
+
if (this.selectedFromDate && this.selectedEndDate && this.config) {
|
|
27
|
+
// this.selectWeek(this.fromDate);
|
|
28
|
+
this.fromDate = NgbDate.from(this.selectedFromDate);
|
|
29
|
+
this.toDate = NgbDate.from(this.selectedEndDate);
|
|
30
|
+
this.weekNumberGenerator();
|
|
31
|
+
this.displayToUI();
|
|
32
|
+
this.setCalendarMap();
|
|
33
|
+
}
|
|
34
|
+
if (this.disabledDates.length > 0) {
|
|
35
|
+
this.disabledFunc = (date, current) => {
|
|
36
|
+
return this.checkIfDateIsDisabled(date);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
constructor(calendar, datePickerConfig, annaDateTimeFormatService, globalConfigService) {
|
|
41
|
+
this.calendar = calendar;
|
|
42
|
+
this.datePickerConfig = datePickerConfig;
|
|
43
|
+
this.annaDateTimeFormatService = annaDateTimeFormatService;
|
|
44
|
+
this.globalConfigService = globalConfigService;
|
|
45
|
+
this.hoveredDate = null;
|
|
46
|
+
this.toDate = null;
|
|
47
|
+
this.weekNumbers = [];
|
|
48
|
+
this.dateToDisplay = "";
|
|
49
|
+
this.multiSelectDropdownOpen = false;
|
|
50
|
+
this.calendarMap = new Map();
|
|
51
|
+
this.disabledDates = [];
|
|
52
|
+
this.applyWeekCalendarChanges = new EventEmitter();
|
|
53
|
+
this.calendarToggled = new EventEmitter();
|
|
54
|
+
}
|
|
55
|
+
getWeekNumber(week, firstDayOfWeek) {
|
|
56
|
+
const weekStartDate = dayjs(convertNgbDateToMoment(week[0]), "MM/DD/YYYY");
|
|
57
|
+
const weekYear = weekStartDate.year();
|
|
58
|
+
const yearStartDate = dayjs(`01/01/${weekYear}`, "MM/DD/YYYY");
|
|
59
|
+
const weekDay = yearStartDate.day();
|
|
60
|
+
const noOfDays = weekStartDate.diff(yearStartDate, "d") + 1;
|
|
61
|
+
function convertNgbDateToMoment(ngbDate) {
|
|
62
|
+
let formatType = "MM/DD/YYYY";
|
|
63
|
+
let converted = null;
|
|
64
|
+
if (ngbDate && ngbDate.month && ngbDate.day && ngbDate.year) {
|
|
65
|
+
converted = ngbDate.month + "/" + ngbDate.day + "/" + ngbDate.year;
|
|
66
|
+
converted = dayjs(converted).format(formatType);
|
|
67
|
+
}
|
|
68
|
+
return converted;
|
|
69
|
+
}
|
|
70
|
+
function checkIfYearIsBroadcastLeapYear() {
|
|
71
|
+
let isLeapYear = (weekYear % 4 == 0 && weekYear % 100 != 0) || weekYear % 400 == 0;
|
|
72
|
+
return (isLeapYear && (weekDay == 0 || weekDay == 6)) || (!isLeapYear && weekDay == 0);
|
|
73
|
+
}
|
|
74
|
+
const isLeapYear = checkIfYearIsBroadcastLeapYear();
|
|
75
|
+
const divider = isLeapYear ? 53 : 52;
|
|
76
|
+
const adder = isLeapYear ? 2 : 1;
|
|
77
|
+
let broadcastNumberOfDays = weekDay + noOfDays;
|
|
78
|
+
let broadcastWeekNumber = broadcastNumberOfDays % 7 > 0 ? broadcastNumberOfDays / 7 + adder : broadcastNumberOfDays / 7;
|
|
79
|
+
if (Math.floor(broadcastWeekNumber % divider) === 0) {
|
|
80
|
+
return divider;
|
|
81
|
+
}
|
|
82
|
+
return Math.floor(broadcastWeekNumber % divider);
|
|
83
|
+
}
|
|
84
|
+
ngAfterViewInit() {
|
|
85
|
+
// CHANGES@ANNALIB Changed this.
|
|
86
|
+
// this.calendar["__proto__"].getWeekNumber = this.getWeekNumber;
|
|
87
|
+
Object.setPrototypeOf(this.calendar, { getWeekNumber: this.getWeekNumber });
|
|
88
|
+
}
|
|
89
|
+
ngOnInit() {
|
|
90
|
+
// this.selectWeek(this.fromDate);
|
|
91
|
+
this.setCalendarMap();
|
|
92
|
+
}
|
|
93
|
+
initializeWeekData() {
|
|
94
|
+
this.weekObjects = [];
|
|
95
|
+
this.fromDate = this.calendar.getToday();
|
|
96
|
+
this.today = this.calendar.getToday();
|
|
97
|
+
let backDatedPeriod = JSON.parse(localStorage.getItem("userDetails") || '{}').locking_period_days;
|
|
98
|
+
if (backDatedPeriod < 0) {
|
|
99
|
+
let date = this.calendar.getPrev(this.calendar.getToday(), "d", Math.abs(backDatedPeriod));
|
|
100
|
+
this.today = NgbDate.from(date);
|
|
101
|
+
this.fromDate = NgbDate.from(date);
|
|
102
|
+
}
|
|
103
|
+
// Disable months before numberOfMonthsToEnable
|
|
104
|
+
this.datePickerConfig.markDisabled = (date) => {
|
|
105
|
+
let previousMonth = this.calendar.getPrev(this.today, "m", this.config.numberOfMonthsToEnableInPast);
|
|
106
|
+
let previousDay = this.calendar.getPrev(previousMonth, "d", 1);
|
|
107
|
+
return !NgbDate.from(previousDay).before(date);
|
|
108
|
+
};
|
|
109
|
+
this.formatter = this.formattedDates();
|
|
110
|
+
this.flag1 = false;
|
|
111
|
+
this.flag2 = false;
|
|
112
|
+
}
|
|
113
|
+
selectWeek(date) {
|
|
114
|
+
const dateObject = new Date(date.year, date.month - 1, date.day);
|
|
115
|
+
let constructDate = this.buildDate(dateObject);
|
|
116
|
+
if (!this.config.selectMultipleWeeks) {
|
|
117
|
+
//Single week selection
|
|
118
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
119
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
120
|
+
this.weekNumberGenerator();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (date.before(this.fromDate)) {
|
|
124
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
125
|
+
if (this.flag1) {
|
|
126
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
127
|
+
}
|
|
128
|
+
this.flag1 = !this.flag1;
|
|
129
|
+
}
|
|
130
|
+
else if (date.after(this.toDate)) {
|
|
131
|
+
if (this.flag2) {
|
|
132
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
133
|
+
//this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
134
|
+
}
|
|
135
|
+
this.flag2 = !this.flag2;
|
|
136
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
140
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
141
|
+
}
|
|
142
|
+
if (this.disabledDates.length > 0) {
|
|
143
|
+
let dayjsStartDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.fromDate), "MM/DD/YYYY");
|
|
144
|
+
let dayjsEndDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.toDate), "MM/DD/YYYY");
|
|
145
|
+
let ngbDate;
|
|
146
|
+
while (!dayjsStartDate.isSame(dayjsEndDate)) {
|
|
147
|
+
ngbDate = this.annaDateTimeFormatService.convertToNgbDate(dayjsStartDate, "MM/DD/YYYY");
|
|
148
|
+
if (this.checkIfDateIsDisabled(ngbDate)) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
dayjsStartDate.add(1, "d");
|
|
152
|
+
}
|
|
153
|
+
let newDateObject = new Date(ngbDate.year, ngbDate.month - 1, ngbDate.day - 1);
|
|
154
|
+
let constructDate = this.buildDate(newDateObject);
|
|
155
|
+
this.toDate = this.constructEndDate(newDateObject)(constructDate);
|
|
156
|
+
}
|
|
157
|
+
this.weekNumberGenerator();
|
|
158
|
+
}
|
|
159
|
+
if (!this.config.showAsDropdown) {
|
|
160
|
+
this.applyChanges();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
weekNumberGenerator() {
|
|
164
|
+
let dates = [];
|
|
165
|
+
let week = [];
|
|
166
|
+
let startDate = NgbDate.from(this.fromDate);
|
|
167
|
+
let endDate = NgbDate.from(this.toDate);
|
|
168
|
+
week.push(startDate);
|
|
169
|
+
while (endDate != null && !startDate.equals(endDate)) {
|
|
170
|
+
let date = this.calendar.getNext(startDate, "d", 1);
|
|
171
|
+
startDate = date;
|
|
172
|
+
week.push(date);
|
|
173
|
+
// Collect all days in week to calculate the week number
|
|
174
|
+
if (week.length == 7) {
|
|
175
|
+
dates.push(week);
|
|
176
|
+
week = [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (((this.config.maxWeeksToSelect ?? 0) > 0 && dates.length > (this.config.maxWeeksToSelect ?? 0))) {
|
|
180
|
+
dates.splice((this.config.maxWeeksToSelect ?? 0), dates.length - (this.config.maxWeeksToSelect ?? 0));
|
|
181
|
+
}
|
|
182
|
+
this.selectedDates(dates);
|
|
183
|
+
this.weekNumbers = [];
|
|
184
|
+
this.weekObjects = [];
|
|
185
|
+
if (dates.length > 0) {
|
|
186
|
+
for (let date of dates) {
|
|
187
|
+
this.weekNumbers.push(" Week " + this.calendar.getWeekNumber(date, this.config.firstDayOfWeek));
|
|
188
|
+
let dates = this.formatter(date[0], date[6]);
|
|
189
|
+
let dateObjects = { startDate: dates.formattedStartDate, endDate: dates.formattedEndDate };
|
|
190
|
+
this.weekObjects.push(dateObjects);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.displayToUI();
|
|
194
|
+
}
|
|
195
|
+
selectedDates(dates) {
|
|
196
|
+
this.fromDate = dates[0][0];
|
|
197
|
+
this.toDate = dates[dates.length - 1][6];
|
|
198
|
+
}
|
|
199
|
+
formattedDates() {
|
|
200
|
+
let pipe = new DatePipe("en-US");
|
|
201
|
+
let thisObj = this;
|
|
202
|
+
return function (fromDate, toDate) {
|
|
203
|
+
let fromDateObject = new Date(fromDate.year, fromDate.month - 1, fromDate.day);
|
|
204
|
+
let toDateObject = new Date(toDate.year, toDate.month - 1, toDate.day);
|
|
205
|
+
thisObj.formattedStartDate = pipe.transform(fromDateObject, thisObj.config.dateFormatForRequest);
|
|
206
|
+
thisObj.formattedEndDate = pipe.transform(toDateObject, thisObj.config.dateFormatForRequest);
|
|
207
|
+
thisObj.dateToDisplay =
|
|
208
|
+
pipe.transform(fromDateObject, thisObj.config.dateFormatToDisplay) +
|
|
209
|
+
" to " +
|
|
210
|
+
pipe.transform(toDateObject, thisObj.config.dateFormatToDisplay);
|
|
211
|
+
return thisObj;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
displayToUI() {
|
|
215
|
+
if (!this.config.selectMultipleWeeks && this.fromDate && this.toDate) {
|
|
216
|
+
// Display for only Single Week
|
|
217
|
+
this.formatter(this.fromDate, this.toDate);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Display for Multiple Weeks
|
|
221
|
+
if (this.weekNumbers.length > (this.config.maxWeeksToShowWithRemainingCount ?? 0)) {
|
|
222
|
+
let weekDisplay = [];
|
|
223
|
+
for (let i = 0; i < (this.config.maxWeeksToShowWithRemainingCount ?? 0); i++) {
|
|
224
|
+
weekDisplay.push(this.weekNumbers.shift());
|
|
225
|
+
}
|
|
226
|
+
let remainingWeeks = this.weekNumbers.length;
|
|
227
|
+
this.weekNumbers = [];
|
|
228
|
+
this.weekNumbers.push(weekDisplay + " +" + remainingWeeks);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
constructStartDate(date) {
|
|
233
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
234
|
+
return function (constructDate) {
|
|
235
|
+
let startDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) - date.getDay() : -6;
|
|
236
|
+
return constructDate(startDay);
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
constructEndDate(date) {
|
|
240
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
241
|
+
return function (constructDate) {
|
|
242
|
+
let endDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) + 6 - date.getDay() : 0;
|
|
243
|
+
return constructDate(endDay);
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
buildDate(date) {
|
|
247
|
+
return function (number) {
|
|
248
|
+
let day = date.getDate() + number;
|
|
249
|
+
const dateObject = new Date(date.getFullYear(), date.getMonth(), day);
|
|
250
|
+
let ngbDateObject = {};
|
|
251
|
+
ngbDateObject.day = day;
|
|
252
|
+
if (ngbDateObject.day > 31 || ngbDateObject.day < 1) {
|
|
253
|
+
ngbDateObject.day = dateObject.getDate();
|
|
254
|
+
}
|
|
255
|
+
ngbDateObject.month = dateObject.getMonth() + 1;
|
|
256
|
+
ngbDateObject.year = dateObject.getFullYear();
|
|
257
|
+
return NgbDate.from(ngbDateObject);
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
isHovered(date) {
|
|
261
|
+
return this.fromDate && !this.toDate && this.hoveredDate && date.after(this.fromDate) && date.before(this.hoveredDate);
|
|
262
|
+
}
|
|
263
|
+
isInside(date) {
|
|
264
|
+
return this.toDate && date.after(this.fromDate) && date.before(this.toDate);
|
|
265
|
+
}
|
|
266
|
+
isRange(date) {
|
|
267
|
+
return (date.equals(this.fromDate) || (this.toDate && date.equals(this.toDate)) || this.isInside(date) || this.isHovered(date));
|
|
268
|
+
}
|
|
269
|
+
previousWeek() {
|
|
270
|
+
if (this.fromDate) {
|
|
271
|
+
this.toDate = this.calendar.getPrev(this.fromDate, "d", 1);
|
|
272
|
+
this.fromDate = this.calendar.getPrev(this.fromDate, "d", this.calendar.getDaysPerWeek());
|
|
273
|
+
}
|
|
274
|
+
this.weekNumberGenerator();
|
|
275
|
+
this.applyChanges();
|
|
276
|
+
}
|
|
277
|
+
nextWeek() {
|
|
278
|
+
if (this.fromDate) {
|
|
279
|
+
this.fromDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek());
|
|
280
|
+
this.toDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek() - 1);
|
|
281
|
+
}
|
|
282
|
+
this.weekNumberGenerator();
|
|
283
|
+
this.applyChanges();
|
|
284
|
+
}
|
|
285
|
+
setCalendarMap() {
|
|
286
|
+
let dateObj = { fromDate: this.fromDate, toDate: this.toDate };
|
|
287
|
+
this.calendarMap.set("oldDates", dateObj);
|
|
288
|
+
}
|
|
289
|
+
applyChanges() {
|
|
290
|
+
this.multiSelectDropdownOpen = false;
|
|
291
|
+
if (!this.config.emitMultipleWeekObjects) {
|
|
292
|
+
let dates = {};
|
|
293
|
+
let formattedDates = this.formatter(this.fromDate, this.toDate);
|
|
294
|
+
dates.startDate = formattedDates.formattedStartDate;
|
|
295
|
+
dates.endDate = formattedDates.formattedEndDate;
|
|
296
|
+
this.applyWeekCalendarChanges.emit(dates);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
this.applyWeekCalendarChanges.emit(this.weekObjects);
|
|
300
|
+
}
|
|
301
|
+
this.setCalendarMap();
|
|
302
|
+
}
|
|
303
|
+
isFocused(value) {
|
|
304
|
+
this.calendarToggled.emit(value);
|
|
305
|
+
}
|
|
306
|
+
isDropdownOpenedForCalendar(datepicker) {
|
|
307
|
+
this.datepicker = datepicker;
|
|
308
|
+
if (this.datepicker.isOpen()) {
|
|
309
|
+
this.revertDates();
|
|
310
|
+
this.datepicker.close();
|
|
311
|
+
this.multiSelectDropdownOpen = false;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
this.datepicker.open();
|
|
315
|
+
this.multiSelectDropdownOpen = true;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
revertDates() {
|
|
319
|
+
this.multiSelectDropdownOpen = false;
|
|
320
|
+
if (this.calendarMap.get("oldDates")) {
|
|
321
|
+
let dateObj = this.calendarMap.get("oldDates");
|
|
322
|
+
this.fromDate = dateObj.fromDate;
|
|
323
|
+
this.toDate = dateObj.toDate;
|
|
324
|
+
this.weekNumberGenerator();
|
|
325
|
+
this.displayToUI();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
checkIfDateIsDisabled(date) {
|
|
329
|
+
const validatorFunc = (ngbDate) => ngbDate.year === date.year && ngbDate.month === date.month && ngbDate.day === date.day;
|
|
330
|
+
return this.disabledDates.some(validatorFunc);
|
|
331
|
+
}
|
|
332
|
+
closeDatepicker(datepickerRef) {
|
|
333
|
+
datepickerRef.close();
|
|
334
|
+
}
|
|
335
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, deps: [{ token: i1.NgbCalendar }, { token: i1.NgbDatepickerConfig }, { token: i2.AnnaDateTimeFormatService }, { token: i3.AnnaGlobalConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
336
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AnnaWeekCalendarComponent, selector: "anna-core-week-calendar-filter-lib", inputs: { selectedFromDate: ["from-date", "selectedFromDate"], selectedEndDate: ["to-date", "selectedEndDate"], disabledDates: ["disabled-dates", "disabledDates"], maxDate: "maxDate", minDate: "minDate", config: ["week-calendar-config", "config"] }, outputs: { applyWeekCalendarChanges: "apply", calendarToggled: "toggle-calendar" }, usesOnChanges: true, ngImport: i0, template: "<form class=\"form-inline\" *ngIf=\"config.showAsDropdown\">\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n style=\"display: none\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span class=\"material-icons next-round-btn\" (click)=\"previousWeek()\"> navigate_next </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i class=\"mdi mdi-menu-down\" *ngIf='!datepicker.isOpen()' (click)=\"datepicker.open()\"></i>\r\n <i class='mdi mdi-menu-up' *ngIf=\"datepicker.isOpen()\" (click)=\"isDropdownOpenedForCalendar(datepicker)\"></i>\r\n <div class=\"right\">\r\n <span class=\"material-icons round-btn\" (click)=\"nextWeek()\"> navigate_next </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div class=\"form-group\" *ngIf=\"config.selectMultipleWeeks\">\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i *ngIf=\"!multiSelectDropdownOpen\" class=\"mdi mdi-menu-down multiselect-input-arrow\"></i>\r\n <i *ngIf=\"multiSelectDropdownOpen\" class=\"mdi mdi-menu-up multiselect-input-arrow\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n style=\"background-color: #268bff; color: #ffffff\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #t let-date let-focused=\"focused\" let-disabled=\"disabled\">\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<!--\r\n\r\n<hr>\r\n\r\n<pre>From: {{ fromDate | json }} </pre>\r\n<pre>To: {{ toDate | json }} </pre>\r\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\r\n\r\n-->\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.NgbDatepicker, selector: "ngb-datepicker", inputs: ["contentTemplate", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "maxDate", "minDate", "navigation", "outsideDays", "showWeekNumbers", "startDate", "weekdays"], outputs: ["navigate", "dateSelect"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
|
|
337
|
+
}
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, decorators: [{
|
|
339
|
+
type: Component,
|
|
340
|
+
args: [{ selector: "anna-core-week-calendar-filter-lib", template: "<form class=\"form-inline\" *ngIf=\"config.showAsDropdown\">\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n style=\"display: none\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span class=\"material-icons next-round-btn\" (click)=\"previousWeek()\"> navigate_next </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i class=\"mdi mdi-menu-down\" *ngIf='!datepicker.isOpen()' (click)=\"datepicker.open()\"></i>\r\n <i class='mdi mdi-menu-up' *ngIf=\"datepicker.isOpen()\" (click)=\"isDropdownOpenedForCalendar(datepicker)\"></i>\r\n <div class=\"right\">\r\n <span class=\"material-icons round-btn\" (click)=\"nextWeek()\"> navigate_next </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div class=\"form-group\" *ngIf=\"config.selectMultipleWeeks\">\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i *ngIf=\"!multiSelectDropdownOpen\" class=\"mdi mdi-menu-down multiselect-input-arrow\"></i>\r\n <i *ngIf=\"multiSelectDropdownOpen\" class=\"mdi mdi-menu-up multiselect-input-arrow\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n style=\"background-color: #268bff; color: #ffffff\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #t let-date let-focused=\"focused\" let-disabled=\"disabled\">\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<!--\r\n\r\n<hr>\r\n\r\n<pre>From: {{ fromDate | json }} </pre>\r\n<pre>To: {{ toDate | json }} </pre>\r\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\r\n\r\n-->\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"] }]
|
|
341
|
+
}], ctorParameters: function () { return [{ type: i1.NgbCalendar }, { type: i1.NgbDatepickerConfig }, { type: i2.AnnaDateTimeFormatService }, { type: i3.AnnaGlobalConfigService }]; }, propDecorators: { selectedFromDate: [{
|
|
342
|
+
type: Input,
|
|
343
|
+
args: ["from-date"]
|
|
344
|
+
}], selectedEndDate: [{
|
|
345
|
+
type: Input,
|
|
346
|
+
args: ["to-date"]
|
|
347
|
+
}], disabledDates: [{
|
|
348
|
+
type: Input,
|
|
349
|
+
args: ["disabled-dates"]
|
|
350
|
+
}], maxDate: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], minDate: [{
|
|
353
|
+
type: Input
|
|
354
|
+
}], config: [{
|
|
355
|
+
type: Input,
|
|
356
|
+
args: ["week-calendar-config"]
|
|
357
|
+
}], applyWeekCalendarChanges: [{
|
|
358
|
+
type: Output,
|
|
359
|
+
args: ["apply"]
|
|
360
|
+
}], calendarToggled: [{
|
|
361
|
+
type: Output,
|
|
362
|
+
args: ["toggle-calendar"]
|
|
363
|
+
}] } });
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFeEgsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFxQyxNQUFNLDRCQUE0QixDQUFDO0FBQzFILE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUcxQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzRUFBc0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQzs7Ozs7OztBQUU1RyxpQ0FBaUM7QUFTakMsTUFBTSxPQUFPLHlCQUF5QjtJQW9DcEMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUs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Q0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsZUFBZSxDQUFDLGFBQWtCO1FBQ2hDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDOytHQXZZVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw2YUNyQnRDLHdpS0FpSUE7OzRGRDVHYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usb0NBQW9DO2tOQXdCMUIsZ0JBQWdCO3NCQUFuQyxLQUFLO3VCQUFDLFdBQVc7Z0JBQ0EsZUFBZTtzQkFBaEMsS0FBSzt1QkFBQyxTQUFTO2dCQUNTLGFBQWE7c0JBQXJDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUXlCLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUNaLHdCQUF3QjtzQkFBeEMsTUFBTTt1QkFBQyxPQUFPO2dCQUNZLGVBQWU7c0JBQXpDLE1BQU07dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IE5nYkNhbGVuZGFyLCBOZ2JEYXRlLCBOZ2JEYXRlcGlja2VyQ29uZmlnLCBOZ2JEYXRlU3RydWN0LCBOZ2JJbnB1dERhdGVwaWNrZXIgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgeyBXZWVrT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtZ2VuZXJpYy1kYXRhLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBJV2Vla0NhbGVuZGFyIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtZ2xvYmFsLWRyb3Bkb3duLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEFubmFHbG9iYWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvc2VydmljZXMvYW5uYS1nbG9iYWwtY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFubmEtY29yZS13ZWVrLWNhbGVuZGFyLWZpbHRlci1saWJcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFXZWVrQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgZnJvbURhdGU6IE5nYkRhdGUgfCBudWxsO1xyXG4gIGhvdmVyZWREYXRlOiBOZ2JEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgdG9EYXRlOiBOZ2JEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgdG9kYXk6IE5nYkRhdGU7XHJcblxyXG4gIG1vZGVsOiBOZ2JEYXRlU3RydWN0O1xyXG5cclxuICB3ZWVrTnVtYmVyczogc3RyaW5nW10gPSBbXTtcclxuICBwaXBlOiBEYXRlUGlwZTtcclxuICBkYXRlVG9EaXNwbGF5OiBzdHJpbmcgPSBcIlwiO1xyXG4gIHdlZWtPYmplY3RzOiBXZWVrT2JqZWN0W107XHJcbiAgbXVsdGlTZWxlY3REcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkYXRlcGlja2VyOiBOZ2JJbnB1dERhdGVwaWNrZXI7XHJcbiAgcHJpdmF0ZSBmb3JtYXR0ZXI6IGFueTtcclxuICBwdWJsaWMgZm9ybWF0dGVkU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIGZvcm1hdHRlZEVuZERhdGU6IHN0cmluZztcclxuICBwcml2YXRlIGNhbGVuZGFyTWFwID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgZmxhZzE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBmbGFnMjogYm9vbGVhbjtcclxuICBASW5wdXQoXCJmcm9tLWRhdGVcIikgc2VsZWN0ZWRGcm9tRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoXCJ0by1kYXRlXCIpIHNlbGVjdGVkRW5kRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoXCJkaXNhYmxlZC1kYXRlc1wiKSBkaXNhYmxlZERhdGVzOiBOZ2JEYXRlW10gPSBbXTtcclxuICBASW5wdXQoKSBtYXhEYXRlOiBhbnk7XHJcbiAgQElucHV0KCkgbWluRGF0ZTogYW55O1xyXG5cclxuICBkaXNhYmxlZEZ1bmM6IGFueTtcclxuICBzdGF0ZTogYW55O1xyXG5cclxuICAvL1NldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IElXZWVrQ2FsZW5kYXI7XHJcblxyXG4gIEBJbnB1dChcIndlZWstY2FsZW5kYXItY29uZmlnXCIpIGNvbmZpZzogSVdlZWtDYWxlbmRhcjtcclxuICBAT3V0cHV0KFwiYXBwbHlcIikgYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoXCJ0b2dnbGUtY2FsZW5kYXJcIikgY2FsZW5kYXJUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAvL2lmIHNvbWUgdmFsdWVzIGFyZSBub3Qgc2VudCwgc2V0dGluZyB0aGUgZGVmYXVsdCB2YWx1ZXNcclxuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZGVmYXVsdFdlZWtDYWxlbmRhckNvbmZpZztcclxuICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLl9kZWZhdWx0VmFsdWVzLCAuLi50aGlzLmNvbmZpZyB9O1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5zZWxlY3RDdXJyZW50V2Vlaykge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVXZWVrRGF0YSgpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlICYmIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuZm9ybWF0dGVkRGF0ZXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZyb21EYXRlICYmIHRoaXMuc2VsZWN0ZWRFbmREYXRlICYmIHRoaXMuY29uZmlnKSB7XHJcbiAgICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRnJvbURhdGUpO1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgICB0aGlzLmRpc3BsYXlUb1VJKCk7XHJcbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZEZ1bmMgPSAoZGF0ZTogTmdiRGF0ZSwgY3VycmVudDogeyBtb250aDogbnVtYmVyIH0pID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0lmRGF0ZUlzRGlzYWJsZWQoZGF0ZSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBOZ2JEYXRlcGlja2VyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBhbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlOiBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBBbm5hR2xvYmFsQ29uZmlnU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG5cclxuICBnZXRXZWVrTnVtYmVyKHdlZWs6IGFueSwgZmlyc3REYXlPZldlZWs6IGFueSkge1xyXG4gICAgY29uc3Qgd2Vla1N0YXJ0RGF0ZSA9IGRheWpzKGNvbnZlcnROZ2JEYXRlVG9Nb21lbnQod2Vla1swXSksIFwiTU0vREQvWVlZWVwiKTtcclxuICAgIGNvbnN0IHdlZWtZZWFyID0gd2Vla1N0YXJ0RGF0ZS55ZWFyKCk7XHJcbiAgICBjb25zdCB5ZWFyU3RhcnREYXRlID0gZGF5anMoYDAxLzAxLyR7d2Vla1llYXJ9YCwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgY29uc3Qgd2Vla0RheSA9IHllYXJTdGFydERhdGUuZGF5KCk7XHJcblxyXG4gICAgY29uc3Qgbm9PZkRheXMgPSB3ZWVrU3RhcnREYXRlLmRpZmYoeWVhclN0YXJ0RGF0ZSwgXCJkXCIpICsgMTtcclxuXHJcbiAgICBmdW5jdGlvbiBjb252ZXJ0TmdiRGF0ZVRvTW9tZW50KG5nYkRhdGU6IE5nYkRhdGUpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgZm9ybWF0VHlwZSA9IFwiTU0vREQvWVlZWVwiO1xyXG4gICAgICBsZXQgY29udmVydGVkID0gbnVsbDtcclxuICAgICAgaWYobmdiRGF0ZSAmJiBuZ2JEYXRlLm1vbnRoICYmIG5nYkRhdGUuZGF5ICYmIG5nYkRhdGUueWVhcil7XHJcbiAgICAgICAgY29udmVydGVkID0gbmdiRGF0ZS5tb250aCsgXCIvXCIgKyAgbmdiRGF0ZS5kYXkgKyBcIi9cIiArIG5nYkRhdGUueWVhcjtcclxuICAgICAgICBjb252ZXJ0ZWQgPSBkYXlqcyhjb252ZXJ0ZWQpLmZvcm1hdChmb3JtYXRUeXBlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29udmVydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpIHtcclxuICAgICAgbGV0IGlzTGVhcFllYXIgPSAod2Vla1llYXIgJSA0ID09IDAgJiYgd2Vla1llYXIgJSAxMDAgIT0gMCkgfHwgd2Vla1llYXIgJSA0MDAgPT0gMDtcclxuICAgICAgcmV0dXJuIChpc0xlYXBZZWFyICYmICh3ZWVrRGF5ID09IDAgfHwgd2Vla0RheSA9PSA2KSkgfHwgKCFpc0xlYXBZZWFyICYmIHdlZWtEYXkgPT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNMZWFwWWVhciA9IGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpO1xyXG4gICAgY29uc3QgZGl2aWRlciA9IGlzTGVhcFllYXIgPyA1MyA6IDUyO1xyXG4gICAgY29uc3QgYWRkZXIgPSBpc0xlYXBZZWFyID8gMiA6IDE7XHJcblxyXG4gICAgbGV0IGJyb2FkY2FzdE51bWJlck9mRGF5cyA9IHdlZWtEYXkgKyBub09mRGF5cztcclxuICAgIGxldCBicm9hZGNhc3RXZWVrTnVtYmVyID0gYnJvYWRjYXN0TnVtYmVyT2ZEYXlzICUgNyA+IDAgPyBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3ICsgYWRkZXIgOiBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3O1xyXG5cclxuICAgIGlmIChNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZGl2aWRlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIENIQU5HRVNAQU5OQUxJQiBDaGFuZ2VkIHRoaXMuXHJcbiAgICAvLyB0aGlzLmNhbGVuZGFyW1wiX19wcm90b19fXCJdLmdldFdlZWtOdW1iZXIgPSB0aGlzLmdldFdlZWtOdW1iZXI7XHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcy5jYWxlbmRhciwge2dldFdlZWtOdW1iZXI6IHRoaXMuZ2V0V2Vla051bWJlcn0pXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVXZWVrRGF0YSgpIHtcclxuICAgIHRoaXMud2Vla09iamVjdHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRUb2RheSgpO1xyXG4gICAgdGhpcy50b2RheSA9IHRoaXMuY2FsZW5kYXIuZ2V0VG9kYXkoKTtcclxuXHJcbiAgICBsZXQgYmFja0RhdGVkUGVyaW9kID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXJEZXRhaWxzXCIpIHx8ICd7fScpLmxvY2tpbmdfcGVyaW9kX2RheXM7XHJcbiAgICBpZiAoYmFja0RhdGVkUGVyaW9kIDwgMCkge1xyXG4gICAgICBsZXQgZGF0ZTogTmdiRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0UHJldih0aGlzLmNhbGVuZGFyLmdldFRvZGF5KCksIFwiZFwiLCBNYXRoLmFicyhiYWNrRGF0ZWRQZXJpb2QpKTtcclxuICAgICAgdGhpcy50b2RheSA9IE5nYkRhdGUuZnJvbShkYXRlKTtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbShkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEaXNhYmxlIG1vbnRocyBiZWZvcmUgbnVtYmVyT2ZNb250aHNUb0VuYWJsZVxyXG4gICAgdGhpcy5kYXRlUGlja2VyQ29uZmlnLm1hcmtEaXNhYmxlZCA9IChkYXRlOiBOZ2JEYXRlU3RydWN0KSA9PiB7XHJcbiAgICAgIGxldCBwcmV2aW91c01vbnRoID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMudG9kYXksIFwibVwiLCB0aGlzLmNvbmZpZy5udW1iZXJPZk1vbnRoc1RvRW5hYmxlSW5QYXN0KTtcclxuICAgICAgbGV0IHByZXZpb3VzRGF5ID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHByZXZpb3VzTW9udGgsIFwiZFwiLCAxKTtcclxuICAgICAgcmV0dXJuICFOZ2JEYXRlLmZyb20ocHJldmlvdXNEYXkpLmJlZm9yZShkYXRlKTtcclxuICAgIH07XHJcbiAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuZm9ybWF0dGVkRGF0ZXMoKTtcclxuICAgIHRoaXMuZmxhZzEgPSBmYWxzZTtcclxuICAgIHRoaXMuZmxhZzIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFdlZWsoZGF0ZTogTmdiRGF0ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0ZU9iamVjdCA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcclxuICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUoZGF0ZU9iamVjdCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzKSB7XHJcbiAgICAgIC8vU2luZ2xlIHdlZWsgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRhdGUuYmVmb3JlKHRoaXMuZnJvbURhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY29uc3RydWN0U3RhcnREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmZsYWcxKSB7XHJcbiAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mbGFnMSA9ICF0aGlzLmZsYWcxO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGUuYWZ0ZXIodGhpcy50b0RhdGUpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmxhZzIpIHtcclxuICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgIC8vdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmxhZzIgPSAhdGhpcy5mbGFnMjtcclxuICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jb25zdHJ1Y3RTdGFydERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBkYXlqc1N0YXJ0RGF0ZSA9IGRheWpzKHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KHRoaXMuZnJvbURhdGUpLCBcIk1NL0REL1lZWVlcIik7XHJcbiAgICAgICAgbGV0IGRheWpzRW5kRGF0ZSA9IGRheWpzKHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KHRoaXMudG9EYXRlKSwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgIGxldCBuZ2JEYXRlO1xyXG4gICAgICAgIHdoaWxlICghZGF5anNTdGFydERhdGUuaXNTYW1lKGRheWpzRW5kRGF0ZSkpIHtcclxuICAgICAgICAgIG5nYkRhdGUgPSB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShkYXlqc1N0YXJ0RGF0ZSwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2hlY2tJZkRhdGVJc0Rpc2FibGVkKG5nYkRhdGUpKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF5anNTdGFydERhdGUuYWRkKDEsIFwiZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld0RhdGVPYmplY3QgPSBuZXcgRGF0ZShuZ2JEYXRlLnllYXIsIG5nYkRhdGUubW9udGggLSAxLCBuZ2JEYXRlLmRheSAtIDEpO1xyXG4gICAgICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUobmV3RGF0ZU9iamVjdCk7XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUobmV3RGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuc2hvd0FzRHJvcGRvd24pIHtcclxuICAgICAgdGhpcy5hcHBseUNoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdlZWtOdW1iZXJHZW5lcmF0b3IoKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0ZXMgPSBbXTtcclxuICAgIGxldCB3ZWVrID0gW107XHJcblxyXG4gICAgbGV0IHN0YXJ0RGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLmZyb21EYXRlKTtcclxuICAgIGxldCBlbmREYXRlID0gTmdiRGF0ZS5mcm9tKHRoaXMudG9EYXRlKTtcclxuXHJcbiAgICB3ZWVrLnB1c2goc3RhcnREYXRlKTtcclxuICAgIHdoaWxlIChlbmREYXRlICE9IG51bGwgJiYgIXN0YXJ0RGF0ZS5lcXVhbHMoZW5kRGF0ZSkpIHtcclxuICAgICAgbGV0IGRhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQoc3RhcnREYXRlLCBcImRcIiwgMSk7XHJcbiAgICAgIHN0YXJ0RGF0ZSA9IGRhdGU7XHJcbiAgICAgIHdlZWsucHVzaChkYXRlKTtcclxuXHJcbiAgICAgIC8vIENvbGxlY3QgYWxsIGRheXMgaW4gd2VlayB0byBjYWxjdWxhdGUgdGhlIHdlZWsgbnVtYmVyXHJcbiAgICAgIGlmICh3ZWVrLmxlbmd0aCA9PSA3KSB7XHJcbiAgICAgICAgZGF0ZXMucHVzaCh3ZWVrKTtcclxuICAgICAgICB3ZWVrID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICgoKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCkgPiAwICYmIGRhdGVzLmxlbmd0aCA+ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKSkge1xyXG4gICAgICBkYXRlcy5zcGxpY2UoKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCksIGRhdGVzLmxlbmd0aCAtICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlcyhkYXRlcyk7XHJcblxyXG4gICAgdGhpcy53ZWVrTnVtYmVycyA9IFtdO1xyXG4gICAgdGhpcy53ZWVrT2JqZWN0cyA9IFtdO1xyXG4gICAgaWYgKGRhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgZGF0ZSBvZiBkYXRlcykge1xyXG4gICAgICAgIHRoaXMud2Vla051bWJlcnMucHVzaChcIiBXZWVrIFwiICsgdGhpcy5jYWxlbmRhci5nZXRXZWVrTnVtYmVyKGRhdGUsIHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrKSk7XHJcbiAgICAgICAgbGV0IGRhdGVzID0gdGhpcy5mb3JtYXR0ZXIoZGF0ZVswXSwgZGF0ZVs2XSk7XHJcbiAgICAgICAgbGV0IGRhdGVPYmplY3RzID0geyBzdGFydERhdGU6IGRhdGVzLmZvcm1hdHRlZFN0YXJ0RGF0ZSwgZW5kRGF0ZTogZGF0ZXMuZm9ybWF0dGVkRW5kRGF0ZSB9O1xyXG4gICAgICAgIHRoaXMud2Vla09iamVjdHMucHVzaChkYXRlT2JqZWN0cyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkRGF0ZXMoZGF0ZXM6IGFueSkge1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IGRhdGVzWzBdWzBdO1xyXG4gICAgdGhpcy50b0RhdGUgPSBkYXRlc1tkYXRlcy5sZW5ndGggLSAxXVs2XTtcclxuICB9XHJcblxyXG4gIGZvcm1hdHRlZERhdGVzKCkge1xyXG4gICAgbGV0IHBpcGUgPSBuZXcgRGF0ZVBpcGUoXCJlbi1VU1wiKTtcclxuICAgIGxldCB0aGlzT2JqID0gdGhpcztcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZnJvbURhdGU6IE5nYkRhdGUsIHRvRGF0ZTogTmdiRGF0ZSkge1xyXG4gICAgICBsZXQgZnJvbURhdGVPYmplY3QgPSBuZXcgRGF0ZShmcm9tRGF0ZS55ZWFyLCBmcm9tRGF0ZS5tb250aCAtIDEsIGZyb21EYXRlLmRheSk7XHJcbiAgICAgIGxldCB0b0RhdGVPYmplY3QgPSBuZXcgRGF0ZSh0b0RhdGUueWVhciwgdG9EYXRlLm1vbnRoIC0gMSwgdG9EYXRlLmRheSk7XHJcbiAgICAgIHRoaXNPYmouZm9ybWF0dGVkU3RhcnREYXRlID0gcGlwZS50cmFuc2Zvcm0oZnJvbURhdGVPYmplY3QsIHRoaXNPYmouY29uZmlnLmRhdGVGb3JtYXRGb3JSZXF1ZXN0KTtcclxuICAgICAgdGhpc09iai5mb3JtYXR0ZWRFbmREYXRlID0gcGlwZS50cmFuc2Zvcm0odG9EYXRlT2JqZWN0LCB0aGlzT2JqLmNvbmZpZy5kYXRlRm9ybWF0Rm9yUmVxdWVzdCk7XHJcblxyXG4gICAgICB0aGlzT2JqLmRhdGVUb0Rpc3BsYXkgPVxyXG4gICAgICAgIHBpcGUudHJhbnNmb3JtKGZyb21EYXRlT2JqZWN0LCB0aGlzT2JqLmNvbmZpZy5kYXRlRm9ybWF0VG9EaXNwbGF5KSArXHJcbiAgICAgICAgXCIgdG8gXCIgK1xyXG4gICAgICAgIHBpcGUudHJhbnNmb3JtKHRvRGF0ZU9iamVjdCwgdGhpc09iai5jb25maWcuZGF0ZUZvcm1hdFRvRGlzcGxheSk7XHJcbiAgICAgIHJldHVybiB0aGlzT2JqO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGRpc3BsYXlUb1VJKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzICYmIHRoaXMuZnJvbURhdGUgJiYgdGhpcy50b0RhdGUpIHtcclxuICAgICAgLy8gRGlzcGxheSBmb3Igb25seSBTaW5nbGUgV2Vla1xyXG4gICAgICB0aGlzLmZvcm1hdHRlcih0aGlzLmZyb21EYXRlLCB0aGlzLnRvRGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBEaXNwbGF5IGZvciBNdWx0aXBsZSBXZWVrc1xyXG4gICAgICBpZiAodGhpcy53ZWVrTnVtYmVycy5sZW5ndGggPiAodGhpcy5jb25maWcubWF4V2Vla3NUb1Nob3dXaXRoUmVtYWluaW5nQ291bnQgPz8gMCkpIHtcclxuICAgICAgICBsZXQgd2Vla0Rpc3BsYXkgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2hvd1dpdGhSZW1haW5pbmdDb3VudCA/PyAwKTsgaSsrKSB7XHJcbiAgICAgICAgICB3ZWVrRGlzcGxheS5wdXNoKHRoaXMud2Vla051bWJlcnMuc2hpZnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW1haW5pbmdXZWVrcyA9IHRoaXMud2Vla051bWJlcnMubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMud2Vla051bWJlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLndlZWtOdW1iZXJzLnB1c2god2Vla0Rpc3BsYXkgKyBcIiArXCIgKyByZW1haW5pbmdXZWVrcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICBsZXQgZmlyc3REYXlPZldlZWsgPSB0aGlzLmNvbmZpZy5maXJzdERheU9mV2VlaztcclxuICAgIHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0RGF0ZTogYW55KSB7XHJcbiAgICAgIGxldCBzdGFydERheSA9IGRhdGUuZ2V0RGF5KCkgIT0gMCA/IChmaXJzdERheU9mV2VlayA/PyAwKSAtIGRhdGUuZ2V0RGF5KCkgOiAtNjtcclxuICAgICAgcmV0dXJuIGNvbnN0cnVjdERhdGUoc3RhcnREYXkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdEVuZERhdGUoZGF0ZTogRGF0ZSkge1xyXG4gICAgbGV0IGZpcnN0RGF5T2ZXZWVrID0gdGhpcy5jb25maWcuZmlyc3REYXlPZldlZWs7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdERhdGU6IGFueSkge1xyXG4gICAgICBsZXQgZW5kRGF5ID0gZGF0ZS5nZXREYXkoKSAhPSAwID8gKGZpcnN0RGF5T2ZXZWVrID8/IDApICsgNiAtIGRhdGUuZ2V0RGF5KCkgOiAwO1xyXG4gICAgICByZXR1cm4gY29uc3RydWN0RGF0ZShlbmREYXkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGJ1aWxkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlcjogbnVtYmVyKTogTmdiRGF0ZSB8IG51bGwge1xyXG4gICAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXRlKCkgKyBudW1iZXI7XHJcbiAgICAgIGNvbnN0IGRhdGVPYmplY3QgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF5KTtcclxuXHJcbiAgICAgIGxldCBuZ2JEYXRlT2JqZWN0ID0ge30gYXMgTmdiRGF0ZTtcclxuICAgICAgbmdiRGF0ZU9iamVjdC5kYXkgPSBkYXk7XHJcblxyXG4gICAgICBpZiAobmdiRGF0ZU9iamVjdC5kYXkgPiAzMSB8fCBuZ2JEYXRlT2JqZWN0LmRheSA8IDEpIHtcclxuICAgICAgICBuZ2JEYXRlT2JqZWN0LmRheSA9IGRhdGVPYmplY3QuZ2V0RGF0ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZ2JEYXRlT2JqZWN0Lm1vbnRoID0gZGF0ZU9iamVjdC5nZXRNb250aCgpICsgMTtcclxuICAgICAgbmdiRGF0ZU9iamVjdC55ZWFyID0gZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICByZXR1cm4gTmdiRGF0ZS5mcm9tKG5nYkRhdGVPYmplY3QpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGlzSG92ZXJlZChkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbURhdGUgJiYgIXRoaXMudG9EYXRlICYmIHRoaXMuaG92ZXJlZERhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLmhvdmVyZWREYXRlKTtcclxuICB9XHJcblxyXG4gIGlzSW5zaWRlKGRhdGU6IE5nYkRhdGUpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy50b0RhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLnRvRGF0ZSk7XHJcbiAgfVxyXG5cclxuICBpc1JhbmdlKGRhdGU6IE5nYkRhdGUpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkYXRlLmVxdWFscyh0aGlzLmZyb21EYXRlKSB8fCAodGhpcy50b0RhdGUgJiYgZGF0ZS5lcXVhbHModGhpcy50b0RhdGUpKSB8fCB0aGlzLmlzSW5zaWRlKGRhdGUpIHx8IHRoaXMuaXNIb3ZlcmVkKGRhdGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNXZWVrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZnJvbURhdGUpIHtcclxuICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNhbGVuZGFyLmdldFByZXYodGhpcy5mcm9tRGF0ZSwgXCJkXCIsIDEpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMuZnJvbURhdGUsIFwiZFwiLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICB0aGlzLmFwcGx5Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmV4dFdlZWsoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mcm9tRGF0ZSkge1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXROZXh0KHRoaXMuZnJvbURhdGUsIFwiZFwiLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkpO1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0TmV4dCh0aGlzLmZyb21EYXRlLCBcImRcIiwgdGhpcy5jYWxlbmRhci5nZXREYXlzUGVyV2VlaygpIC0gMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcclxuICAgIHRoaXMuYXBwbHlDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRDYWxlbmRhck1hcCgpIHtcclxuICAgIGxldCBkYXRlT2JqID0geyBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSwgdG9EYXRlOiB0aGlzLnRvRGF0ZSB9O1xyXG4gICAgdGhpcy5jYWxlbmRhck1hcC5zZXQoXCJvbGREYXRlc1wiLCBkYXRlT2JqKTtcclxuICB9XHJcblxyXG4gIGFwcGx5Q2hhbmdlcygpIHtcclxuICAgIHRoaXMubXVsdGlTZWxlY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIGlmICghdGhpcy5jb25maWcuZW1pdE11bHRpcGxlV2Vla09iamVjdHMpIHtcclxuICAgICAgbGV0IGRhdGVzID0ge30gYXMgV2Vla09iamVjdDtcclxuICAgICAgbGV0IGZvcm1hdHRlZERhdGVzID0gdGhpcy5mb3JtYXR0ZXIodGhpcy5mcm9tRGF0ZSwgdGhpcy50b0RhdGUpO1xyXG4gICAgICBkYXRlcy5zdGFydERhdGUgPSBmb3JtYXR0ZWREYXRlcy5mb3JtYXR0ZWRTdGFydERhdGU7XHJcbiAgICAgIGRhdGVzLmVuZERhdGUgPSBmb3JtYXR0ZWREYXRlcy5mb3JtYXR0ZWRFbmREYXRlO1xyXG4gICAgICB0aGlzLmFwcGx5V2Vla0NhbGVuZGFyQ2hhbmdlcy5lbWl0KGRhdGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzLmVtaXQodGhpcy53ZWVrT2JqZWN0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldENhbGVuZGFyTWFwKCk7XHJcbiAgfVxyXG5cclxuICBpc0ZvY3VzZWQodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5jYWxlbmRhclRvZ2dsZWQuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpc0Ryb3Bkb3duT3BlbmVkRm9yQ2FsZW5kYXIoZGF0ZXBpY2tlcjogTmdiSW5wdXREYXRlcGlja2VyKSB7XHJcbiAgICB0aGlzLmRhdGVwaWNrZXIgPSBkYXRlcGlja2VyO1xyXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlci5pc09wZW4oKSkge1xyXG4gICAgICB0aGlzLnJldmVydERhdGVzKCk7XHJcbiAgICAgIHRoaXMuZGF0ZXBpY2tlci5jbG9zZSgpO1xyXG4gICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGVwaWNrZXIub3BlbigpO1xyXG4gICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldmVydERhdGVzKCkge1xyXG4gICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNYXAuZ2V0KFwib2xkRGF0ZXNcIikpIHtcclxuICAgICAgbGV0IGRhdGVPYmogPSB0aGlzLmNhbGVuZGFyTWFwLmdldChcIm9sZERhdGVzXCIpO1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gZGF0ZU9iai5mcm9tRGF0ZTtcclxuICAgICAgdGhpcy50b0RhdGUgPSBkYXRlT2JqLnRvRGF0ZTtcclxuICAgICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrSWZEYXRlSXNEaXNhYmxlZChkYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbGlkYXRvckZ1bmMgPSAobmdiRGF0ZTogTmdiRGF0ZSkgPT4gbmdiRGF0ZS55ZWFyID09PSBkYXRlLnllYXIgJiYgbmdiRGF0ZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJiBuZ2JEYXRlLmRheSA9PT0gZGF0ZS5kYXk7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUodmFsaWRhdG9yRnVuYyk7XHJcbiAgfVxyXG5cclxuICBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlclJlZjogYW55KSB7XHJcbiAgICBkYXRlcGlja2VyUmVmLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmVcIiAqbmdJZj1cImNvbmZpZy5zaG93QXNEcm9wZG93blwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbmFtZT1cImRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgI2RhdGVwaWNrZXI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgKGRhdGVTZWxlY3QpPVwic2VsZWN0V2VlaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjbG9zZWQpPVwiaXNGb2N1c2VkKGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzcGxheU1vbnRoc109XCIxXCJcclxuICAgICAgICAgICAgICAgIFtkYXlUZW1wbGF0ZV09XCJ0XCJcclxuICAgICAgICAgICAgICAgIFtzdGFydERhdGVdPVwiZnJvbURhdGUhXCJcclxuICAgICAgICAgICAgICAgIFtmaXJzdERheU9mV2Vla109XCJjb25maWcuZmlyc3REYXlPZldlZWtcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dXZWVrTnVtYmVyc109XCJjb25maWcuc2hvd1dlZWtOdW1iZXJzXCJcclxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcclxuICAgICAgICAgICAgICAgIFtmb290ZXJUZW1wbGF0ZV09XCJmb290ZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tU2luZ2xlIHdlZWsgc2VsZWN0LS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCI+XHJcbiAgICAgICAgPHNwYW4gc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGxlZnQ6IDMwcHg7IGZvbnQtc2l6ZTogMTJweFwiPiAmbmJzcDt7eyB3ZWVrTnVtYmVycyB9fSA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5leHQtcm91bmQtYnRuXCIgKGNsaWNrKT1cInByZXZpb3VzV2VlaygpXCI+IG5hdmlnYXRlX25leHQgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZHBGcm9tRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFdlZWtzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW2NvbmZpZy5jdXN0b21DbGFzcyA9PSAnJyA/ICcnIDogY29uZmlnLmN1c3RvbUNsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkcEZyb21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGVUb0Rpc3BsYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0ZvY3VzZWQodHJ1ZSk7IGlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktbWVudS1kb3duXCIgKm5nSWY9JyFkYXRlcGlja2VyLmlzT3BlbigpJyAoY2xpY2spPVwiZGF0ZXBpY2tlci5vcGVuKClcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J21kaSBtZGktbWVudS11cCcgKm5nSWY9XCJkYXRlcGlja2VyLmlzT3BlbigpXCIgKGNsaWNrKT1cImlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyByb3VuZC1idG5cIiAoY2xpY2spPVwibmV4dFdlZWsoKVwiPiBuYXZpZ2F0ZV9uZXh0IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS1NdWx0aXBsZSB3ZWVrIHNlbGVjdC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXBsZS13ZWVrc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgI2RwRnJvbURhdGVcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgV2Vla3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltjb25maWcuY3VzdG9tQ2xhc3MgPT0gJycgPyAnJyA6IGNvbmZpZy5jdXN0b21DbGFzc11cIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkcEZyb21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndlZWtOdW1iZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNGb2N1c2VkKHRydWUpOyBpc0Ryb3Bkb3duT3BlbmVkRm9yQ2FsZW5kYXIoZGF0ZXBpY2tlcilcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIW11bHRpU2VsZWN0RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJtZGkgbWRpLW1lbnUtZG93biBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwibXVsdGlTZWxlY3REcm9wZG93bk9wZW5cIiBjbGFzcz1cIm1kaSBtZGktbWVudS11cCBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuPG5nYi1kYXRlcGlja2VyXHJcbiAgICAjd2Vla1BpY2tlclxyXG4gICAgKm5nSWY9XCIhY29uZmlnLnNob3dBc0Ryb3Bkb3duXCJcclxuICAgIFtkaXNwbGF5TW9udGhzXT1cIjFcIlxyXG4gICAgW3N0YXJ0RGF0ZV09XCJmcm9tRGF0ZSFcIlxyXG4gICAgW2ZpcnN0RGF5T2ZXZWVrXT1cImNvbmZpZy5maXJzdERheU9mV2Vla1wiXHJcbiAgICBbc2hvd1dlZWtOdW1iZXJzXT1cImNvbmZpZy5zaG93V2Vla051bWJlcnNcIlxyXG4gICAgW2RheVRlbXBsYXRlXT1cInRcIlxyXG4gICAgW21heERhdGVdPVwibWF4RGF0ZVwiXHJcbiAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcclxuICAgIChkYXRlU2VsZWN0KT1cInNlbGVjdFdlZWsoJGV2ZW50KVwiXHJcbiAgICBbbWFya0Rpc2FibGVkXT1cImRpc2FibGVkRnVuY1wiXHJcbj5cclxuPC9uZ2ItZGF0ZXBpY2tlcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZm9vdGVyVGVtcGxhdGU+XHJcbiAgICA8aHIgY2xhc3M9XCJteS0wXCIgLz5cclxuICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gbS0yIGZsb2F0LXJpZ2h0XCJcclxuICAgICAgICAoY2xpY2spPVwiYXBwbHlDaGFuZ2VzKCk7IGNsb3NlRGF0ZXBpY2tlcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjMjY4YmZmOyBjb2xvcjogI2ZmZmZmZlwiXHJcbiAgICA+XHJcbiAgICAgICAgQXBwbHlcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHRcIlxyXG4gICAgICAgIChjbGljayk9XCJyZXZlcnREYXRlcygpOyBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlcilcIlxyXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzOCwgMTM5LCAyNTUsIDAuMTIpOyBjb2xvcjogIzI2OGJmZlwiXHJcbiAgICA+XHJcbiAgICAgICAgQ2FuY2VsXHJcbiAgICA8L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdCBsZXQtZGF0ZSBsZXQtZm9jdXNlZD1cImZvY3VzZWRcIiBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxyXG4gICAgPHNwYW5cclxuICAgICAgICBjbGFzcz1cImN1c3RvbS1kYXlcIlxyXG4gICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImZvY3VzZWRcIlxyXG4gICAgICAgIFtjbGFzcy5yYW5nZV09XCJpc1JhbmdlKGRhdGUpXCJcclxuICAgICAgICBbY2xhc3MuZmFkZWRdPVwiaXNIb3ZlcmVkKGRhdGUpIHx8IGlzSW5zaWRlKGRhdGUpXCJcclxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWREYXRlID0gZGF0ZVwiXHJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZERhdGUgPSBudWxsXCJcclxuICAgID5cclxuICAgICAgICB7eyBkYXRlLmRheSB9fVxyXG4gICAgPC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLVxyXG5cclxuPGhyPlxyXG5cclxuPHByZT5Gcm9tOiB7eyBmcm9tRGF0ZSB8IGpzb24gfX0gPC9wcmU+XHJcbjxwcmU+VG86IHt7IHRvRGF0ZSB8IGpzb24gfX0gPC9wcmU+XHJcbjxwcmU+d2Vla051bWJlcnM6IHt7IHdlZWtOdW1iZXJzIHwganNvbiB9fSA8L3ByZT5cclxuXHJcbi0tPlxyXG4iXX0=
|