@entake/particle 18.0.5 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
- package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
- package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
- package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
- package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
- package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
- package/app/{modules → shared/components}/dialog/dialog.component.d.ts +14 -24
- package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
- package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
- package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
- package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
- package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
- package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
- package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
- package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
- package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
- package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
- package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
- package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
- package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
- package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
- package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
- package/app/shared/components/slideover/slideover.component.d.ts +35 -0
- package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
- package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
- package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
- package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
- package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
- package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
- package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
- package/app/shared/models/carousel-options.model.d.ts +21 -0
- package/app/shared/models/pagination-event.model.d.ts +8 -0
- package/app/shared/models/particle-component-text.model.d.ts +0 -24
- package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
- package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
- package/app/shared/services/base-data.service.d.ts +2 -2
- package/app/shared/services/dialog.service.d.ts +1 -1
- package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
- package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
- package/fesm2022/entake-particle.mjs +3871 -5573
- package/fesm2022/entake-particle.mjs.map +1 -1
- package/package.json +16 -25
- package/public_api.d.ts +47 -82
- package/app/modules/accordion/accordion.module.d.ts +0 -11
- package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
- package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
- package/app/modules/checkbox/checkbox.module.d.ts +0 -9
- package/app/modules/color-picker/color-picker.module.d.ts +0 -9
- package/app/modules/date-picker/date-picker.module.d.ts +0 -15
- package/app/modules/dialog/dialog.module.d.ts +0 -9
- package/app/modules/dropdown/dropdown.module.d.ts +0 -9
- package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
- package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
- package/app/modules/icons/particle-icons.module.d.ts +0 -13
- package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
- package/app/modules/input-mask/input-mask.module.d.ts +0 -8
- package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
- package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
- package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
- package/app/modules/layout/layout.module.d.ts +0 -10
- package/app/modules/loader/loader.module.d.ts +0 -8
- package/app/modules/multi-select/multi-select.module.d.ts +0 -8
- package/app/modules/notification/notification.module.d.ts +0 -8
- package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
- package/app/modules/paginator/pagination-event.model.d.ts +0 -24
- package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
- package/app/modules/popover/popover.module.d.ts +0 -9
- package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
- package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
- package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
- package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
- package/app/modules/push-container/push-container-state.model.d.ts +0 -7
- package/app/modules/push-container/push-container.component.d.ts +0 -137
- package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
- package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
- package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
- package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
- package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
- package/app/modules/slideover/slideover.component.d.ts +0 -35
- package/app/modules/slider/slider.module.d.ts +0 -9
- package/app/modules/theming/components/theming.component.d.ts +0 -43
- package/app/modules/theming/theming.module.d.ts +0 -12
- package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
- package/app/modules/tooltip/tooltip.module.d.ts +0 -8
- package/app/modules/week-picker/week-picker.module.d.ts +0 -13
- package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
- package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
- package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
- package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
- package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
- package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
- package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
- package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
- package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
- package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
- package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
- package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
- package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
- package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
- package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
- package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
- package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
- package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
- package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
- package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
- package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
- package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
- package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
- package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
- package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
- package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
- package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
- package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
- package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
- package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
- package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
- package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
- package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
- package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
- package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
- package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
- package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
- package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
- package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
- package/esm2022/app/modules/layout/layout.module.mjs +0 -33
- package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
- package/esm2022/app/modules/loader/loader.module.mjs +0 -24
- package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
- package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
- package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
- package/esm2022/app/modules/notification/notification.component.mjs +0 -122
- package/esm2022/app/modules/notification/notification.module.mjs +0 -18
- package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
- package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
- package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
- package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
- package/esm2022/app/modules/popover/popover.component.mjs +0 -352
- package/esm2022/app/modules/popover/popover.module.mjs +0 -24
- package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
- package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
- package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
- package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
- package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
- package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
- package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
- package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
- package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
- package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
- package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -209
- package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
- package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
- package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
- package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
- package/esm2022/app/modules/slider/slider.component.mjs +0 -243
- package/esm2022/app/modules/slider/slider.module.mjs +0 -26
- package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
- package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
- package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
- package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
- package/esm2022/app/modules/theming/theming.module.mjs +0 -55
- package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
- package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
- package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
- package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
- package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
- package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
- package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
- package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
- package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
- package/esm2022/app/shared/models/auditable.model.mjs +0 -2
- package/esm2022/app/shared/models/data-list.model.mjs +0 -2
- package/esm2022/app/shared/models/id.model.mjs +0 -2
- package/esm2022/app/shared/models/observable-container.mjs +0 -15
- package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
- package/esm2022/app/shared/services/base-data.service.mjs +0 -190
- package/esm2022/app/shared/services/dialog.service.mjs +0 -50
- package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
- package/esm2022/entake-particle.mjs +0 -5
- package/esm2022/public_api.mjs +0 -98
- /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
- /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
- /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +0 -0
- /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
- /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
- /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
- /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
- /package/app/{modules/theming → shared}/services/theme-change-detection.service.d.ts +0 -0
|
@@ -1,496 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
-
import { addDays, endOfMonth, isWithinInterval, subDays } from 'date-fns';
|
|
3
|
-
import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
|
|
4
|
-
import { map } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/cdk/a11y";
|
|
7
|
-
import * as i2 from "@angular/common";
|
|
8
|
-
import * as i3 from "@angular/forms";
|
|
9
|
-
import * as i4 from "../../../ordinal-number-pipe/ordinal-number.pipe";
|
|
10
|
-
/**
|
|
11
|
-
* Component that allows a user to select a date from a calendar
|
|
12
|
-
*/
|
|
13
|
-
export class CalendarComponent {
|
|
14
|
-
renderer;
|
|
15
|
-
/**
|
|
16
|
-
* The keyboard arrow keys
|
|
17
|
-
* @private
|
|
18
|
-
*/
|
|
19
|
-
static ARROW_KEYS = ['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'];
|
|
20
|
-
/**
|
|
21
|
-
* ViewChild of the calendar widget parent div element
|
|
22
|
-
*/
|
|
23
|
-
calendarWidgetDiv = null;
|
|
24
|
-
/**
|
|
25
|
-
* ViewChild of the month select element
|
|
26
|
-
*/
|
|
27
|
-
yearSelect = null;
|
|
28
|
-
/**
|
|
29
|
-
* ViewChild of the done button
|
|
30
|
-
*/
|
|
31
|
-
doneButton = null;
|
|
32
|
-
/**
|
|
33
|
-
* QueryList of the calendar date buttons for the currently selected month/year
|
|
34
|
-
*/
|
|
35
|
-
calendarDates = null;
|
|
36
|
-
/**
|
|
37
|
-
* The selected date value
|
|
38
|
-
*/
|
|
39
|
-
set value(value) {
|
|
40
|
-
let metaDateValue = null;
|
|
41
|
-
if (!!value) {
|
|
42
|
-
metaDateValue = {
|
|
43
|
-
day: value.getDay(),
|
|
44
|
-
date: value.getDate(),
|
|
45
|
-
month: value.getMonth(),
|
|
46
|
-
year: value.getFullYear(),
|
|
47
|
-
selectable: true
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
this._value.next(metaDateValue);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* The range of available dates to choose from
|
|
54
|
-
*/
|
|
55
|
-
set dateRange(dateRange) {
|
|
56
|
-
if (dateRange?.minDate > dateRange?.maxDate) {
|
|
57
|
-
throw new Error(this.text.minGreaterThenMax);
|
|
58
|
-
}
|
|
59
|
-
const { year } = this.currentDate;
|
|
60
|
-
this._validSelectionInterval.next({
|
|
61
|
-
start: dateRange?.minDate ?? new Date(year - 100, 0, 1),
|
|
62
|
-
end: dateRange?.maxDate ?? new Date(year + 50, 11, 31)
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
set text(text) {
|
|
66
|
-
if (text) {
|
|
67
|
-
this._text = text;
|
|
68
|
-
this.weekDays = [
|
|
69
|
-
text.sunday,
|
|
70
|
-
text.monday,
|
|
71
|
-
text.tuesday,
|
|
72
|
-
text.wednesday,
|
|
73
|
-
text.thursday,
|
|
74
|
-
text.friday,
|
|
75
|
-
text.saturday
|
|
76
|
-
];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
get text() {
|
|
80
|
-
return this._text;
|
|
81
|
-
}
|
|
82
|
-
showControls = true;
|
|
83
|
-
_text = {
|
|
84
|
-
selectAYear: 'Select a Year',
|
|
85
|
-
selectAMonth: 'Select a Month',
|
|
86
|
-
january: 'January',
|
|
87
|
-
february: 'February',
|
|
88
|
-
march: 'March',
|
|
89
|
-
april: 'April',
|
|
90
|
-
may: 'May',
|
|
91
|
-
june: 'June',
|
|
92
|
-
july: 'July',
|
|
93
|
-
august: 'August',
|
|
94
|
-
september: 'September',
|
|
95
|
-
october: 'October',
|
|
96
|
-
november: 'November',
|
|
97
|
-
december: 'December',
|
|
98
|
-
sundayAbbr: 'Su',
|
|
99
|
-
mondayAbbr: 'Mo',
|
|
100
|
-
tuesdayAbbr: 'Tu',
|
|
101
|
-
wednesdayAbbr: 'We',
|
|
102
|
-
thursdayAbbr: 'Th',
|
|
103
|
-
fridayAbbr: 'Fr',
|
|
104
|
-
saturdayAbbr: 'Sa',
|
|
105
|
-
sunday: 'Sunday',
|
|
106
|
-
monday: 'Monday',
|
|
107
|
-
tuesday: 'Tuesday',
|
|
108
|
-
wednesday: 'Wednesday',
|
|
109
|
-
thursday: 'Thursday',
|
|
110
|
-
friday: 'Friday',
|
|
111
|
-
saturday: 'Saturday',
|
|
112
|
-
select: 'Select',
|
|
113
|
-
the: 'the',
|
|
114
|
-
resetDateToToday: 'Reset date selection to today\'s date',
|
|
115
|
-
selectToday: 'Select Today',
|
|
116
|
-
saveDate: 'Save date selection',
|
|
117
|
-
done: 'Done',
|
|
118
|
-
minGreaterThenMax: 'Min date must be less than max date'
|
|
119
|
-
};
|
|
120
|
-
/**
|
|
121
|
-
* Event emitted on date select
|
|
122
|
-
*/
|
|
123
|
-
selected = new EventEmitter();
|
|
124
|
-
/**
|
|
125
|
-
* Event emitted on close (either through the button, escape keyup or click off of widget).
|
|
126
|
-
* Note: it is the parent component's job to actually hide the calendar, this event
|
|
127
|
-
* acts as a signal that that action should be taken
|
|
128
|
-
*/
|
|
129
|
-
closed = new EventEmitter();
|
|
130
|
-
/**
|
|
131
|
-
* The current Date broken down by day/month/year
|
|
132
|
-
*/
|
|
133
|
-
currentDate;
|
|
134
|
-
/**
|
|
135
|
-
* Array of days of the week
|
|
136
|
-
*/
|
|
137
|
-
weekDays = [
|
|
138
|
-
this.text.sunday,
|
|
139
|
-
this.text.monday,
|
|
140
|
-
this.text.tuesday,
|
|
141
|
-
this.text.wednesday,
|
|
142
|
-
this.text.thursday,
|
|
143
|
-
this.text.friday,
|
|
144
|
-
this.text.saturday
|
|
145
|
-
];
|
|
146
|
-
/**
|
|
147
|
-
* BehaviorSubject tracking the current value
|
|
148
|
-
*/
|
|
149
|
-
_value = new BehaviorSubject(null);
|
|
150
|
-
/**
|
|
151
|
-
* BehaviorSubject tracking the valid selection interval
|
|
152
|
-
*/
|
|
153
|
-
_validSelectionInterval = new BehaviorSubject(null);
|
|
154
|
-
/**
|
|
155
|
-
* BehaviorSubject tracking the currently selected month
|
|
156
|
-
*/
|
|
157
|
-
_selectedMonth = new BehaviorSubject(0);
|
|
158
|
-
/**
|
|
159
|
-
* BehaviorSubject tracking the currently selected year
|
|
160
|
-
*/
|
|
161
|
-
_selectedYear = new BehaviorSubject(1970);
|
|
162
|
-
/**
|
|
163
|
-
* The full month for the current selected month/year
|
|
164
|
-
*/
|
|
165
|
-
fullMonth$ = combineLatest([
|
|
166
|
-
this._selectedMonth,
|
|
167
|
-
this._selectedYear,
|
|
168
|
-
this._validSelectionInterval
|
|
169
|
-
]).pipe(map(([selectedMonth, selectedYear, validSelectionInterval]) => {
|
|
170
|
-
return CalendarComponent.generateMonth(selectedMonth, selectedYear, validSelectionInterval);
|
|
171
|
-
}));
|
|
172
|
-
/**
|
|
173
|
-
* The range of selectable years as an Observable
|
|
174
|
-
*/
|
|
175
|
-
validYearRange$ = this._validSelectionInterval.pipe(map(selectionInterval => {
|
|
176
|
-
if (this._selectedYear.getValue() < selectionInterval?.start?.getFullYear()) {
|
|
177
|
-
this._selectedYear.next(selectionInterval?.start?.getFullYear());
|
|
178
|
-
}
|
|
179
|
-
return CalendarComponent.generateYearRange(selectionInterval?.start?.getFullYear() ?? null, selectionInterval?.end?.getFullYear() ?? null, this.currentDate.year);
|
|
180
|
-
// check if the _selectedYear is valid in the new date range, if not update to min year of range
|
|
181
|
-
}));
|
|
182
|
-
/**
|
|
183
|
-
* Subscription for the combination of value and valid selection interval
|
|
184
|
-
* @private
|
|
185
|
-
*/
|
|
186
|
-
subscription = new Subscription();
|
|
187
|
-
/**
|
|
188
|
-
* The currently selected date
|
|
189
|
-
*/
|
|
190
|
-
selectedDate = null;
|
|
191
|
-
/**
|
|
192
|
-
* Generate a 42 element array representing the input month's days with
|
|
193
|
-
* padding from the previous/following month
|
|
194
|
-
* @param month the month to generate dates for
|
|
195
|
-
* @param year the year to generate the month for
|
|
196
|
-
* @param selectionInterval the selection interval
|
|
197
|
-
*/
|
|
198
|
-
static generateMonth(month, year, selectionInterval) {
|
|
199
|
-
if (!!selectionInterval) {
|
|
200
|
-
const beginningOfMonthDate = new Date(year, month, 1);
|
|
201
|
-
const endOfMonthDate = endOfMonth(beginningOfMonthDate);
|
|
202
|
-
const fullMonth = [];
|
|
203
|
-
let dayOfMonth = beginningOfMonthDate.getDay();
|
|
204
|
-
for (let i = 1; i <= endOfMonthDate.getDate(); i++) {
|
|
205
|
-
const dateOfMonth = new Date(year, month, i);
|
|
206
|
-
fullMonth.push({
|
|
207
|
-
day: dayOfMonth,
|
|
208
|
-
date: i,
|
|
209
|
-
month,
|
|
210
|
-
year,
|
|
211
|
-
selectable: isWithinInterval(dateOfMonth, selectionInterval)
|
|
212
|
-
});
|
|
213
|
-
dayOfMonth = dayOfMonth === 6 ? 0 : dayOfMonth + 1;
|
|
214
|
-
}
|
|
215
|
-
if (beginningOfMonthDate.getDay() > 0) {
|
|
216
|
-
const lastMonthDates = [];
|
|
217
|
-
for (let i = beginningOfMonthDate.getDay(); i > 0; i--) {
|
|
218
|
-
const subtractedDate = subDays(beginningOfMonthDate, i);
|
|
219
|
-
lastMonthDates.push({
|
|
220
|
-
day: subtractedDate.getDay(),
|
|
221
|
-
date: subtractedDate.getDate(),
|
|
222
|
-
month: subtractedDate.getMonth(),
|
|
223
|
-
year: subtractedDate.getFullYear(),
|
|
224
|
-
selectable: false
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
fullMonth.unshift(...lastMonthDates);
|
|
228
|
-
}
|
|
229
|
-
let daysToAdd = 1;
|
|
230
|
-
while (fullMonth.length < 42) {
|
|
231
|
-
const addedDate = addDays(endOfMonthDate, daysToAdd++);
|
|
232
|
-
fullMonth.push({
|
|
233
|
-
day: addedDate.getDay(),
|
|
234
|
-
date: addedDate.getDate(),
|
|
235
|
-
month: addedDate.getMonth(),
|
|
236
|
-
year: addedDate.getFullYear(),
|
|
237
|
-
selectable: false
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
return fullMonth;
|
|
241
|
-
}
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Generate an Array of numbers representing the span of years between the input
|
|
246
|
-
* @param minYear the start of the range
|
|
247
|
-
* @param maxYear the end of the range
|
|
248
|
-
* @param currentYear the current year
|
|
249
|
-
*/
|
|
250
|
-
static generateYearRange(minYear, maxYear, currentYear) {
|
|
251
|
-
let start, end;
|
|
252
|
-
if (!minYear && !!maxYear) {
|
|
253
|
-
start = maxYear = 50;
|
|
254
|
-
end = maxYear;
|
|
255
|
-
}
|
|
256
|
-
else if (!!minYear && !maxYear) {
|
|
257
|
-
start = minYear;
|
|
258
|
-
end = minYear + 50;
|
|
259
|
-
}
|
|
260
|
-
else if (!!minYear && !!maxYear) {
|
|
261
|
-
start = minYear;
|
|
262
|
-
end = maxYear;
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
start = currentYear - 100;
|
|
266
|
-
end = currentYear + 50;
|
|
267
|
-
}
|
|
268
|
-
const range = [];
|
|
269
|
-
for (let i = start; i <= end; i++) {
|
|
270
|
-
range.push(i);
|
|
271
|
-
}
|
|
272
|
-
return range;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Dependency injection site
|
|
276
|
-
* @param renderer the Angular renderer
|
|
277
|
-
*/
|
|
278
|
-
constructor(renderer) {
|
|
279
|
-
this.renderer = renderer;
|
|
280
|
-
const currentDate = new Date();
|
|
281
|
-
this.currentDate = {
|
|
282
|
-
day: currentDate.getDay(),
|
|
283
|
-
date: currentDate.getDate(),
|
|
284
|
-
month: currentDate.getMonth(),
|
|
285
|
-
year: currentDate.getFullYear(),
|
|
286
|
-
selectable: true
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Init component
|
|
291
|
-
*/
|
|
292
|
-
ngOnInit() {
|
|
293
|
-
this.subscription.add(combineLatest([this._value, this._validSelectionInterval]).subscribe(([value, validSelectionInterval]) => {
|
|
294
|
-
let selectionInterval = validSelectionInterval;
|
|
295
|
-
if (!selectionInterval) {
|
|
296
|
-
const { year } = this.currentDate;
|
|
297
|
-
selectionInterval = {
|
|
298
|
-
start: new Date(year - 100, 0, 1),
|
|
299
|
-
end: new Date(year + 50, 11, 31)
|
|
300
|
-
};
|
|
301
|
-
this.currentDate.selectable = isWithinInterval(new Date(this.currentDate.year, this.currentDate.month, this.currentDate.date), selectionInterval);
|
|
302
|
-
}
|
|
303
|
-
if (!!value) {
|
|
304
|
-
const valueDate = new Date(value.year, value.month, value.date);
|
|
305
|
-
if (isWithinInterval(valueDate, selectionInterval)) {
|
|
306
|
-
this.selectedDate = value;
|
|
307
|
-
this._selectedMonth.next(value.month);
|
|
308
|
-
this._selectedYear.next(value.year);
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
this._value.next(null);
|
|
312
|
-
this.selectedDate = null;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
this._selectedMonth.next(this.currentDate.month);
|
|
317
|
-
this._selectedYear.next(this.currentDate.year);
|
|
318
|
-
}
|
|
319
|
-
}));
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Destroy component, unsubscribe from any active subscriptions
|
|
323
|
-
*/
|
|
324
|
-
ngOnDestroy() {
|
|
325
|
-
this.subscription.unsubscribe();
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Handle window keyup events
|
|
329
|
-
* @param event the keyup KeyboardEvent
|
|
330
|
-
*/
|
|
331
|
-
onKeyUp(event) {
|
|
332
|
-
const { key } = event;
|
|
333
|
-
if (CalendarComponent.ARROW_KEYS.includes(key)) {
|
|
334
|
-
this.onArrowKeyUp(key);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Emit closed event on click if clicked outside calendar widget
|
|
339
|
-
* @param event the click MouseEvent
|
|
340
|
-
*/
|
|
341
|
-
handleClick(event) {
|
|
342
|
-
const { pageX, pageY } = event;
|
|
343
|
-
// this check is to prevent the click event from firing on keypress when focused on a button
|
|
344
|
-
if (pageX > 0 && pageY > 0) {
|
|
345
|
-
const { top, bottom, left, right } = this.calendarWidgetDiv.nativeElement.getBoundingClientRect();
|
|
346
|
-
const insideX = (pageX >= left) && (pageX <= right);
|
|
347
|
-
const insideY = (pageY >= top) && (pageY <= bottom);
|
|
348
|
-
// this check is for IE11 where option values might render outside of the calendar
|
|
349
|
-
const tagName = event.target.tagName;
|
|
350
|
-
const shouldClose = !(insideX && insideY) && tagName !== 'OPTION';
|
|
351
|
-
if (shouldClose) {
|
|
352
|
-
this.closed.emit();
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Update selected date and emit selection event
|
|
358
|
-
* @param selectedDate the selected date
|
|
359
|
-
*/
|
|
360
|
-
handleDateSelection(selectedDate) {
|
|
361
|
-
this.selectedDate = selectedDate;
|
|
362
|
-
this.selected.emit(new Date(selectedDate.year, selectedDate.month, selectedDate.date));
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Select the current date and toggle selected month/year to match
|
|
366
|
-
*/
|
|
367
|
-
selectToday() {
|
|
368
|
-
this.handleDateSelection(this.currentDate);
|
|
369
|
-
this._selectedMonth.next(this.currentDate.month);
|
|
370
|
-
this._selectedYear.next(this.currentDate.year);
|
|
371
|
-
this.doneButton.nativeElement.focus();
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Handle arrow key navigation for calendar date buttons
|
|
375
|
-
* @param key the pressed arrow key
|
|
376
|
-
* @private
|
|
377
|
-
*/
|
|
378
|
-
onArrowKeyUp(key) {
|
|
379
|
-
const { activeElement } = document;
|
|
380
|
-
if (!!activeElement) {
|
|
381
|
-
const activeDate = activeElement.getAttribute('data-date');
|
|
382
|
-
if (activeDate !== null && activeDate !== '') {
|
|
383
|
-
if (key === 'ArrowLeft') {
|
|
384
|
-
this.navigateLeft(Number.parseInt(activeDate, 10));
|
|
385
|
-
}
|
|
386
|
-
else if (key === 'ArrowRight') {
|
|
387
|
-
this.navigateRight(Number.parseInt(activeDate, 10));
|
|
388
|
-
}
|
|
389
|
-
else if (key === 'ArrowUp') {
|
|
390
|
-
this.navigateUp(Number.parseInt(activeDate, 10));
|
|
391
|
-
}
|
|
392
|
-
else if (key === 'ArrowDown') {
|
|
393
|
-
this.navigateDown(Number.parseInt(activeDate, 10));
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Attempt to focus on date indexed immediately to the left of the input date
|
|
400
|
-
* @param date the day of the month
|
|
401
|
-
* @private
|
|
402
|
-
*/
|
|
403
|
-
navigateLeft(date) {
|
|
404
|
-
if (date > 1) {
|
|
405
|
-
const calendarDates = this.calendarDates.toArray();
|
|
406
|
-
const foundIndex = calendarDates.findIndex(calendarDate => {
|
|
407
|
-
return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
|
|
408
|
-
});
|
|
409
|
-
if (foundIndex > 0) {
|
|
410
|
-
calendarDates[foundIndex - 1].nativeElement.focus();
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* Attempt to focus on date indexed immediately to the right of the input date
|
|
416
|
-
* @param date the day of the month
|
|
417
|
-
* @private
|
|
418
|
-
*/
|
|
419
|
-
navigateRight(date) {
|
|
420
|
-
const calendarDates = this.calendarDates.toArray();
|
|
421
|
-
const foundIndex = calendarDates.findIndex(calendarDate => {
|
|
422
|
-
return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
|
|
423
|
-
});
|
|
424
|
-
if ((foundIndex > -1) && (foundIndex < (calendarDates.length - 1))) {
|
|
425
|
-
calendarDates[foundIndex + 1].nativeElement.focus();
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Attempt to navigate one week in the past from the input date
|
|
430
|
-
* @param date the day of the month
|
|
431
|
-
* @private
|
|
432
|
-
*/
|
|
433
|
-
navigateUp(date) {
|
|
434
|
-
const calendarDates = this.calendarDates.toArray();
|
|
435
|
-
const foundIndex = calendarDates.findIndex(calendarDate => {
|
|
436
|
-
return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
|
|
437
|
-
});
|
|
438
|
-
if ((foundIndex > -1) && (foundIndex - 7 >= 0)) {
|
|
439
|
-
calendarDates[foundIndex - 7].nativeElement.focus();
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* Attempt to navigate one week in the future from the input date
|
|
444
|
-
* @param date the day of the month
|
|
445
|
-
* @private
|
|
446
|
-
*/
|
|
447
|
-
navigateDown(date) {
|
|
448
|
-
const calendarDates = this.calendarDates.toArray();
|
|
449
|
-
const foundIndex = calendarDates.findIndex(calendarDate => {
|
|
450
|
-
return date === Number.parseInt(calendarDate.nativeElement.getAttribute('data-date'), 10);
|
|
451
|
-
});
|
|
452
|
-
if ((foundIndex > -1) && ((foundIndex + 7) < (calendarDates.length))) {
|
|
453
|
-
calendarDates[foundIndex + 7].nativeElement.focus();
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
clear() {
|
|
457
|
-
this.selectedDate = null;
|
|
458
|
-
}
|
|
459
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CalendarComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
460
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: CalendarComponent, selector: "particle-calendar", inputs: { value: "value", dateRange: "dateRange", text: "text", showControls: "showControls" }, outputs: { selected: "selected", closed: "closed" }, host: { listeners: { "window:keyup": "onKeyUp($event)", "window:click": "handleClick($event)" } }, viewQueries: [{ propertyName: "calendarWidgetDiv", first: true, predicate: ["calendarWidgetDiv"], descendants: true }, { propertyName: "yearSelect", first: true, predicate: ["yearSelect"], descendants: true }, { propertyName: "doneButton", first: true, predicate: ["doneButton"], descendants: true }, { propertyName: "calendarDates", predicate: ["calendarDate"], descendants: true }], ngImport: i0, template: "<div #calendarWidgetDiv\r\n cdkTrapFocus\r\n cdkTrapFocusAutoCapture\r\n class=\"particle_datepicker_options\"\r\n role=\"application\">\r\n <!-- month / year select -->\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"particle_datepicker_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <div class=\"row wrap space_between\">\r\n <ng-container *ngFor=\"let dayInMonth of fullMonth$ | async\">\r\n <div [ngClass]=\"{'today': (dayInMonth.date === currentDate.date && dayInMonth.month === currentDate.month && dayInMonth.year === currentDate.year)}\"\r\n class=\"particle_datepicker_day\">\r\n <ng-container *ngIf=\"dayInMonth.selectable else disabledDate\">\r\n <button #calendarDate\r\n (click)=\"handleDateSelection(dayInMonth)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-date]=\"dayInMonth.date\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [attr.aria-label]=\"text.select + ' ' + weekDays[dayInMonth.day] + ' ' + text.the + ' ' + (dayInMonth.date | ordinalNumber)\"\r\n [ngClass]=\"{\r\n 'ok_button_color': (dayInMonth.date === selectedDate?.date && dayInMonth.month === selectedDate?.month && dayInMonth.year === selectedDate?.year),\r\n 'bg_overlay_rev brdr hov_bg': (dayInMonth.date !== selectedDate?.date || dayInMonth.month !== selectedDate?.month || dayInMonth.year !== selectedDate?.year)\r\n }\"\r\n class=\"access day_button\">\r\n {{dayInMonth.date}}\r\n </button>\r\n </ng-container>\r\n <ng-template #disabledDate>\r\n <div class=\"day_disabled\">\r\n {{dayInMonth.date}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showControls\">\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"(currentDate.date === selectedDate?.date && currentDate.month === selectedDate?.month && currentDate.year === selectedDate?.year) else selectTodayButton\"\r\n disabled\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n <ng-template #selectTodayButton>\r\n <button (keyup.escape)=\"closed.emit()\"\r\n (click)=\"selectToday()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button #doneButton\r\n (keyup.escape)=\"closed.emit()\"\r\n (click)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.saveDate\">\r\n <i class=\"fas fa-check mar_right5\"></i><span class=\"text bold\">{{text.done}}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".particle_datepicker_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);width:300px}.particle_datepicker_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.particle_datepicker_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent}.particle_datepicker_day.today{background-color:#8080801a}.particle_datepicker_day .day_button{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;display:flex;flex:1;width:100%;align-items:center;justify-content:center;padding:0;border-radius:3px}.particle_datepicker_day .day_disabled{opacity:.3;display:flex;flex:1;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.OrdinalNumberPipe, name: "ordinalNumber" }] });
|
|
461
|
-
}
|
|
462
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CalendarComponent, decorators: [{
|
|
463
|
-
type: Component,
|
|
464
|
-
args: [{ selector: 'particle-calendar', template: "<div #calendarWidgetDiv\r\n cdkTrapFocus\r\n cdkTrapFocusAutoCapture\r\n class=\"particle_datepicker_options\"\r\n role=\"application\">\r\n <!-- month / year select -->\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectAMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"particle_datepicker_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"particle_datepicker_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <div class=\"row wrap space_between\">\r\n <ng-container *ngFor=\"let dayInMonth of fullMonth$ | async\">\r\n <div [ngClass]=\"{'today': (dayInMonth.date === currentDate.date && dayInMonth.month === currentDate.month && dayInMonth.year === currentDate.year)}\"\r\n class=\"particle_datepicker_day\">\r\n <ng-container *ngIf=\"dayInMonth.selectable else disabledDate\">\r\n <button #calendarDate\r\n (click)=\"handleDateSelection(dayInMonth)\"\r\n (keyup.escape)=\"closed.emit()\"\r\n [attr.data-date]=\"dayInMonth.date\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [attr.aria-label]=\"text.select + ' ' + weekDays[dayInMonth.day] + ' ' + text.the + ' ' + (dayInMonth.date | ordinalNumber)\"\r\n [ngClass]=\"{\r\n 'ok_button_color': (dayInMonth.date === selectedDate?.date && dayInMonth.month === selectedDate?.month && dayInMonth.year === selectedDate?.year),\r\n 'bg_overlay_rev brdr hov_bg': (dayInMonth.date !== selectedDate?.date || dayInMonth.month !== selectedDate?.month || dayInMonth.year !== selectedDate?.year)\r\n }\"\r\n class=\"access day_button\">\r\n {{dayInMonth.date}}\r\n </button>\r\n </ng-container>\r\n <ng-template #disabledDate>\r\n <div class=\"day_disabled\">\r\n {{dayInMonth.date}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showControls\">\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"(currentDate.date === selectedDate?.date && currentDate.month === selectedDate?.month && currentDate.year === selectedDate?.year) else selectTodayButton\"\r\n disabled\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n <ng-template #selectTodayButton>\r\n <button (keyup.escape)=\"closed.emit()\"\r\n (click)=\"selectToday()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetDateToToday\">\r\n <span class=\"text bold\">{{text.selectToday}}</span>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button #doneButton\r\n (keyup.escape)=\"closed.emit()\"\r\n (click)=\"closed.emit()\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.saveDate\">\r\n <i class=\"fas fa-check mar_right5\"></i><span class=\"text bold\">{{text.done}}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".particle_datepicker_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);width:300px}.particle_datepicker_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.particle_datepicker_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent}.particle_datepicker_day.today{background-color:#8080801a}.particle_datepicker_day .day_button{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;display:flex;flex:1;width:100%;align-items:center;justify-content:center;padding:0;border-radius:3px}.particle_datepicker_day .day_disabled{opacity:.3;display:flex;flex:1;align-items:center;justify-content:center}\n"] }]
|
|
465
|
-
}], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { calendarWidgetDiv: [{
|
|
466
|
-
type: ViewChild,
|
|
467
|
-
args: ['calendarWidgetDiv']
|
|
468
|
-
}], yearSelect: [{
|
|
469
|
-
type: ViewChild,
|
|
470
|
-
args: ['yearSelect']
|
|
471
|
-
}], doneButton: [{
|
|
472
|
-
type: ViewChild,
|
|
473
|
-
args: ['doneButton']
|
|
474
|
-
}], calendarDates: [{
|
|
475
|
-
type: ViewChildren,
|
|
476
|
-
args: ['calendarDate']
|
|
477
|
-
}], value: [{
|
|
478
|
-
type: Input
|
|
479
|
-
}], dateRange: [{
|
|
480
|
-
type: Input
|
|
481
|
-
}], text: [{
|
|
482
|
-
type: Input
|
|
483
|
-
}], showControls: [{
|
|
484
|
-
type: Input
|
|
485
|
-
}], selected: [{
|
|
486
|
-
type: Output
|
|
487
|
-
}], closed: [{
|
|
488
|
-
type: Output
|
|
489
|
-
}], onKeyUp: [{
|
|
490
|
-
type: HostListener,
|
|
491
|
-
args: ['window:keyup', ['$event']]
|
|
492
|
-
}], handleClick: [{
|
|
493
|
-
type: HostListener,
|
|
494
|
-
args: ['window:click', ['$event']]
|
|
495
|
-
}] } });
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2RhdGUtcGlja2VyL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2RhdGUtcGlja2VyL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBMkNyQzs7R0FFRztBQU1ILE1BQU0sT0FBTyxpQkFBaUI7SUF1VVI7SUFyVXBCOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxVQUFVLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV6Rjs7T0FFRztJQUVILGlCQUFpQixHQUErQixJQUFXLENBQUM7SUFFNUQ7O09BRUc7SUFFSCxVQUFVLEdBQWtDLElBQVcsQ0FBQztJQUV4RDs7T0FFRztJQUVILFVBQVUsR0FBa0MsSUFBVyxDQUFDO0lBRXhEOztPQUVHO0lBRUgsYUFBYSxHQUE2QyxJQUFXLENBQUM7SUFFdEU7O09BRUc7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUFXO1FBQ25CLElBQUksYUFBYSxHQUFhLElBQVcsQ0FBQTtRQUV6QyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLGFBQWEsR0FBRztnQkFDZCxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDbkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUN2QixJQUFJLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDekIsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLFNBQVMsQ0FBQyxTQUEyQztRQUN2RCxJQUFJLFNBQVMsRUFBRSxPQUFPLEdBQUcsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1lBQ2hDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDdkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQ0ksSUFBSSxDQUFDLElBQWtCO1FBQ3pCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHO2dCQUNkLElBQUksQ0FBQyxNQUFNO2dCQUNYLElBQUksQ0FBQyxNQUFNO2dCQUNYLElBQUksQ0FBQyxPQUFPO2dCQUNaLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxRQUFRO2dCQUNiLElBQUksQ0FBQyxNQUFNO2dCQUNYLElBQUksQ0FBQyxRQUFRO2FBQ2QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFHRCxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRVosS0FBSyxHQUFpQjtRQUM1QixXQUFXLEVBQUUsZUFBZTtRQUM1QixZQUFZLEVBQUUsZ0JBQWdCO1FBQzlCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsS0FBSyxFQUFFLE9BQU87UUFDZCxHQUFHLEVBQUUsS0FBSztRQUNWLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsUUFBUTtRQUNoQixTQUFTLEVBQUUsV0FBVztRQUN0QixPQUFPLEVBQUUsU0FBUztRQUNsQixRQUFRLEVBQUUsVUFBVTtRQUNwQixRQUFRLEVBQUUsVUFBVTtRQUNwQixVQUFVLEVBQUUsSUFBSTtRQUNoQixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixhQUFhLEVBQUUsSUFBSTtRQUNuQixZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsSUFBSTtRQUNoQixZQUFZLEVBQUUsSUFBSTtRQUNsQixNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsUUFBUTtRQUNoQixPQUFPLEVBQUUsU0FBUztRQUNsQixTQUFTLEVBQUUsV0FBVztRQUN0QixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsUUFBUTtRQUNoQixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsUUFBUTtRQUNoQixHQUFHLEVBQUUsS0FBSztRQUNWLGdCQUFnQixFQUFFLHVDQUF1QztRQUN6RCxXQUFXLEVBQUUsY0FBYztRQUMzQixRQUFRLEVBQUUscUJBQXFCO1FBQy9CLElBQUksRUFBRSxNQUFNO1FBQ1osaUJBQWlCLEVBQUUscUNBQXFDO0tBQ3pDLENBQUM7SUFFbEI7O09BRUc7SUFFSCxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVwQzs7OztPQUlHO0lBRUgsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFbEM7O09BRUc7SUFDTSxXQUFXLENBQVc7SUFFL0I7O09BRUc7SUFDSCxRQUFRLEdBQUc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7S0FDbkIsQ0FBQztJQUVGOztPQUVHO0lBQ00sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFXLElBQVcsQ0FBQyxDQUFDO0lBRTdEOztPQUVHO0lBQ00sdUJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQVcsSUFBVyxDQUFDLENBQUM7SUFFOUU7O09BRUc7SUFDTSxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakQ7O09BRUc7SUFDTSxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkQ7O09BRUc7SUFDTSxVQUFVLEdBQWdDLGFBQWEsQ0FBQztRQUMvRCxJQUFJLENBQUMsY0FBYztRQUNuQixJQUFJLENBQUMsYUFBYTtRQUNsQixJQUFJLENBQUMsdUJBQXVCO0tBQzdCLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixDQUFDLEVBQUUsRUFBRTtRQUM1RCxPQUFPLGlCQUFpQixDQUFDLGFBQWEsQ0FDcEMsYUFBYSxFQUNiLFlBQVksRUFDWixzQkFBc0IsQ0FDdkIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFFRjs7T0FFRztJQUNNLGVBQWUsR0FBOEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FDckYsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFFdEIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxHQUFJLGlCQUFpQixFQUFFLEtBQWMsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3BGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLGlCQUFpQixFQUFFLEtBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLGlCQUFpQixDQUN2QyxpQkFBaUIsRUFBRSxLQUFjLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxFQUN4RCxpQkFBaUIsRUFBRSxHQUFZLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxFQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdEIsQ0FBQztRQUVGLGdHQUFnRztJQUNsRyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBRUY7OztPQUdHO0lBQ2MsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFbkQ7O09BRUc7SUFDSCxZQUFZLEdBQW9CLElBQUksQ0FBQztJQUVyQzs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMsYUFBYSxDQUMxQixLQUFhLEVBQ2IsSUFBWSxFQUNaLGlCQUEyQjtRQUUzQixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUV4RCxNQUFNLFNBQVMsR0FBb0IsRUFBRSxDQUFDO1lBQ3RDLElBQUksVUFBVSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDYixHQUFHLEVBQUUsVUFBVTtvQkFDZixJQUFJLEVBQUUsQ0FBQztvQkFDUCxLQUFLO29CQUNMLElBQUk7b0JBQ0osVUFBVSxFQUFFLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztpQkFDN0QsQ0FBQyxDQUFDO2dCQUVILFVBQVUsR0FBRyxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sY0FBYyxHQUFvQixFQUFFLENBQUM7Z0JBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELGNBQWMsQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLEdBQUcsRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFO3dCQUM1QixJQUFJLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRTt3QkFDOUIsS0FBSyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUU7d0JBQ2hDLElBQUksRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFO3dCQUNsQyxVQUFVLEVBQUUsS0FBSztxQkFDbEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFFRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsT0FBTyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZCLElBQUksRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFO29CQUN6QixLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRTtvQkFDM0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUU7b0JBQzdCLFVBQVUsRUFBRSxLQUFLO2lCQUNsQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sSUFBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsT0FBZSxFQUFFLFdBQW1CO1FBQ3BGLElBQUksS0FBYSxFQUFFLEdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixLQUFLLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNyQixHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLENBQUM7YUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1lBQ2hCLEdBQUcsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7YUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLEtBQUssR0FBRyxPQUFPLENBQUM7WUFDaEIsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQzFCLEdBQUcsR0FBRyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBa0IsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFvQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixHQUFHLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUN6QixJQUFJLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUMzQixLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtZQUM3QixJQUFJLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUMvQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNuQixhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNwRSxDQUFDLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO1lBRS9DLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN2QixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDaEMsaUJBQWlCLEdBQUc7b0JBQ2xCLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2pDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7aUJBQ2pDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQzVDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQzlFLGlCQUFpQixDQUNsQixDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNaLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7b0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBVyxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBVyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBRUgsT0FBTyxDQUFDLEtBQW9CO1FBQzFCLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUVILFdBQVcsQ0FBQyxLQUFpQjtRQUMzQixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztRQUU3Qiw0RkFBNEY7UUFDNUYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBRWhHLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDO1lBRXBELGtGQUFrRjtZQUNsRixNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQUM7WUFDdEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxPQUFPLEtBQUssUUFBUSxDQUFDO1lBRWxFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsWUFBc0I7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxHQUFXO1FBQzlCLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFFbkMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUUzRCxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO3FCQUFNLElBQUksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7cUJBQU0sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztxQkFBTSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxJQUFZO1FBQy9CLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN4RCxPQUFPLElBQUksS0FBSyxNQUFNLENBQUMsUUFBUSxDQUM3QixZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQVcsRUFDOUQsRUFBRSxDQUNILENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQixhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLElBQVk7UUFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3hELE9BQU8sSUFBSSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQzdCLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBVyxFQUM5RCxFQUFFLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkUsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVSxDQUFDLElBQVk7UUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3hELE9BQU8sSUFBSSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQzdCLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBVyxFQUM5RCxFQUFFLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxJQUFZO1FBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN4RCxPQUFPLElBQUksS0FBSyxNQUFNLENBQUMsUUFBUSxDQUM3QixZQUFZLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQVcsRUFDOUQsRUFBRSxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO3VHQW5pQlUsaUJBQWlCOzJGQUFqQixpQkFBaUIsa3JCQ25FOUIsb3FNQXVIQTs7MkZEcERhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxtQkFBbUI7OEVBZ0I3QixpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsbUJBQW1CO2dCQU85QixVQUFVO3NCQURULFNBQVM7dUJBQUMsWUFBWTtnQkFPdkIsVUFBVTtzQkFEVCxTQUFTO3VCQUFDLFlBQVk7Z0JBT3ZCLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxjQUFjO2dCQU94QixLQUFLO3NCQURSLEtBQUs7Z0JBcUJGLFNBQVM7c0JBRFosS0FBSztnQkFjRixJQUFJO3NCQURQLEtBQUs7Z0JBcUJOLFlBQVk7c0JBRFgsS0FBSztnQkE2Q04sUUFBUTtzQkFEUCxNQUFNO2dCQVNQLE1BQU07c0JBREwsTUFBTTtnQkEwUFAsT0FBTztzQkFETixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFjeEMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgYWRkRGF5cywgZW5kT2ZNb250aCwgaXNXaXRoaW5JbnRlcnZhbCwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0NhbGVuZGFyVGV4dH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIGRhdGUgaW50ZXJ2YWxcclxuICovXHJcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJbnRlcnZhbCB7XHJcbiAgc3RhcnQ6IERhdGUgfCBudW1iZXI7XHJcbiAgZW5kOiBEYXRlIHwgbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIERhdGUgYnJva2VuIGRvd24gYnkgZGF0ZS9tb250aC95ZWFyXHJcbiAqIHdpdGggZXh0ZW5kZWQgbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFEYXRlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgd2VlayAoc3RhcnRpbmcgYXQgMClcclxuICAgKi9cclxuICBkYXk6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgZGF0ZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbW9udGggKHN0YXJ0aW5nIGF0IDApXHJcbiAgICovXHJcbiAgbW9udGg6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZ1bGwgeWVhclxyXG4gICAqL1xyXG4gIHllYXI6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZGF5IGlzIHNlbGVjdGFibGVcclxuICAgKi9cclxuICBzZWxlY3RhYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50IHRoYXQgYWxsb3dzIGEgdXNlciB0byBzZWxlY3QgYSBkYXRlIGZyb20gYSBjYWxlbmRhclxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwYXJ0aWNsZS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUga2V5Ym9hcmQgYXJyb3cga2V5c1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVJST1dfS0VZUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBjYWxlbmRhciB3aWRnZXQgcGFyZW50IGRpdiBlbGVtZW50XHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJXaWRnZXREaXYnKVxyXG4gIGNhbGVuZGFyV2lkZ2V0RGl2OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIG1vbnRoIHNlbGVjdCBlbGVtZW50XHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgneWVhclNlbGVjdCcpXHJcbiAgeWVhclNlbGVjdDogRWxlbWVudFJlZjxIVE1MU2VsZWN0RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkb25lIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RvbmVCdXR0b24nKVxyXG4gIGRvbmVCdXR0b246IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5TGlzdCBvZiB0aGUgY2FsZW5kYXIgZGF0ZSBidXR0b25zIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1vbnRoL3llYXJcclxuICAgKi9cclxuICBAVmlld0NoaWxkcmVuKCdjYWxlbmRhckRhdGUnKVxyXG4gIGNhbGVuZGFyRGF0ZXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNlbGVjdGVkIGRhdGUgdmFsdWVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSkge1xyXG4gICAgbGV0IG1ldGFEYXRlVmFsdWU6IE1ldGFEYXRlID0gbnVsbCBhcyBhbnlcclxuXHJcbiAgICBpZiAoISF2YWx1ZSkge1xyXG4gICAgICBtZXRhRGF0ZVZhbHVlID0ge1xyXG4gICAgICAgIGRheTogdmFsdWUuZ2V0RGF5KCksXHJcbiAgICAgICAgZGF0ZTogdmFsdWUuZ2V0RGF0ZSgpLFxyXG4gICAgICAgIG1vbnRoOiB2YWx1ZS5nZXRNb250aCgpLFxyXG4gICAgICAgIHllYXI6IHZhbHVlLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3ZhbHVlLm5leHQobWV0YURhdGVWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmFuZ2Ugb2YgYXZhaWxhYmxlIGRhdGVzIHRvIGNob29zZSBmcm9tXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGF0ZVJhbmdlKGRhdGVSYW5nZTogeyBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlIH0pIHtcclxuICAgIGlmIChkYXRlUmFuZ2U/Lm1pbkRhdGUgPiBkYXRlUmFuZ2U/Lm1heERhdGUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudGV4dC5taW5HcmVhdGVyVGhlbk1heCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge3llYXJ9ID0gdGhpcy5jdXJyZW50RGF0ZTtcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWwubmV4dCh7XHJcbiAgICAgIHN0YXJ0OiBkYXRlUmFuZ2U/Lm1pbkRhdGUgPz8gbmV3IERhdGUoeWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgIGVuZDogZGF0ZVJhbmdlPy5tYXhEYXRlID8/IG5ldyBEYXRlKHllYXIgKyA1MCwgMTEsIDMxKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCB0ZXh0KHRleHQ6IENhbGVuZGFyVGV4dCkge1xyXG4gICAgaWYgKHRleHQpIHtcclxuICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7XHJcbiAgICAgIHRoaXMud2Vla0RheXMgPSBbXHJcbiAgICAgICAgdGV4dC5zdW5kYXksXHJcbiAgICAgICAgdGV4dC5tb25kYXksXHJcbiAgICAgICAgdGV4dC50dWVzZGF5LFxyXG4gICAgICAgIHRleHQud2VkbmVzZGF5LFxyXG4gICAgICAgIHRleHQudGh1cnNkYXksXHJcbiAgICAgICAgdGV4dC5mcmlkYXksXHJcbiAgICAgICAgdGV4dC5zYXR1cmRheVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRleHQoKTogQ2FsZW5kYXJUZXh0IHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzaG93Q29udHJvbHMgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF90ZXh0OiBDYWxlbmRhclRleHQgPSB7XHJcbiAgICBzZWxlY3RBWWVhcjogJ1NlbGVjdCBhIFllYXInLFxyXG4gICAgc2VsZWN0QU1vbnRoOiAnU2VsZWN0IGEgTW9udGgnLFxyXG4gICAgamFudWFyeTogJ0phbnVhcnknLFxyXG4gICAgZmVicnVhcnk6ICdGZWJydWFyeScsXHJcbiAgICBtYXJjaDogJ01hcmNoJyxcclxuICAgIGFwcmlsOiAnQXByaWwnLFxyXG4gICAgbWF5OiAnTWF5JyxcclxuICAgIGp1bmU6ICdKdW5lJyxcclxuICAgIGp1bHk6ICdKdWx5JyxcclxuICAgIGF1Z3VzdDogJ0F1Z3VzdCcsXHJcbiAgICBzZXB0ZW1iZXI6ICdTZXB0ZW1iZXInLFxyXG4gICAgb2N0b2JlcjogJ09jdG9iZXInLFxyXG4gICAgbm92ZW1iZXI6ICdOb3ZlbWJlcicsXHJcbiAgICBkZWNlbWJlcjogJ0RlY2VtYmVyJyxcclxuICAgIHN1bmRheUFiYnI6ICdTdScsXHJcbiAgICBtb25kYXlBYmJyOiAnTW8nLFxyXG4gICAgdHVlc2RheUFiYnI6ICdUdScsXHJcbiAgICB3ZWRuZXNkYXlBYmJyOiAnV2UnLFxyXG4gICAgdGh1cnNkYXlBYmJyOiAnVGgnLFxyXG4gICAgZnJpZGF5QWJicjogJ0ZyJyxcclxuICAgIHNhdHVyZGF5QWJicjogJ1NhJyxcclxuICAgIHN1bmRheTogJ1N1bmRheScsXHJcbiAgICBtb25kYXk6ICdNb25kYXknLFxyXG4gICAgdHVlc2RheTogJ1R1ZXNkYXknLFxyXG4gICAgd2VkbmVzZGF5OiAnV2VkbmVzZGF5JyxcclxuICAgIHRodXJzZGF5OiAnVGh1cnNkYXknLFxyXG4gICAgZnJpZGF5OiAnRnJpZGF5JyxcclxuICAgIHNhdHVyZGF5OiAnU2F0dXJkYXknLFxyXG4gICAgc2VsZWN0OiAnU2VsZWN0JyxcclxuICAgIHRoZTogJ3RoZScsXHJcbiAgICByZXNldERhdGVUb1RvZGF5OiAnUmVzZXQgZGF0ZSBzZWxlY3Rpb24gdG8gdG9kYXlcXCdzIGRhdGUnLFxyXG4gICAgc2VsZWN0VG9kYXk6ICdTZWxlY3QgVG9kYXknLFxyXG4gICAgc2F2ZURhdGU6ICdTYXZlIGRhdGUgc2VsZWN0aW9uJyxcclxuICAgIGRvbmU6ICdEb25lJyxcclxuICAgIG1pbkdyZWF0ZXJUaGVuTWF4OiAnTWluIGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGRhdGUnXHJcbiAgfSBhcyBDYWxlbmRhclRleHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3RcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiBjbG9zZSAoZWl0aGVyIHRocm91Z2ggdGhlIGJ1dHRvbiwgZXNjYXBlIGtleXVwIG9yIGNsaWNrIG9mZiBvZiB3aWRnZXQpLlxyXG4gICAqIE5vdGU6IGl0IGlzIHRoZSBwYXJlbnQgY29tcG9uZW50J3Mgam9iIHRvIGFjdHVhbGx5IGhpZGUgdGhlIGNhbGVuZGFyLCB0aGlzIGV2ZW50XHJcbiAgICogICAgICAgYWN0cyBhcyBhIHNpZ25hbCB0aGF0IHRoYXQgYWN0aW9uIHNob3VsZCBiZSB0YWtlblxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgRGF0ZSBicm9rZW4gZG93biBieSBkYXkvbW9udGgveWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlOiBNZXRhRGF0ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgb2YgZGF5cyBvZiB0aGUgd2Vla1xyXG4gICAqL1xyXG4gIHdlZWtEYXlzID0gW1xyXG4gICAgdGhpcy50ZXh0LnN1bmRheSxcclxuICAgIHRoaXMudGV4dC5tb25kYXksXHJcbiAgICB0aGlzLnRleHQudHVlc2RheSxcclxuICAgIHRoaXMudGV4dC53ZWRuZXNkYXksXHJcbiAgICB0aGlzLnRleHQudGh1cnNkYXksXHJcbiAgICB0aGlzLnRleHQuZnJpZGF5LFxyXG4gICAgdGhpcy50ZXh0LnNhdHVyZGF5XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50IHZhbHVlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX3ZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhRGF0ZT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHZhbGlkIHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF92YWxpZFNlbGVjdGlvbkludGVydmFsID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb250aFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZE1vbnRoID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgeWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZFllYXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDE5NzApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZnVsbCBtb250aCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbW9udGgveWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGZ1bGxNb250aCQ6IE9ic2VydmFibGU8QXJyYXk8TWV0YURhdGU+PiA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aCxcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhcixcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbc2VsZWN0ZWRNb250aCwgc2VsZWN0ZWRZZWFyLCB2YWxpZFNlbGVjdGlvbkludGVydmFsXSkgPT4ge1xyXG4gICAgICByZXR1cm4gQ2FsZW5kYXJDb21wb25lbnQuZ2VuZXJhdGVNb250aChcclxuICAgICAgICBzZWxlY3RlZE1vbnRoLFxyXG4gICAgICAgIHNlbGVjdGVkWWVhcixcclxuICAgICAgICB2YWxpZFNlbGVjdGlvbkludGVydmFsXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByYW5nZSBvZiBzZWxlY3RhYmxlIHllYXJzIGFzIGFuIE9ic2VydmFibGVcclxuICAgKi9cclxuICByZWFkb25seSB2YWxpZFllYXJSYW5nZSQ6IE9ic2VydmFibGU8QXJyYXk8bnVtYmVyPj4gPSB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLnBpcGUoXHJcbiAgICBtYXAoc2VsZWN0aW9uSW50ZXJ2YWwgPT4ge1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkWWVhci5nZXRWYWx1ZSgpIDwgKHNlbGVjdGlvbkludGVydmFsPy5zdGFydCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSkge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQoKHNlbGVjdGlvbkludGVydmFsPy5zdGFydCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIENhbGVuZGFyQ29tcG9uZW50LmdlbmVyYXRlWWVhclJhbmdlKFxyXG4gICAgICAgIChzZWxlY3Rpb25JbnRlcnZhbD8uc3RhcnQgYXMgRGF0ZSk/LmdldEZ1bGxZZWFyKCkgPz8gbnVsbCxcclxuICAgICAgICAoc2VsZWN0aW9uSW50ZXJ2YWw/LmVuZCBhcyBEYXRlKT8uZ2V0RnVsbFllYXIoKSA/PyBudWxsLFxyXG4gICAgICAgIHRoaXMuY3VycmVudERhdGUueWVhclxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIF9zZWxlY3RlZFllYXIgaXMgdmFsaWQgaW4gdGhlIG5ldyBkYXRlIHJhbmdlLCBpZiBub3QgdXBkYXRlIHRvIG1pbiB5ZWFyIG9mIHJhbmdlXHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmlwdGlvbiBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIHZhbHVlIGFuZCB2YWxpZCBzZWxlY3Rpb24gaW50ZXJ2YWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGVcclxuICAgKi9cclxuICBzZWxlY3RlZERhdGU6IE1ldGFEYXRlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgNDIgZWxlbWVudCBhcnJheSByZXByZXNlbnRpbmcgdGhlIGlucHV0IG1vbnRoJ3MgZGF5cyB3aXRoXHJcbiAgICogcGFkZGluZyBmcm9tIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbW9udGhcclxuICAgKiBAcGFyYW0gbW9udGggdGhlIG1vbnRoIHRvIGdlbmVyYXRlIGRhdGVzIGZvclxyXG4gICAqIEBwYXJhbSB5ZWFyIHRoZSB5ZWFyIHRvIGdlbmVyYXRlIHRoZSBtb250aCBmb3JcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uSW50ZXJ2YWwgdGhlIHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlTW9udGgoXHJcbiAgICBtb250aDogbnVtYmVyLFxyXG4gICAgeWVhcjogbnVtYmVyLFxyXG4gICAgc2VsZWN0aW9uSW50ZXJ2YWw6IEludGVydmFsXHJcbiAgKTogQXJyYXk8TWV0YURhdGU+IHtcclxuICAgIGlmICghIXNlbGVjdGlvbkludGVydmFsKSB7XHJcbiAgICAgIGNvbnN0IGJlZ2lubmluZ09mTW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgICBjb25zdCBlbmRPZk1vbnRoRGF0ZSA9IGVuZE9mTW9udGgoYmVnaW5uaW5nT2ZNb250aERhdGUpO1xyXG5cclxuICAgICAgY29uc3QgZnVsbE1vbnRoOiBBcnJheTxNZXRhRGF0ZT4gPSBbXTtcclxuICAgICAgbGV0IGRheU9mTW9udGggPSBiZWdpbm5pbmdPZk1vbnRoRGF0ZS5nZXREYXkoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZW5kT2ZNb250aERhdGUuZ2V0RGF0ZSgpOyBpKyspIHtcclxuICAgICAgICBjb25zdCBkYXRlT2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKTtcclxuICAgICAgICBmdWxsTW9udGgucHVzaCh7XHJcbiAgICAgICAgICBkYXk6IGRheU9mTW9udGgsXHJcbiAgICAgICAgICBkYXRlOiBpLFxyXG4gICAgICAgICAgbW9udGgsXHJcbiAgICAgICAgICB5ZWFyLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogaXNXaXRoaW5JbnRlcnZhbChkYXRlT2ZNb250aCwgc2VsZWN0aW9uSW50ZXJ2YWwpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRheU9mTW9udGggPSBkYXlPZk1vbnRoID09PSA2ID8gMCA6IGRheU9mTW9udGggKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYmVnaW5uaW5nT2ZNb250aERhdGUuZ2V0RGF5KCkgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdE1vbnRoRGF0ZXM6IEFycmF5PE1ldGFEYXRlPiA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBiZWdpbm5pbmdPZk1vbnRoRGF0ZS5nZXREYXkoKTsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgY29uc3Qgc3VidHJhY3RlZERhdGUgPSBzdWJEYXlzKGJlZ2lubmluZ09mTW9udGhEYXRlLCBpKTtcclxuICAgICAgICAgIGxhc3RNb250aERhdGVzLnB1c2goe1xyXG4gICAgICAgICAgICBkYXk6IHN1YnRyYWN0ZWREYXRlLmdldERheSgpLFxyXG4gICAgICAgICAgICBkYXRlOiBzdWJ0cmFjdGVkRGF0ZS5nZXREYXRlKCksXHJcbiAgICAgICAgICAgIG1vbnRoOiBzdWJ0cmFjdGVkRGF0ZS5nZXRNb250aCgpLFxyXG4gICAgICAgICAgICB5ZWFyOiBzdWJ0cmFjdGVkRGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdWxsTW9udGgudW5zaGlmdCguLi5sYXN0TW9udGhEYXRlcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkYXlzVG9BZGQgPSAxO1xyXG4gICAgICB3aGlsZSAoZnVsbE1vbnRoLmxlbmd0aCA8IDQyKSB7XHJcbiAgICAgICAgY29uc3QgYWRkZWREYXRlID0gYWRkRGF5cyhlbmRPZk1vbnRoRGF0ZSwgZGF5c1RvQWRkKyspO1xyXG4gICAgICAgIGZ1bGxNb250aC5wdXNoKHtcclxuICAgICAgICAgIGRheTogYWRkZWREYXRlLmdldERheSgpLFxyXG4gICAgICAgICAgZGF0ZTogYWRkZWREYXRlLmdldERhdGUoKSxcclxuICAgICAgICAgIG1vbnRoOiBhZGRlZERhdGUuZ2V0TW9udGgoKSxcclxuICAgICAgICAgIHllYXI6IGFkZGVkRGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZ1bGxNb250aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhbiBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB5ZWFycyBiZXR3ZWVuIHRoZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBtaW5ZZWFyIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcclxuICAgKiBAcGFyYW0gbWF4WWVhciB0aGUgZW5kIG9mIHRoZSByYW5nZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50WWVhciB0aGUgY3VycmVudCB5ZWFyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVZZWFyUmFuZ2UobWluWWVhcjogbnVtYmVyLCBtYXhZZWFyOiBudW1iZXIsIGN1cnJlbnRZZWFyOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcclxuICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcclxuICAgIGlmICghbWluWWVhciAmJiAhIW1heFllYXIpIHtcclxuICAgICAgc3RhcnQgPSBtYXhZZWFyID0gNTA7XHJcbiAgICAgIGVuZCA9IG1heFllYXI7XHJcbiAgICB9IGVsc2UgaWYgKCEhbWluWWVhciAmJiAhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1pblllYXIgKyA1MDtcclxuICAgIH0gZWxzZSBpZiAoISFtaW5ZZWFyICYmICEhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1heFllYXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGFydCA9IGN1cnJlbnRZZWFyIC0gMTAwO1xyXG4gICAgICBlbmQgPSBjdXJyZW50WWVhciArIDUwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhbmdlOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgcmFuZ2UucHVzaChpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIHJlbmRlcmVyIHRoZSBBbmd1bGFyIHJlbmRlcmVyXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnREYXRlID0ge1xyXG4gICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERheSgpLFxyXG4gICAgICBkYXRlOiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXHJcbiAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpLFxyXG4gICAgICB5ZWFyOiBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBzZWxlY3RhYmxlOiB0cnVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdCBjb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5fdmFsdWUsIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxdKS5zdWJzY3JpYmUoXHJcbiAgICAgIChbdmFsdWUsIHZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxdKSA9PiB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbkludGVydmFsID0gdmFsaWRTZWxlY3Rpb25JbnRlcnZhbDtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgICAgY29uc3Qge3llYXJ9ID0gdGhpcy5jdXJyZW50RGF0ZTtcclxuICAgICAgICAgIHNlbGVjdGlvbkludGVydmFsID0ge1xyXG4gICAgICAgICAgICBzdGFydDogbmV3IERhdGUoeWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgICAgICAgIGVuZDogbmV3IERhdGUoeWVhciArIDUwLCAxMSwgMzEpXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuY3VycmVudERhdGUuc2VsZWN0YWJsZSA9IGlzV2l0aGluSW50ZXJ2YWwoXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciwgdGhpcy5jdXJyZW50RGF0ZS5tb250aCwgdGhpcy5jdXJyZW50RGF0ZS5kYXRlKSxcclxuICAgICAgICAgICAgc2VsZWN0aW9uSW50ZXJ2YWxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF2YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gbmV3IERhdGUodmFsdWUueWVhciwgdmFsdWUubW9udGgsIHZhbHVlLmRhdGUpO1xyXG4gICAgICAgICAgaWYgKGlzV2l0aGluSW50ZXJ2YWwodmFsdWVEYXRlLCBzZWxlY3Rpb25JbnRlcnZhbCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHZhbHVlLm1vbnRoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodmFsdWUueWVhcik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZS5uZXh0KG51bGwgYXMgYW55KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsIGFzIGFueTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHJveSBjb21wb25lbnQsIHVuc3Vic2NyaWJlIGZyb20gYW55IGFjdGl2ZSBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHdpbmRvdyBrZXl1cCBldmVudHNcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleXVwIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtrZXl9ID0gZXZlbnQ7XHJcblxyXG4gICAgaWYgKENhbGVuZGFyQ29tcG9uZW50LkFSUk9XX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICB0aGlzLm9uQXJyb3dLZXlVcChrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdCBjbG9zZWQgZXZlbnQgb24gY2xpY2sgaWYgY2xpY2tlZCBvdXRzaWRlIGNhbGVuZGFyIHdpZGdldFxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2xpY2sgTW91c2VFdmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtwYWdlWCwgcGFnZVl9ID0gZXZlbnQ7XHJcblxyXG4gICAgLy8gdGhpcyBjaGVjayBpcyB0byBwcmV2ZW50IHRoZSBjbGljayBldmVudCBmcm9tIGZpcmluZyBvbiBrZXlwcmVzcyB3aGVuIGZvY3VzZWQgb24gYSBidXR0b25cclxuICAgIGlmIChwYWdlWCA+IDAgJiYgcGFnZVkgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9ID0gdGhpcy5jYWxlbmRhcldpZGdldERpdi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgY29uc3QgaW5zaWRlWCA9IChwYWdlWCA+PSBsZWZ0KSAmJiAocGFnZVggPD0gcmlnaHQpO1xyXG4gICAgICBjb25zdCBpbnNpZGVZID0gKHBhZ2VZID49IHRvcCkgJiYgKHBhZ2VZIDw9IGJvdHRvbSk7XHJcblxyXG4gICAgICAvLyB0aGlzIGNoZWNrIGlzIGZvciBJRTExIHdoZXJlIG9wdGlvbiB2YWx1ZXMgbWlnaHQgcmVuZGVyIG91dHNpZGUgb2YgdGhlIGNhbGVuZGFyXHJcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xyXG4gICAgICBjb25zdCBzaG91bGRDbG9zZSA9ICEoaW5zaWRlWCAmJiBpbnNpZGVZKSAmJiB0YWdOYW1lICE9PSAnT1BUSU9OJztcclxuXHJcbiAgICAgIGlmIChzaG91bGRDbG9zZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNlbGVjdGVkIGRhdGUgYW5kIGVtaXQgc2VsZWN0aW9uIGV2ZW50XHJcbiAgICogQHBhcmFtIHNlbGVjdGVkRGF0ZSB0aGUgc2VsZWN0ZWQgZGF0ZVxyXG4gICAqL1xyXG4gIGhhbmRsZURhdGVTZWxlY3Rpb24oc2VsZWN0ZWREYXRlOiBNZXRhRGF0ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzZWxlY3RlZERhdGU7XHJcbiAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3IERhdGUoc2VsZWN0ZWREYXRlLnllYXIsIHNlbGVjdGVkRGF0ZS5tb250aCwgc2VsZWN0ZWREYXRlLmRhdGUpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgY3VycmVudCBkYXRlIGFuZCB0b2dnbGUgc2VsZWN0ZWQgbW9udGgveWVhciB0byBtYXRjaFxyXG4gICAqL1xyXG4gIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlU2VsZWN0aW9uKHRoaXMuY3VycmVudERhdGUpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgIHRoaXMuZG9uZUJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgYXJyb3cga2V5IG5hdmlnYXRpb24gZm9yIGNhbGVuZGFyIGRhdGUgYnV0dG9uc1xyXG4gICAqIEBwYXJhbSBrZXkgdGhlIHByZXNzZWQgYXJyb3cga2V5XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG9uQXJyb3dLZXlVcChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSBkb2N1bWVudDtcclxuXHJcbiAgICBpZiAoISFhY3RpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZURhdGUgPSBhY3RpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XHJcblxyXG4gICAgICBpZiAoYWN0aXZlRGF0ZSAhPT0gbnVsbCAmJiBhY3RpdmVEYXRlICE9PSAnJykge1xyXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlTGVmdChOdW1iZXIucGFyc2VJbnQoYWN0aXZlRGF0ZSwgMTApKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlUmlnaHQoTnVtYmVyLnBhcnNlSW50KGFjdGl2ZURhdGUsIDEwKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZVVwKE51bWJlci5wYXJzZUludChhY3RpdmVEYXRlLCAxMCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZURvd24oTnVtYmVyLnBhcnNlSW50KGFjdGl2ZURhdGUsIDEwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIGZvY3VzIG9uIGRhdGUgaW5kZXhlZCBpbW1lZGlhdGVseSB0byB0aGUgbGVmdCBvZiB0aGUgaW5wdXQgZGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG5hdmlnYXRlTGVmdChkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChkYXRlID4gMSkge1xyXG4gICAgICBjb25zdCBjYWxlbmRhckRhdGVzID0gdGhpcy5jYWxlbmRhckRhdGVzLnRvQXJyYXkoKTtcclxuICAgICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGUgPT09IE51bWJlci5wYXJzZUludChcclxuICAgICAgICAgIGNhbGVuZGFyRGF0ZS5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJykgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgMTBcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChmb3VuZEluZGV4ID4gMCkge1xyXG4gICAgICAgIGNhbGVuZGFyRGF0ZXNbZm91bmRJbmRleCAtIDFdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR0ZW1wdCB0byBmb2N1cyBvbiBkYXRlIGluZGV4ZWQgaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBkYXRlXHJcbiAgICogQHBhcmFtIGRhdGUgdGhlIGRheSBvZiB0aGUgbW9udGhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbmF2aWdhdGVSaWdodChkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbGVuZGFyRGF0ZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXMudG9BcnJheSgpO1xyXG4gICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgIHJldHVybiBkYXRlID09PSBOdW1iZXIucGFyc2VJbnQoXHJcbiAgICAgICAgY2FsZW5kYXJEYXRlLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgMTBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgoZm91bmRJbmRleCA+IC0xKSAmJiAoZm91bmRJbmRleCA8IChjYWxlbmRhckRhdGVzLmxlbmd0aCAtIDEpKSkge1xyXG4gICAgICBjYWxlbmRhckRhdGVzW2ZvdW5kSW5kZXggKyAxXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIG5hdmlnYXRlIG9uZSB3ZWVrIGluIHRoZSBwYXN0IGZyb20gdGhlIGlucHV0IGRhdGVcclxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF5IG9mIHRoZSBtb250aFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVVwKGRhdGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgY2FsZW5kYXJEYXRlcyA9IHRoaXMuY2FsZW5kYXJEYXRlcy50b0FycmF5KCk7XHJcbiAgICBjb25zdCBmb3VuZEluZGV4ID0gY2FsZW5kYXJEYXRlcy5maW5kSW5kZXgoY2FsZW5kYXJEYXRlID0+IHtcclxuICAgICAgcmV0dXJuIGRhdGUgPT09IE51bWJlci5wYXJzZUludChcclxuICAgICAgICBjYWxlbmRhckRhdGUubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpIGFzIHN0cmluZyxcclxuICAgICAgICAxMFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKChmb3VuZEluZGV4ID4gLTEpICYmIChmb3VuZEluZGV4IC0gNyA+PSAwKSkge1xyXG4gICAgICBjYWxlbmRhckRhdGVzW2ZvdW5kSW5kZXggLSA3XS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHRlbXB0IHRvIG5hdmlnYXRlIG9uZSB3ZWVrIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgaW5wdXQgZGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIG5hdmlnYXRlRG93bihkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbGVuZGFyRGF0ZXMgPSB0aGlzLmNhbGVuZGFyRGF0ZXMudG9BcnJheSgpO1xyXG4gICAgY29uc3QgZm91bmRJbmRleCA9IGNhbGVuZGFyRGF0ZXMuZmluZEluZGV4KGNhbGVuZGFyRGF0ZSA9PiB7XHJcbiAgICAgIHJldHVybiBkYXRlID09PSBOdW1iZXIucGFyc2VJbnQoXHJcbiAgICAgICAgY2FsZW5kYXJEYXRlLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgMTBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgoZm91bmRJbmRleCA+IC0xKSAmJiAoKGZvdW5kSW5kZXggKyA3KSA8IChjYWxlbmRhckRhdGVzLmxlbmd0aCkpKSB7XHJcbiAgICAgIGNhbGVuZGFyRGF0ZXNbZm91bmRJbmRleCArIDddLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNjYWxlbmRhcldpZGdldERpdlxyXG4gICAgIGNka1RyYXBGb2N1c1xyXG4gICAgIGNka1RyYXBGb2N1c0F1dG9DYXB0dXJlXHJcbiAgICAgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX29wdGlvbnNcIlxyXG4gICAgIHJvbGU9XCJhcHBsaWNhdGlvblwiPlxyXG4gIDwhLS0gbW9udGggLyB5ZWFyIHNlbGVjdCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY29udGVudF9jb2xvciBwYWRfNSBwYWRfYm90MFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIG1hcl81XCI+XHJcbiAgICAgICAgPHNlbGVjdCAjeWVhclNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkWWVhciB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJfc2VsZWN0ZWRZZWFyLm5leHQoK3llYXJTZWxlY3QudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VkLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBpbnB1dCBzbSBjb250ZW50X2NvbG9yXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBWWVhclwiPlxyXG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB2YWxpZFllYXJSYW5nZSQgfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ5ZWFyXCI+XHJcbiAgICAgICAgICAgICAge3t5ZWFyfX1cclxuICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzIgbWFyXzVcIj5cclxuICAgICAgICA8c2VsZWN0ICNtb250aFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkTW9udGggfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl9zZWxlY3RlZE1vbnRoLm5leHQoK21vbnRoU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cImNsb3NlZC5lbWl0KClcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBpbnB1dCBzbSBjb250ZW50X2NvbG9yXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBTW9udGhcIj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+e3t0ZXh0LmphbnVhcnl9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj57e3RleHQuZmVicnVhcnl9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj57e3RleHQubWFyY2h9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjNcIj57e3RleHQuYXByaWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjRcIj57e3RleHQubWF5fX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1XCI+e3t0ZXh0Lmp1bmV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjZcIj57e3RleHQuanVseX19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiN1wiPnt7dGV4dC5hdWd1c3R9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhcIj57e3RleHQuc2VwdGVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI5XCI+e3t0ZXh0Lm9jdG9iZXJ9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwXCI+e3t0ZXh0Lm5vdmVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMVwiPnt7dGV4dC5kZWNlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnRfY29sb3IgcGFkXzVcIj5cclxuICAgIDwhLS0gd2Vla2RheXMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFyXzUgbWFyX2JvdDEwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgd3JhcCBzcGFjZV9iZXR3ZWVuIHB0bF9pbnB1dF9iZ19jb2xvciBwdGxfYnJkcl9jb2xvciBib3JkZXJfYm90dG9tIGJyYWRfMyBtYXJfYm90NVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQuc3VuZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX2RhdGVwaWNrZXJfd2Vla2RheVwiPnt7dGV4dC5tb25kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LnR1ZXNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LndlZG5lc2RheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQudGh1cnNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl93ZWVrZGF5XCI+e3t0ZXh0LmZyaWRheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9kYXRlcGlja2VyX3dlZWtkYXlcIj57e3RleHQuc2F0dXJkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gZGF5cyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3cmFwIHNwYWNlX2JldHdlZW5cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXlJbk1vbnRoIG9mIGZ1bGxNb250aCQgfCBhc3luY1wiPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3RvZGF5JzogKGRheUluTW9udGguZGF0ZSA9PT0gY3VycmVudERhdGUuZGF0ZSAmJiBkYXlJbk1vbnRoLm1vbnRoID09PSBjdXJyZW50RGF0ZS5tb250aCAmJiBkYXlJbk1vbnRoLnllYXIgPT09IGN1cnJlbnREYXRlLnllYXIpfVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljbGVfZGF0ZXBpY2tlcl9kYXlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRheUluTW9udGguc2VsZWN0YWJsZSBlbHNlIGRpc2FibGVkRGF0ZVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gI2NhbGVuZGFyRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURhdGVTZWxlY3Rpb24oZGF5SW5Nb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJkYXlJbk1vbnRoLmRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0ICsgJyAnICsgd2Vla0RheXNbZGF5SW5Nb250aC5kYXldICsgJyAnICsgdGV4dC50aGUgKyAnICcgKyAoZGF5SW5Nb250aC5kYXRlIHwgb3JkaW5hbE51bWJlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb2tfYnV0dG9uX2NvbG9yJzogKGRheUluTW9udGguZGF0ZSA9PT0gc2VsZWN0ZWREYXRlPy5kYXRlICYmIGRheUluTW9udGgubW9udGggPT09IHNlbGVjdGVkRGF0ZT8ubW9udGggJiYgZGF5SW5Nb250aC55ZWFyID09PSBzZWxlY3RlZERhdGU/LnllYXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmdfb3ZlcmxheV9yZXYgYnJkciBob3ZfYmcnOiAoZGF5SW5Nb250aC5kYXRlICE9PSBzZWxlY3RlZERhdGU/LmRhdGUgfHwgZGF5SW5Nb250aC5tb250aCAhPT0gc2VsZWN0ZWREYXRlPy5tb250aCB8fCBkYXlJbk1vbnRoLnllYXIgIT09IHNlbGVjdGVkRGF0ZT8ueWVhcilcclxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgZGF5X2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAge3tkYXlJbk1vbnRoLmRhdGV9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZERhdGU+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheV9kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAge3tkYXlJbk1vbnRoLmRhdGV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NvbnRyb2xzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiZ19vdmVybGF5IGJyZHIgaHIgbWFyXzVcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnREYXRlLnNlbGVjdGFibGVcIj5cclxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIoY3VycmVudERhdGUuZGF0ZSA9PT0gc2VsZWN0ZWREYXRlPy5kYXRlICYmIGN1cnJlbnREYXRlLm1vbnRoID09PSBzZWxlY3RlZERhdGU/Lm1vbnRoICYmIGN1cnJlbnREYXRlLnllYXIgPT09IHNlbGVjdGVkRGF0ZT8ueWVhcikgZWxzZSBzZWxlY3RUb2RheUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIGhvdl9iZyBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5yZXNldERhdGVUb1RvZGF5XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQuc2VsZWN0VG9kYXl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdFRvZGF5QnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VkLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIGhvdl9iZyBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnJlc2V0RGF0ZVRvVG9kYXlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5zZWxlY3RUb2RheX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPGJ1dHRvbiAjZG9uZUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyXzUgaG92X2JnXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zYXZlRGF0ZVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgbWFyX3JpZ2h0NVwiPjwvaT48c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5kb25lfX08L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|