barsa-calendar 1.0.456 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/barsa-calendar.mjs +4 -4
- package/esm2022/lib/barsa-calendar.module.mjs +117 -0
- package/esm2022/lib/calendar-container/calendar-container.component.mjs +230 -0
- package/esm2022/lib/calendar-header/calendar-header.component.mjs +66 -0
- package/esm2022/lib/calendar-list/calendar-list.component.mjs +18 -0
- package/esm2022/lib/calendar-list-container/calendar-list-container.component.mjs +29 -0
- package/{esm2020 → esm2022}/lib/calendar-list-item/calendar-list-item.component.mjs +14 -14
- package/esm2022/lib/calendar-month/calendar-month.component.mjs +246 -0
- package/esm2022/lib/calendar-selection-days/calendar-selection-days.component.mjs +196 -0
- package/esm2022/lib/calendar-week/calendar-week.component.mjs +252 -0
- package/{esm2020 → esm2022}/lib/constants.mjs +3 -3
- package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +431 -0
- package/esm2022/lib/day-event-list/day-event-list.component.mjs +55 -0
- package/esm2022/lib/day-number-box/day-number-box.component.mjs +105 -0
- package/{esm2020 → esm2022}/lib/days-in-week.pipe.mjs +17 -17
- package/esm2022/lib/equal-date.pipe.mjs +23 -0
- package/esm2022/lib/event-button/event-button.component.mjs +97 -0
- package/esm2022/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +29 -0
- package/esm2022/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +29 -0
- package/esm2022/lib/event-date.pipe.mjs +24 -0
- package/esm2022/lib/event-preview/event-preview.component.mjs +79 -0
- package/{esm2020 → esm2022}/lib/event-time.pipe.mjs +22 -22
- package/{esm2020 → esm2022}/lib/from-to-time.pipe.mjs +23 -23
- package/esm2022/lib/models.mjs +14 -0
- package/esm2022/lib/month-days/month-days.component.mjs +222 -0
- package/esm2022/lib/services/calendar.service.mjs +645 -0
- package/{esm2020 → esm2022}/public-api.mjs +23 -23
- package/fesm2022/barsa-calendar.mjs +2816 -0
- package/fesm2022/barsa-calendar.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/barsa-calendar.module.d.ts +53 -53
- package/lib/calendar-container/calendar-container.component.d.ts +89 -89
- package/lib/calendar-header/calendar-header.component.d.ts +33 -33
- package/lib/calendar-list/calendar-list.component.d.ts +8 -8
- package/lib/calendar-list-container/calendar-list-container.component.d.ts +14 -14
- package/lib/calendar-list-item/calendar-list-item.component.d.ts +7 -7
- package/lib/calendar-month/calendar-month.component.d.ts +70 -70
- package/lib/calendar-selection-days/calendar-selection-days.component.d.ts +48 -48
- package/lib/calendar-week/calendar-week.component.d.ts +70 -70
- package/lib/constants.d.ts +1 -1
- package/lib/date-time-picker/date-time-picker.component.d.ts +113 -112
- package/lib/day-event-list/day-event-list.component.d.ts +20 -20
- package/lib/day-number-box/day-number-box.component.d.ts +30 -30
- package/lib/days-in-week.pipe.d.ts +9 -9
- package/lib/equal-date.pipe.d.ts +8 -8
- package/lib/event-button/event-button.component.d.ts +31 -31
- package/lib/event-button-end-arrow/event-button-end-arrow.component.d.ts +12 -12
- package/lib/event-button-start-arrow/event-button-start-arrow.component.d.ts +12 -12
- package/lib/event-date.pipe.d.ts +9 -9
- package/lib/event-preview/event-preview.component.d.ts +24 -24
- package/lib/event-time.pipe.d.ts +9 -9
- package/lib/from-to-time.pipe.d.ts +9 -9
- package/lib/models.d.ts +110 -110
- package/lib/month-days/month-days.component.d.ts +69 -69
- package/lib/services/calendar.service.d.ts +70 -70
- package/package.json +7 -13
- package/public-api.d.ts +19 -19
- package/esm2020/lib/barsa-calendar.module.mjs +0 -117
- package/esm2020/lib/calendar-container/calendar-container.component.mjs +0 -230
- package/esm2020/lib/calendar-header/calendar-header.component.mjs +0 -67
- package/esm2020/lib/calendar-list/calendar-list.component.mjs +0 -19
- package/esm2020/lib/calendar-list-container/calendar-list-container.component.mjs +0 -30
- package/esm2020/lib/calendar-month/calendar-month.component.mjs +0 -246
- package/esm2020/lib/calendar-selection-days/calendar-selection-days.component.mjs +0 -195
- package/esm2020/lib/calendar-week/calendar-week.component.mjs +0 -249
- package/esm2020/lib/date-time-picker/date-time-picker.component.mjs +0 -433
- package/esm2020/lib/day-event-list/day-event-list.component.mjs +0 -56
- package/esm2020/lib/day-number-box/day-number-box.component.mjs +0 -105
- package/esm2020/lib/equal-date.pipe.mjs +0 -23
- package/esm2020/lib/event-button/event-button.component.mjs +0 -97
- package/esm2020/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +0 -29
- package/esm2020/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +0 -29
- package/esm2020/lib/event-date.pipe.mjs +0 -24
- package/esm2020/lib/event-preview/event-preview.component.mjs +0 -79
- package/esm2020/lib/models.mjs +0 -14
- package/esm2020/lib/month-days/month-days.component.mjs +0 -222
- package/esm2020/lib/services/calendar.service.mjs +0 -645
- package/fesm2015/barsa-calendar.mjs +0 -2813
- package/fesm2015/barsa-calendar.mjs.map +0 -1
- package/fesm2020/barsa-calendar.mjs +0 -2817
- package/fesm2020/barsa-calendar.mjs.map +0 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Injectable, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
3
|
+
import { BaseComponent, DateService, getDateService, BarsaApi } from 'barsa-novin-ray-core';
|
|
4
|
+
import { CalendarService } from '../services/calendar.service';
|
|
5
|
+
import { DatetimeAdapter, FdDate, FdDatetimeAdapter, InputGroupComponent, TimeComponent } from '@fundamental-ngx/core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "barsa-novin-ray-core";
|
|
8
|
+
import * as i2 from "@fundamental-ngx/core";
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "@fundamental-ngx/core/bar";
|
|
12
|
+
import * as i6 from "@fundamental-ngx/core/content-density";
|
|
13
|
+
import * as i7 from "@fundamental-ngx/core/button";
|
|
14
|
+
import * as i8 from "@fundamental-ngx/core/input-group";
|
|
15
|
+
import * as i9 from "@fundamental-ngx/core/dialog";
|
|
16
|
+
import * as i10 from "@fundamental-ngx/core/title";
|
|
17
|
+
import * as i11 from "@fundamental-ngx/core/popover";
|
|
18
|
+
import * as i12 from "@fundamental-ngx/core/time";
|
|
19
|
+
import * as i13 from "@fundamental-ngx/core/toolbar";
|
|
20
|
+
import * as i14 from "../calendar-month/calendar-month.component";
|
|
21
|
+
import * as i15 from "../calendar-selection-days/calendar-selection-days.component";
|
|
22
|
+
export class TimeConfigI18n {
|
|
23
|
+
constructor(_bbbTranslate) {
|
|
24
|
+
this._bbbTranslate = _bbbTranslate;
|
|
25
|
+
/** Aria label for the 'increase hours' button */
|
|
26
|
+
this.increaseHoursLabel = 'Increase hours';
|
|
27
|
+
/** label for the 'hours' column */
|
|
28
|
+
this.hoursLabel = this._bbbTranslate.transform('Hours');
|
|
29
|
+
/** Aria label for the 'decrease hours' button */
|
|
30
|
+
this.decreaseHoursLabel = 'Decrease hours';
|
|
31
|
+
/** Aria label for the 'increase minutes' button */
|
|
32
|
+
this.increaseMinutesLabel = 'Increase minutes';
|
|
33
|
+
/** label for the 'minutes' column */
|
|
34
|
+
this.minutesLabel = this._bbbTranslate.transform('Minutes');
|
|
35
|
+
/** Aria label for the 'decrease minutes' button */
|
|
36
|
+
this.decreaseMinutesLabel = 'Decrease minutes';
|
|
37
|
+
/** Aria label for the 'increase seconds' button */
|
|
38
|
+
this.increaseSecondsLabel = 'Increase seconds';
|
|
39
|
+
/** label for the 'seconds' column */
|
|
40
|
+
this.secondsLabel = this._bbbTranslate.transform('Sec');
|
|
41
|
+
/** Aria label for the 'decrease seconds' button */
|
|
42
|
+
this.decreaseSecondsLabel = 'Decrease seconds';
|
|
43
|
+
/** Aria label for the 'increase period' button */
|
|
44
|
+
this.increasePeriodLabel = 'Increase period';
|
|
45
|
+
/** label for the 'period' column */
|
|
46
|
+
this.periodLabel = 'Period';
|
|
47
|
+
/** Aria label for the 'decrease period' button */
|
|
48
|
+
this.decreasePeriodLabel = 'Decrease period';
|
|
49
|
+
}
|
|
50
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n, deps: [{ token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
51
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n }); }
|
|
52
|
+
}
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n, decorators: [{
|
|
54
|
+
type: Injectable
|
|
55
|
+
}], ctorParameters: () => [{ type: i1.BbbTranslatePipe }] });
|
|
56
|
+
export class DateTimePickerComponent extends BaseComponent {
|
|
57
|
+
constructor(_datetimeAdapter, _dateTimeToCaption, _logService, _dialogService, _portalService) {
|
|
58
|
+
super();
|
|
59
|
+
this._datetimeAdapter = _datetimeAdapter;
|
|
60
|
+
this._dateTimeToCaption = _dateTimeToCaption;
|
|
61
|
+
this._logService = _logService;
|
|
62
|
+
this._dialogService = _dialogService;
|
|
63
|
+
this.rtl = true;
|
|
64
|
+
this.rangeChange = new EventEmitter();
|
|
65
|
+
this.valueChange = new EventEmitter();
|
|
66
|
+
this.valueCaption = '';
|
|
67
|
+
this.selectionMode = 'day';
|
|
68
|
+
this.todayIndex = -1;
|
|
69
|
+
this.isValid = true;
|
|
70
|
+
this.months = [];
|
|
71
|
+
this.tempFormmatedDate = '';
|
|
72
|
+
this.rtl$ = _portalService.rtl$;
|
|
73
|
+
this.width$ = _portalService.deviceSize$.pipe(distinctUntilChanged(), map((deviceSize) => {
|
|
74
|
+
if (!this.showDate) {
|
|
75
|
+
return 260;
|
|
76
|
+
}
|
|
77
|
+
switch (deviceSize) {
|
|
78
|
+
case 'l':
|
|
79
|
+
case 'xl':
|
|
80
|
+
return 560;
|
|
81
|
+
case 's':
|
|
82
|
+
return 320;
|
|
83
|
+
default:
|
|
84
|
+
return 520;
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
this.height = 420;
|
|
88
|
+
}
|
|
89
|
+
ngOnInit() {
|
|
90
|
+
super.ngOnInit();
|
|
91
|
+
let culture = 'en-US';
|
|
92
|
+
switch (this.primaryCalendarType) {
|
|
93
|
+
case 'HijriShamsi':
|
|
94
|
+
culture = 'fa-IR';
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
this.culture = culture;
|
|
98
|
+
this._calendarService = new CalendarService(this._logService, culture);
|
|
99
|
+
this._calendarService.setMode('month');
|
|
100
|
+
this.weekDaysMin = this._calendarService.weekDaysMin();
|
|
101
|
+
this.weekDays = this._calendarService.weekDays();
|
|
102
|
+
this.selectedMonth$ = this._calendarService.selected$;
|
|
103
|
+
this.today = this._calendarService.today;
|
|
104
|
+
if (this.value) {
|
|
105
|
+
this.timeValue = FdDate.getFdDateByDate(this.value);
|
|
106
|
+
this._setCaption(this.value);
|
|
107
|
+
this._calendarService.loadMonthByDate(this.value);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.timeValue = FdDate.getFdDateByDate(new Date());
|
|
111
|
+
}
|
|
112
|
+
// if (this.isRangePicker) {
|
|
113
|
+
// if (this.startRangeDate) {
|
|
114
|
+
// this._calendarService.loadMonthByDate(this.startRangeDate);
|
|
115
|
+
// }
|
|
116
|
+
// if (this.endRangeDate) {
|
|
117
|
+
// }
|
|
118
|
+
// } else {
|
|
119
|
+
// this._calendarService.loadMonthByDate(this.value);
|
|
120
|
+
// }
|
|
121
|
+
this.months = this._calendarService.Months;
|
|
122
|
+
this._prepareYear(this._calendarService.selectedMonth.dateInfo.year);
|
|
123
|
+
this._setFormattedDateToInput(this.value);
|
|
124
|
+
if (this.inputGroupComponent) {
|
|
125
|
+
// this.inputGroupComponent.registerOnChange(this.onCaptionChanged.bind(this));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
ngOnChanges(changes) {
|
|
129
|
+
const { value } = changes;
|
|
130
|
+
if (value && !value.firstChange) {
|
|
131
|
+
const caption = this._getFormattedDate(value.currentValue);
|
|
132
|
+
if (caption !== this.inputGroupComponent?.inputText) {
|
|
133
|
+
this._setFormattedDateToInput(this.value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
onRangeChange(e) {
|
|
138
|
+
this.rangeChange.emit({
|
|
139
|
+
startDay: e.startDay,
|
|
140
|
+
endDay: e.endDay
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
onOpenPopover(popover, dialogTemplate) {
|
|
144
|
+
if (this.readonly || this.disabled) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (this.timeComponent) {
|
|
148
|
+
setTimeout(() => this.timeComponent.refreshColumns(), 0);
|
|
149
|
+
}
|
|
150
|
+
if (this.deviceSize === 's' || this.isMobile) {
|
|
151
|
+
this._dialogService.open(dialogTemplate, {
|
|
152
|
+
mobile: true
|
|
153
|
+
});
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
popover.open();
|
|
157
|
+
}
|
|
158
|
+
onMonthSelected(monthName, index) {
|
|
159
|
+
this._calendarService.gotoMonth(monthName, index);
|
|
160
|
+
}
|
|
161
|
+
onYearSelected(year) {
|
|
162
|
+
this._calendarService.gotoYear(+year);
|
|
163
|
+
}
|
|
164
|
+
onCaptionChanged(e) {
|
|
165
|
+
if (e.length < 10) {
|
|
166
|
+
if (e.length === 0) {
|
|
167
|
+
this._raisValueChanged(undefined);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.isValid = false;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const englishDateStr = BarsaApi.Common.Util.ReplaceFaToArCharchter(e);
|
|
174
|
+
let format = 'jYYYY/jM/jD';
|
|
175
|
+
if (this.showTime) {
|
|
176
|
+
format += ' HH:mm';
|
|
177
|
+
}
|
|
178
|
+
const moment = this._calendarService._dateService.stringToMoment(englishDateStr, format);
|
|
179
|
+
// const isValid = moment.isValid();// برای شمسی همیشه false نشون میده
|
|
180
|
+
if (isNaN(Date.parse(englishDateStr))) {
|
|
181
|
+
this.isValid = false;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const date = moment.toDate();
|
|
185
|
+
if (isNaN(date)) {
|
|
186
|
+
this.isValid = false;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.isValid = true;
|
|
190
|
+
this.timeValue = this._datetimeAdapter.setTime(this.timeValue, date.getHours(), date.getMinutes(), date.getSeconds());
|
|
191
|
+
this.startSelectedDay = this.endSelectedDay = null;
|
|
192
|
+
this._raisValueChanged(date, false);
|
|
193
|
+
}
|
|
194
|
+
onPrevTap() {
|
|
195
|
+
if (this.selectionMode === 'day') {
|
|
196
|
+
this._calendarService.loadPrevious();
|
|
197
|
+
}
|
|
198
|
+
else if (this.selectionMode === 'month') {
|
|
199
|
+
this._calendarService.loadPrevYear();
|
|
200
|
+
}
|
|
201
|
+
else if (this.selectionMode === 'year') {
|
|
202
|
+
this._prepareYear(Number(this.years[0]) - 20);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
onNextTap() {
|
|
206
|
+
if (this.selectionMode === 'day') {
|
|
207
|
+
this._calendarService.loadNext();
|
|
208
|
+
}
|
|
209
|
+
else if (this.selectionMode === 'month') {
|
|
210
|
+
this._calendarService.loadNextYear();
|
|
211
|
+
}
|
|
212
|
+
else if (this.selectionMode === 'year') {
|
|
213
|
+
this._prepareYear(Number(this.years[this.years.length - 1]) + 1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
onToday() {
|
|
217
|
+
const today = new Date();
|
|
218
|
+
this.timeValue = this._datetimeAdapter.setTime(this.timeValue, today.getHours(), today.getMinutes(), today.getSeconds());
|
|
219
|
+
if (this._calendarService.todayDay) {
|
|
220
|
+
this.startSelectedDay = this._calendarService.todayDay;
|
|
221
|
+
}
|
|
222
|
+
this._calendarService.gotoToday();
|
|
223
|
+
}
|
|
224
|
+
onDayClick(day, popover, dialog) {
|
|
225
|
+
this.isValid = true;
|
|
226
|
+
this.startSelectedDay = this.endSelectedDay = day;
|
|
227
|
+
if (this.showTime) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this._setFirstAndEndDay(day, popover, dialog);
|
|
231
|
+
}
|
|
232
|
+
onPopoverOpenChange(isOpen) {
|
|
233
|
+
if (isOpen) {
|
|
234
|
+
this._lastValue = this.value;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this._lastValue = undefined;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
onClear(popover, dialog) {
|
|
241
|
+
if (dialog) {
|
|
242
|
+
dialog.dismiss();
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
popover.close();
|
|
246
|
+
}
|
|
247
|
+
this.value = undefined;
|
|
248
|
+
this._setFormattedDateToInput(this.value);
|
|
249
|
+
this._raisValueChanged(this.value);
|
|
250
|
+
}
|
|
251
|
+
onOk(popover, dialog) {
|
|
252
|
+
if (dialog) {
|
|
253
|
+
dialog.dismiss();
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
popover.close();
|
|
257
|
+
}
|
|
258
|
+
if (!this.value) {
|
|
259
|
+
this.value = new Date();
|
|
260
|
+
}
|
|
261
|
+
this._handleValueChange();
|
|
262
|
+
}
|
|
263
|
+
onCancel(popover, dialog) {
|
|
264
|
+
if (this._lastValue !== this.value) {
|
|
265
|
+
this.value = this._lastValue;
|
|
266
|
+
this._setCaption(this.value);
|
|
267
|
+
}
|
|
268
|
+
if (dialog) {
|
|
269
|
+
dialog.dismiss();
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
popover.close();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
_setFormattedDateToInput(date) {
|
|
276
|
+
if (date) {
|
|
277
|
+
const formattedDate = this._getFormattedDate(date);
|
|
278
|
+
this.tempFormmatedDate = formattedDate;
|
|
279
|
+
this._setInputGroupText(formattedDate);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
this.tempFormmatedDate = '';
|
|
283
|
+
this._setInputGroupText('');
|
|
284
|
+
}
|
|
285
|
+
_setInputGroupText(val) {
|
|
286
|
+
if (this.inputGroupComponent) {
|
|
287
|
+
this.inputGroupComponent.inputText = val;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
_getFormattedDate(date) {
|
|
291
|
+
return this._dateTimeToCaption.transform(date, this.formatPattern, this.culture, this.showDate, this.showTime);
|
|
292
|
+
}
|
|
293
|
+
_handleValueChange() {
|
|
294
|
+
this.value = this.showDate ? this.startSelectedDay?.date ?? this.value : new Date();
|
|
295
|
+
if (this.value) {
|
|
296
|
+
this.value = new Date(this.value);
|
|
297
|
+
this.value.setHours(this.timeValue.hour);
|
|
298
|
+
this.value.setMinutes(this.timeValue.minute);
|
|
299
|
+
this.value.setSeconds(this.timeValue.second);
|
|
300
|
+
}
|
|
301
|
+
this._setFormattedDateToInput(this.value);
|
|
302
|
+
this._raisValueChanged(this.value);
|
|
303
|
+
}
|
|
304
|
+
_prepareYear(from) {
|
|
305
|
+
const years = [];
|
|
306
|
+
for (let i = 0; i < 20; i++) {
|
|
307
|
+
years.push(`${from + i}`);
|
|
308
|
+
}
|
|
309
|
+
this.years = years;
|
|
310
|
+
}
|
|
311
|
+
_setCaption(value) {
|
|
312
|
+
if (!value) {
|
|
313
|
+
this.valueCaption = '';
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
let formatPattern = this.formatPattern.replace('YYYY', 'jYYYY');
|
|
317
|
+
formatPattern = formatPattern.replace('MM', 'jMM');
|
|
318
|
+
formatPattern = formatPattern.replace('DD', 'jDD');
|
|
319
|
+
this.valueCaption = this._calendarService._dateService.getMoment(value).format(formatPattern);
|
|
320
|
+
}
|
|
321
|
+
_raisValueChanged(date, setCaption = true) {
|
|
322
|
+
this.value = date;
|
|
323
|
+
if (setCaption) {
|
|
324
|
+
this._setCaption(date);
|
|
325
|
+
}
|
|
326
|
+
this.valueChange.emit(date);
|
|
327
|
+
}
|
|
328
|
+
_setFirstAndEndDay(day, popover, dialog) {
|
|
329
|
+
if (dialog) {
|
|
330
|
+
dialog.dismiss();
|
|
331
|
+
}
|
|
332
|
+
if (popover) {
|
|
333
|
+
popover.close();
|
|
334
|
+
}
|
|
335
|
+
if (!this.isRangePicker) {
|
|
336
|
+
this._setFormattedDateToInput(day.date);
|
|
337
|
+
this._raisValueChanged(day.date);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (this.startSelectedDay) {
|
|
341
|
+
this.endSelectedDay = day;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
this.startSelectedDay = day;
|
|
345
|
+
}
|
|
346
|
+
if (this.startSelectedDay && this.endSelectedDay && this.startSelectedDay.date > this.endSelectedDay.date) {
|
|
347
|
+
const temp = this.startSelectedDay;
|
|
348
|
+
this.startSelectedDay = this.endSelectedDay;
|
|
349
|
+
this.endSelectedDay = temp;
|
|
350
|
+
}
|
|
351
|
+
if (this.startSelectedDay && this.endSelectedDay) {
|
|
352
|
+
this.rangeChange.emit({
|
|
353
|
+
startDay: this.startSelectedDay.date,
|
|
354
|
+
endDay: this.endSelectedDay.date
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i2.DatetimeAdapter }, { token: i1.DateTimeToCaptionPipe }, { token: i1.LogService }, { token: i2.DialogService }, { token: i1.PortalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
359
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: DateTimePickerComponent, selector: "bc-date-time-picker", inputs: { placeholder: "placeholder", primaryCalendarType: "primaryCalendarType", formatPattern: "formatPattern", value: "value", timeValue: "timeValue", startRangeDate: "startRangeDate", endRangeDate: "endRangeDate", isRangePicker: "isRangePicker", showTime: "showTime", showDate: "showDate", rtl: "rtl", deviceSize: "deviceSize", isMobile: "isMobile", readonly: "readonly", disabled: "disabled", buttonMenuMode: "buttonMenuMode", inlineMode: "inlineMode", daterangeMode: "daterangeMode" }, outputs: { rangeChange: "rangeChange", valueChange: "valueChange" }, providers: [
|
|
360
|
+
{
|
|
361
|
+
provide: DatetimeAdapter,
|
|
362
|
+
useClass: FdDatetimeAdapter
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
provide: DateService,
|
|
366
|
+
useFactory: getDateService
|
|
367
|
+
},
|
|
368
|
+
CalendarService
|
|
369
|
+
], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i9.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i9.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i9.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i10.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i11.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "directive", type: i11.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i11.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i12.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i13.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i13.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i14.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "component", type: i15.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
370
|
+
}
|
|
371
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: DateTimePickerComponent, decorators: [{
|
|
372
|
+
type: Component,
|
|
373
|
+
args: [{ selector: 'bc-date-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
374
|
+
{
|
|
375
|
+
provide: DatetimeAdapter,
|
|
376
|
+
useClass: FdDatetimeAdapter
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
provide: DateService,
|
|
380
|
+
useFactory: getDateService
|
|
381
|
+
},
|
|
382
|
+
CalendarService
|
|
383
|
+
], template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"] }]
|
|
384
|
+
}], ctorParameters: () => [{ type: i2.DatetimeAdapter }, { type: i1.DateTimeToCaptionPipe }, { type: i1.LogService }, { type: i2.DialogService }, { type: i1.PortalService }], propDecorators: { placeholder: [{
|
|
385
|
+
type: Input
|
|
386
|
+
}], primaryCalendarType: [{
|
|
387
|
+
type: Input
|
|
388
|
+
}], formatPattern: [{
|
|
389
|
+
type: Input
|
|
390
|
+
}], value: [{
|
|
391
|
+
type: Input
|
|
392
|
+
}], timeValue: [{
|
|
393
|
+
type: Input
|
|
394
|
+
}], startRangeDate: [{
|
|
395
|
+
type: Input
|
|
396
|
+
}], endRangeDate: [{
|
|
397
|
+
type: Input
|
|
398
|
+
}], isRangePicker: [{
|
|
399
|
+
type: Input
|
|
400
|
+
}], showTime: [{
|
|
401
|
+
type: Input
|
|
402
|
+
}], showDate: [{
|
|
403
|
+
type: Input
|
|
404
|
+
}], rtl: [{
|
|
405
|
+
type: Input
|
|
406
|
+
}], deviceSize: [{
|
|
407
|
+
type: Input
|
|
408
|
+
}], isMobile: [{
|
|
409
|
+
type: Input
|
|
410
|
+
}], readonly: [{
|
|
411
|
+
type: Input
|
|
412
|
+
}], disabled: [{
|
|
413
|
+
type: Input
|
|
414
|
+
}], buttonMenuMode: [{
|
|
415
|
+
type: Input
|
|
416
|
+
}], inlineMode: [{
|
|
417
|
+
type: Input
|
|
418
|
+
}], daterangeMode: [{
|
|
419
|
+
type: Input
|
|
420
|
+
}], rangeChange: [{
|
|
421
|
+
type: Output
|
|
422
|
+
}], valueChange: [{
|
|
423
|
+
type: Output
|
|
424
|
+
}], timeComponent: [{
|
|
425
|
+
type: ViewChild,
|
|
426
|
+
args: [TimeComponent]
|
|
427
|
+
}], inputGroupComponent: [{
|
|
428
|
+
type: ViewChild,
|
|
429
|
+
args: [InputGroupComponent, { static: true }]
|
|
430
|
+
}] } });
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUdYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBRWYsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNoQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUcvQixNQUFNLE9BQU8sY0FBYztJQW9DdkIsWUFBb0IsYUFBK0I7UUFBL0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBbkNuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFFdEMsbUNBQW1DO1FBQ25DLGVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdC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QUNJLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixVQUFVLEVBQUUsY0FBYzt5QkFDN0I7d0JBQ0QsZUFBZTtxQkFDbEI7eU1BR1EsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNtQixhQUFhO3NCQUF0QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQzBCLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQmFzZUNvbXBvbmVudCxcbiAgICBCYmJUcmFuc2xhdGVQaXBlLFxuICAgIERhdGVTZXJ2aWNlLFxuICAgIGdldERhdGVTZXJ2aWNlLFxuICAgIExvZ1NlcnZpY2UsXG4gICAgUG9ydGFsU2VydmljZSxcbiAgICBCYXJzYUFwaSxcbiAgICBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgQWJicmV2YXRpb25EZXZpY2VTaXplXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGhJbmZvLCBEYXkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIERhdGV0aW1lQWRhcHRlcixcbiAgICBEaWFsb2dTZXJ2aWNlLFxuICAgIEZkRGF0ZSxcbiAgICBGZERhdGV0aW1lQWRhcHRlcixcbiAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgIFRpbWVDb21wb25lbnRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpbWVDb25maWdJMThuIHtcbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBob3VycycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VIb3Vyc0xhYmVsID0gJ0luY3JlYXNlIGhvdXJzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdob3VycycgY29sdW1uICovXG4gICAgaG91cnNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ0hvdXJzJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBob3VycycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VIb3Vyc0xhYmVsID0gJ0RlY3JlYXNlIGhvdXJzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIG1pbnV0ZXMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlTWludXRlc0xhYmVsID0gJ0luY3JlYXNlIG1pbnV0ZXMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ21pbnV0ZXMnIGNvbHVtbiAqL1xuICAgIG1pbnV0ZXNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ01pbnV0ZXMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIG1pbnV0ZXMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlTWludXRlc0xhYmVsID0gJ0RlY3JlYXNlIG1pbnV0ZXMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2Ugc2Vjb25kcycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VTZWNvbmRzTGFiZWwgPSAnSW5jcmVhc2Ugc2Vjb25kcyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnc2Vjb25kcycgY29sdW1uICovXG4gICAgc2Vjb25kc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnU2VjJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBzZWNvbmRzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZVNlY29uZHNMYWJlbCA9ICdEZWNyZWFzZSBzZWNvbmRzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIHBlcmlvZCcgYnV0dG9uICovXG4gICAgaW5jcmVhc2VQZXJpb2RMYWJlbCA9ICdJbmNyZWFzZSBwZXJpb2QnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ3BlcmlvZCcgY29sdW1uICovXG4gICAgcGVyaW9kTGFiZWwgPSAnUGVyaW9kJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIHBlcmlvZCcgYnV0dG9uICovXG4gICAgZGVjcmVhc2VQZXJpb2RMYWJlbCA9ICdEZWNyZWFzZSBwZXJpb2QnO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2JiYlRyYW5zbGF0ZTogQmJiVHJhbnNsYXRlUGlwZSkge31cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1kYXRlLXRpbWUtcGlja2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRldGltZUFkYXB0ZXIsXG4gICAgICAgICAgICB1c2VDbGFzczogRmREYXRldGltZUFkYXB0ZXJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBnZXREYXRlU2VydmljZVxuICAgICAgICB9LFxuICAgICAgICBDYWxlbmRhclNlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVUaW1lUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHByaW1hcnlDYWxlbmRhclR5cGU6ICdHcmVnb3JpYW4nIHwgJ1BlcnNpYW4nIHwgc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZvcm1hdFBhdHRlcm46IHN0cmluZztcbiAgICBASW5wdXQoKSB2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSB0aW1lVmFsdWU6IEZkRGF0ZTtcbiAgICBASW5wdXQoKSBzdGFydFJhbmdlRGF0ZTogRGF0ZTtcbiAgICBASW5wdXQoKSBlbmRSYW5nZURhdGU6IERhdGU7XG4gICAgQElucHV0KCkgaXNSYW5nZVBpY2tlcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93VGltZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93RGF0ZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBydGwgPSB0cnVlO1xuICAgIEBJbnB1dCgpIGRldmljZVNpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZTtcbiAgICBASW5wdXQoKSBpc01vYmlsZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBidXR0b25NZW51TW9kZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmxpbmVNb2RlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRhdGVyYW5nZU1vZGU6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF5OiBEYXRlOyBlbmREYXk6IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KSB0aW1lQ29tcG9uZW50OiBUaW1lQ29tcG9uZW50PEZkRGF0ZT47XG4gICAgQFZpZXdDaGlsZChJbnB1dEdyb3VwQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dEdyb3VwQ29tcG9uZW50OiBJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgIHZhbHVlQ2FwdGlvbiA9ICcnO1xuICAgIGVuZFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHN0YXJ0U2VsZWN0ZWREYXk6IERheSB8IG51bGw7XG4gICAgdmFsdWVEYXk6IERheSB8IG51bGw7XG5cbiAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF5JztcbiAgICB0b2RheUluZGV4ID0gLTE7XG4gICAgd2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRNb250aCQ6IE9ic2VydmFibGU8Q2FsZW5kYXJNb250aEluZm8+O1xuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGN1bHR1cmU6IHN0cmluZztcbiAgICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gICAgeWVhcnM6IHN0cmluZ1tdO1xuICAgIHRlbXBGb3JtbWF0ZWREYXRlID0gJyc7XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfbGFzdFZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2RhdGV0aW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEZkRGF0ZT4sXG4gICAgICAgIHByaXZhdGUgX2RhdGVUaW1lVG9DYXB0aW9uOiBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgICAgIHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy53aWR0aCQgPSBfcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRldmljZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1NjA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyMDtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1MjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhlaWdodCA9IDQyMDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgbGV0IGN1bHR1cmUgPSAnZW4tVVMnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJpbWFyeUNhbGVuZGFyVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSGlqcmlTaGFtc2knOlxuICAgICAgICAgICAgICAgIGN1bHR1cmUgPSAnZmEtSVInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VsdHVyZSA9IGN1bHR1cmU7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZSA9IG5ldyBDYWxlbmRhclNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgY3VsdHVyZSk7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZXRNb2RlKCdtb250aCcpO1xuICAgICAgICB0aGlzLndlZWtEYXlzTWluID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzTWluKCk7XG4gICAgICAgIHRoaXMud2Vla0RheXMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoJCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZCQ7XG4gICAgICAgIHRoaXMudG9kYXkgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXk7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlID0gRmREYXRlLmdldEZkRGF0ZUJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldENhcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUgPSBGZERhdGUuZ2V0RmREYXRlQnlEYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmICh0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgLy8gICBpZiAodGhpcy5zdGFydFJhbmdlRGF0ZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnN0YXJ0UmFuZ2VEYXRlKTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vICAgaWYgKHRoaXMuZW5kUmFuZ2VEYXRlKSB7XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5tb250aHMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuTW9udGhzO1xuICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcih0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyKTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQodGhpcy52YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXBDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuaW5wdXRHcm91cENvbXBvbmVudC5yZWdpc3Rlck9uQ2hhbmdlKHRoaXMub25DYXB0aW9uQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLl9nZXRGb3JtYXR0ZWREYXRlKHZhbHVlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2FwdGlvbiAhPT0gdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50Py5pbnB1dFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJhbmdlQ2hhbmdlKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIHN0YXJ0RGF5OiBlLnN0YXJ0RGF5LFxuICAgICAgICAgICAgZW5kRGF5OiBlLmVuZERheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXZpY2VTaXplID09PSAncycgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgbW9iaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3ZlciwgZGlhbG9nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkoZGF5LCBwb3BvdmVyLCBkaWFsb2cpO1xuICAgIH1cblxuICAgIG9uUG9wb3Zlck9wZW5DaGFuZ2UoaXNPcGVuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcihwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldElucHV0R3JvdXBUZXh0KGZvcm1hdHRlZERhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVtcEZvcm1tYXRlZERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRHcm91cFRleHQoJycpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRJbnB1dEdyb3VwVGV4dCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQuaW5wdXRUZXh0ID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldEZvcm1hdHRlZERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZVRvQ2FwdGlvbi50cmFuc2Zvcm0oZGF0ZSwgdGhpcy5mb3JtYXRQYXR0ZXJuLCB0aGlzLmN1bHR1cmUsIHRoaXMuc2hvd0RhdGUsIHRoaXMuc2hvd1RpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zaG93RGF0ZSA/IHRoaXMuc3RhcnRTZWxlY3RlZERheT8uZGF0ZSA/PyB0aGlzLnZhbHVlIDogbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0SG91cnModGhpcy50aW1lVmFsdWUuaG91cik7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1pbnV0ZXModGhpcy50aW1lVmFsdWUubWludXRlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0U2Vjb25kcyh0aGlzLnRpbWVWYWx1ZS5zZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLl9yYWlzVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeWVhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldENhcHRpb24odmFsdWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybWF0UGF0dGVybiA9IHRoaXMuZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdZWVlZJywgJ2pZWVlZJyk7XG4gICAgICAgIGZvcm1hdFBhdHRlcm4gPSBmb3JtYXRQYXR0ZXJuLnJlcGxhY2UoJ01NJywgJ2pNTScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdERCcsICdqREQnKTtcbiAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZSkuZm9ybWF0KGZvcm1hdFBhdHRlcm4pO1xuICAgIH1cbiAgICBwcml2YXRlIF9yYWlzVmFsdWVDaGFuZ2VkKGRhdGUsIHNldENhcHRpb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgICAgICBpZiAoc2V0Q2FwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbihkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRFbmREYXkoZGF5OiBEYXksIHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChpbmxpbmVNb2RlKSB7XG48bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgZGF0ZXJhbmdlTW9kZSA/IGRhdGVSYW5nZVRwbCA6IG1vbnRoO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxuICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgd2Vla0RheXNNaW46IHdlZWtEYXlzTWluLFxuICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgIHBvcG92ZXI6IHBvcG92ZXJcbiAgICAgICAgfVxuICAgIFwiXG4+XG48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjZGF0ZVJhbmdlVHBsPlxuICAgIDxiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5c1xuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgW21vbnRoSW5mb109XCIoc2VsZWN0ZWRNb250aCQgfCBhc3luYykhIVwiXG4gICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLXNlbGVjdGlvbi1kYXlzPlxuPC9uZy10ZW1wbGF0ZT5cbjxmZC1pbnB1dC1ncm91cFxuICAgIHBsYWNlbWVudD1cImFmdGVyXCJcbiAgICBnbHlwaD1cImNhbGVuZGFyXCJcbiAgICBnbHlwaEFyaWFMYWJlbD1cInNlbGVjdCBkYXlcIlxuICAgIGFyaWFMYWJlbGxlZEJ5PVwiZmQtaW5wdXQtZ3JvdXAtaWNvbi1sYWJlbC0yXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFidXR0b25NZW51TW9kZSB8fCBpbmxpbmVNb2RlID8gJ2luaGVyaXQnIDogJ25vbmUnXCJcbiAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIm9uT3BlblBvcG92ZXIocG9wb3ZlciwgZGlhbG9nVGVtcGxhdGUpXCJcbj5cbjwvZmQtaW5wdXQtZ3JvdXA+XG5AaWYgKGJ1dHRvbk1lbnVNb2RlKSB7XG48YnV0dG9uXG4gICAgZmQtYnV0dG9uXG4gICAgW2xhYmVsXT1cInRlbXBGb3JtbWF0ZWREYXRlIHx8IHBsYWNlaG9sZGVyXCJcbiAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmZFR5cGVdPVwidmFsdWUgPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSlcIlxuICAgIFtjbGFzcy5wbGFjZWhvbGRlci1jdXN0b21dPVwiIXZhbHVlXCJcbiAgICBjbGFzcz1cIm1lbnUtYnV0dG9uLWRhdGVwaWNrZXJcIlxuPjwvYnV0dG9uPlxufVxuXG48ZmQtcG9wb3ZlciAjcG9wb3ZlciAoaXNPcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZmQtcG9wb3Zlci1ib2R5LWZvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgZmQtYmFyIFtiYXJEZXNpZ25dPVwiJ2Zvb3RlcidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIiAjZGlhbG9nVGVtcGxhdGU+XG4gICAgPGZkLWRpYWxvZyBbZGlhbG9nQ29uZmlnXT1cImRpYWxvZ0NvbmZpZ1wiIFtkaWFsb2dSZWZdPVwiZGlhbG9nXCI+XG4gICAgICAgIDxmZC1kaWFsb2ctYm9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBtb250aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzTWluOiB3ZWVrRGF5c01pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyOiBwb3BvdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nOiBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cbiAgICAgICAgPGZkLWRpYWxvZy1mb290ZXI+XG4gICAgICAgICAgICA8Y29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQnV0dG9uczsgY29udGV4dDogeyBkaWFsb2c6IGRpYWxvZyB9XCI+PC9jb250YWluZXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWZvb3Rlcj5cbiAgICA8L2ZkLWRpYWxvZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlckJ1dHRvbnMgbGV0LWRpYWxvZz1cImRpYWxvZ1wiPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInT2snIHwgYmJiVHJhbnNsYXRlXCIgZmRUeXBlPVwiZW1waGFzaXplZFwiIChjbGljayk9XCJvbk9rKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgW2xhYmVsXT1cIidDbGVhcicgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBmZFR5cGU9XCJzdGFuZGFyZFwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKHBvcG92ZXIsIGRpYWxvZylcIlxuICAgID48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXIgW2xhYmVsXT1cIidDYW5jZWwnIHwgYmJiVHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlXG4gICAgI21vbnRoXG4gICAgbGV0LXNlbGVjdGVkTW9udGhcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LXJ0bD1cInJ0bFwiXG4gICAgbGV0LXRvZGF5PVwidG9kYXlcIlxuICAgIGxldC1zaG93RXZlbnRzPVwic2hvd0V2ZW50c1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcG9wb3Zlcj1cInBvcG92ZXJcIlxuICAgIGxldC1kaWFsb2c9XCJkaWFsb2dcIlxuPlxuICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tbGVmdC1hcnJvdycgOiAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiBmZC10aXRsZSBmZC10b29sYmFyLWl0ZW0+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdkYXknIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnbW9udGgnXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ3llYXInXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2ZkLXRvb2xiYXI+XG4gICAgfVxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgIEBzd2l0Y2ggKHNlbGVjdGlvbk1vZGUpIHsgQGNhc2UgKCdtb250aCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoczsgdHJhY2sgbW9udGg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdkYXknOyBvbk1vbnRoU2VsZWN0ZWQobW9udGgsIGkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCd5ZWFyJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3Rpb24td3JhcHBlclwiPlxuICAgICAgICAgICAgQGZvciAoeWVhciBvZiB5ZWFyczsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleC1ncm93OiAxOyB3aWR0aDogMjUlXCJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwieWVhclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25ZZWFyU2VsZWN0ZWQoeWVhcilcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZGVmYXVsdCB7XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICBAaWYgKHNob3dEYXRlKSB7XG4gICAgICAgICAgICA8YmMtY2FsZW5kYXItbW9udGhcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cInNlbGVjdGVkTW9udGgud2Vla3NDb3VudFwiXG4gICAgICAgICAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgIFt0b2RheV09XCJ0b2RheVwiXG4gICAgICAgICAgICAgICAgW2RhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInN0YXJ0U2VsZWN0ZWREYXkgPyBzdGFydFNlbGVjdGVkRGF5LmRhdGUgOiB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcbiAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQsIHBvcG92ZXIsIGRpYWxvZylcIlxuICAgICAgICAgICAgPjwvYmMtY2FsZW5kYXItbW9udGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNob3dUaW1lKSB7XG4gICAgICAgICAgICA8ZmQtdGltZVxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlyZWN0aW9uOiBsdHJcIlxuICAgICAgICAgICAgICAgIGZkQ29tcGFjdFxuICAgICAgICAgICAgICAgIFtrZWVwVHdvRGlnaXRzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheVNlY29uZHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPjwvZmQtdGltZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|