@dereekb/dbx-form 9.24.3 → 9.24.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Hapier Creative LLC.
3
+ Copyright (c) 2023 Hapier Creative LLC.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,11 +1,12 @@
1
1
  import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
- import { CalendarEvent, CalendarMonthViewBeforeRenderEvent } from 'angular-calendar';
2
+ import { CalendarEvent, CalendarMonthViewBeforeRenderEvent, CalendarMonthViewDay } from 'angular-calendar';
3
3
  import { Subject, Observable } from 'rxjs';
4
4
  import { DbxCalendarEvent, DbxCalendarStore } from '@dereekb/dbx-web/calendar';
5
5
  import { Maybe } from '@dereekb/util';
6
- import { DbxCalendarScheduleSelectionStore } from './calendar.schedule.selection.store';
6
+ import { CalendarScheduleSelectionState, DbxCalendarScheduleSelectionStore } from './calendar.schedule.selection.store';
7
+ import { CalendarScheduleSelectionMetadata } from './calendar.schedule.selection';
7
8
  import { DbxInjectionComponentConfig } from '@dereekb/dbx-core';
8
- import { ObservableOrValueGetter } from '@dereekb/rxjs';
9
+ import { ObservableOrValue, ObservableOrValueGetter } from '@dereekb/rxjs';
9
10
  import * as i0 from "@angular/core";
10
11
  export interface DbxScheduleSelectionCalendarComponentConfig {
11
12
  /**
@@ -16,7 +17,19 @@ export interface DbxScheduleSelectionCalendarComponentConfig {
16
17
  * Configuration for displaying a custom selection button. When null/undefined/true is passed, will show the default DbxScheduleSelectionCalendarDatePopoverButtonComponent.
17
18
  */
18
19
  readonly buttonInjectionConfig?: Maybe<ObservableOrValueGetter<Maybe<DbxInjectionComponentConfig<any> | boolean>>>;
20
+ /**
21
+ * Customize day function. When a new function is piped through the calendar is refreshed.
22
+ */
23
+ readonly customizeDay?: Maybe<ObservableOrValue<Maybe<DbxScheduleSelectionCalendarBeforeMonthViewRenderModifyDayFunction>>>;
24
+ /**
25
+ * Optional full control over the beforeMonthViewRender
26
+ */
27
+ readonly beforeMonthViewRenderFunctionFactory?: Maybe<ObservableOrValue<DbxScheduleSelectionCalendarBeforeMonthViewRenderFunctionFactory>>;
19
28
  }
29
+ export declare type DbxScheduleSelectionCalendarBeforeMonthViewRenderModifyDayFunction = (viewDay: CalendarMonthViewDay<CalendarScheduleSelectionMetadata>, state: CalendarScheduleSelectionState) => void;
30
+ export declare type DbxScheduleSelectionCalendarBeforeMonthViewRenderFunction = (renderEvent: CalendarMonthViewBeforeRenderEvent) => void;
31
+ export declare type DbxScheduleSelectionCalendarBeforeMonthViewRenderFunctionFactory = (state: Observable<CalendarScheduleSelectionState>) => DbxScheduleSelectionCalendarBeforeMonthViewRenderFunction;
32
+ export declare function dbxScheduleSelectionCalendarBeforeMonthViewRenderFactory(inputModifyFn?: Maybe<DbxScheduleSelectionCalendarBeforeMonthViewRenderModifyDayFunction>): DbxScheduleSelectionCalendarBeforeMonthViewRenderFunctionFactory;
20
33
  export declare class DbxScheduleSelectionCalendarComponent<T> implements OnInit, OnDestroy {
21
34
  readonly calendarStore: DbxCalendarStore<T>;
22
35
  readonly dbxCalendarScheduleSelectionStore: DbxCalendarScheduleSelectionStore;
@@ -24,15 +37,16 @@ export declare class DbxScheduleSelectionCalendarComponent<T> implements OnInit,
24
37
  readonly showClearSelectionButton$: Observable<boolean>;
25
38
  readonly datePopoverButtonInjectionConfig$: Observable<Maybe<DbxInjectionComponentConfig<any>>>;
26
39
  clickEvent: EventEmitter<DbxCalendarEvent<T>>;
27
- readonly state$: Observable<import("./calendar.schedule.selection.store").CalendarScheduleSelectionState>;
40
+ readonly state$: Observable<CalendarScheduleSelectionState>;
41
+ readonly beforeMonthViewRender$: Observable<DbxScheduleSelectionCalendarBeforeMonthViewRenderFunction>;
28
42
  readonly refresh$: Subject<undefined>;
29
43
  readonly events$: Observable<CalendarEvent<any>[]>;
30
44
  readonly viewDate$: Observable<Date>;
31
45
  constructor(calendarStore: DbxCalendarStore<T>, dbxCalendarScheduleSelectionStore: DbxCalendarScheduleSelectionStore);
32
46
  ngOnInit(): void;
33
47
  ngOnDestroy(): void;
34
- get config(): DbxScheduleSelectionCalendarComponentConfig;
35
- set config(config: DbxScheduleSelectionCalendarComponentConfig);
48
+ get config(): Maybe<DbxScheduleSelectionCalendarComponentConfig>;
49
+ set config(config: Maybe<DbxScheduleSelectionCalendarComponentConfig>);
36
50
  dayClicked({ date }: {
37
51
  date: Date;
38
52
  }): void;
@@ -1,4 +1,4 @@
1
- import { DateBlockDayOfWeekFactory, DateBlockIndex, DateBlockRangeWithRange, DateOrDateBlockIndex, DateRange, DateScheduleDateFilterConfig, DateScheduleDayCode, DateScheduleRange, DateTimingRelativeIndexFactory, DateOrDateRangeOrDateBlockIndexOrDateBlockRange, DateTimezoneUtcNormalInstance } from '@dereekb/date';
1
+ import { DateBlockDayOfWeekFactory, DateBlockIndex, DateBlockRangeWithRange, DateOrDateBlockIndex, DateRange, DateScheduleDateFilterConfig, DateScheduleDayCode, DateScheduleRange, DateTimingRelativeIndexFactory, DateOrDateRangeOrDateBlockIndexOrDateBlockRange, DateTimezoneUtcNormalInstance, DateBlock, DateBlockDurationSpan } from '@dereekb/date';
2
2
  import { Maybe, TimezoneString, DecisionFunction, IterableOrValue, MaybeMap, DayOfWeek, AllOrNoneSelection, ArrayOrValue } from '@dereekb/util';
3
3
  import { ComponentStore } from '@ngrx/component-store';
4
4
  import { Observable } from 'rxjs';
@@ -53,7 +53,7 @@ export interface CalendarScheduleSelectionState extends PartialCalendarScheduleS
53
53
  */
54
54
  indexFactory: DateTimingRelativeIndexFactory;
55
55
  /**
56
- * Array of manually selected dates.
56
+ * Array of manually selected dates within the picked range. This is not the set of all enabled indexes.
57
57
  *
58
58
  * Values that exist outside of the "input" range are considered toggled on, while those
59
59
  * that are selected within the range are considered toggled off.
@@ -122,6 +122,9 @@ export declare class DbxCalendarScheduleSelectionStore extends ComponentStore<Ca
122
122
  readonly inputEnd$: Observable<Maybe<Date>>;
123
123
  readonly currentInputRange$: Observable<Maybe<CalendarScheduleSelectionInputDateRange>>;
124
124
  readonly inputRange$: Observable<CalendarScheduleSelectionInputDateRange>;
125
+ /**
126
+ * @deprecated This is not the same as the current selection value. This is the set of manually togged off dates. It will be removed in a future update.
127
+ */
125
128
  readonly selectedDates$: Observable<Set<DateBlockIndex>>;
126
129
  readonly isEnabledFilterDayFunction$: Observable<DecisionFunction<DateOrDateBlockIndex>>;
127
130
  readonly isEnabledDayFunction$: Observable<DecisionFunction<DateOrDateBlockIndex>>;
@@ -137,6 +140,8 @@ export declare class DbxCalendarScheduleSelectionStore extends ComponentStore<Ca
137
140
  readonly currentSelectionValueWithTimezone$: Observable<Maybe<CalendarScheduleSelectionValue>>;
138
141
  readonly nextToggleSelection$: Observable<Maybe<AllOrNoneSelection>>;
139
142
  readonly selectionValue$: Observable<CalendarScheduleSelectionValue>;
143
+ readonly selectionValueDateBlockDurationSpan$: Observable<DateBlockDurationSpan<DateBlock>[]>;
144
+ readonly selectionValueSelectedIndexes$: Observable<Set<DateBlockIndex>>;
140
145
  readonly currentDateScheduleRangeValue$: Observable<Maybe<DateScheduleRange>>;
141
146
  readonly dateScheduleRangeValue$: Observable<DateScheduleRange>;
142
147
  readonly cellContentFactory$: Observable<CalendarScheduleSelectionCellContentFactory>;
@@ -1,9 +1,10 @@
1
1
  import { Component, EventEmitter, Output, Input } from '@angular/core';
2
- import { map, shareReplay, first, throttleTime, BehaviorSubject, distinctUntilChanged } from 'rxjs';
2
+ import { map, shareReplay, first, throttleTime, BehaviorSubject, distinctUntilChanged, combineLatest, switchMap } from 'rxjs';
3
3
  import { DbxCalendarStore, prepareAndSortCalendarEvents } from '@dereekb/dbx-web/calendar';
4
4
  import { DbxCalendarScheduleSelectionStore } from './calendar.schedule.selection.store';
5
5
  import { CalendarScheduleSelectionDayState } from './calendar.schedule.selection';
6
6
  import { switchMapDbxInjectionComponentConfig } from '@dereekb/dbx-core';
7
+ import { asObservable } from '@dereekb/rxjs';
7
8
  import { DbxScheduleSelectionCalendarDatePopoverButtonComponent } from './calendar.schedule.selection.popover.button.component';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@dereekb/dbx-web/calendar";
@@ -14,6 +15,46 @@ import * as i5 from "@dereekb/dbx-web";
14
15
  import * as i6 from "angular-calendar";
15
16
  import * as i7 from "./calendar.schedule.selection.cell.component";
16
17
  import * as i8 from "./calendar.schedule.selection.toggle.button.component";
18
+ export function dbxScheduleSelectionCalendarBeforeMonthViewRenderFactory(inputModifyFn) {
19
+ const modifyFn = inputModifyFn || (() => { });
20
+ return (state$) => {
21
+ return (renderEvent) => {
22
+ const { body } = renderEvent;
23
+ // use latest/current state
24
+ state$.pipe(first()).subscribe((calendarScheduleState) => {
25
+ const { isEnabledDay, indexFactory, isEnabledFilterDay, allowedDaysOfWeek } = calendarScheduleState;
26
+ body.forEach((viewDay) => {
27
+ const { date } = viewDay;
28
+ const i = indexFactory(date);
29
+ const day = date.getDay();
30
+ let state;
31
+ if (!isEnabledFilterDay(i)) {
32
+ viewDay.cssClass = 'cal-day-not-applicable';
33
+ state = CalendarScheduleSelectionDayState.NOT_APPLICABLE;
34
+ }
35
+ else if (!allowedDaysOfWeek.has(day)) {
36
+ viewDay.cssClass = 'cal-day-disabled';
37
+ state = CalendarScheduleSelectionDayState.DISABLED;
38
+ }
39
+ else if (isEnabledDay(i)) {
40
+ viewDay.cssClass = 'cal-day-selected';
41
+ state = CalendarScheduleSelectionDayState.SELECTED;
42
+ }
43
+ else {
44
+ viewDay.cssClass = 'cal-day-not-selected';
45
+ state = CalendarScheduleSelectionDayState.NOT_SELECTED;
46
+ }
47
+ const meta = {
48
+ state,
49
+ i
50
+ };
51
+ viewDay.meta = meta;
52
+ modifyFn(viewDay, calendarScheduleState);
53
+ });
54
+ });
55
+ };
56
+ };
57
+ }
17
58
  export class DbxScheduleSelectionCalendarComponent {
18
59
  constructor(calendarStore, dbxCalendarScheduleSelectionStore) {
19
60
  this.calendarStore = calendarStore;
@@ -24,7 +65,17 @@ export class DbxScheduleSelectionCalendarComponent {
24
65
  this.clickEvent = new EventEmitter();
25
66
  // refresh any time the selected day function updates
26
67
  this.state$ = this.dbxCalendarScheduleSelectionStore.state$;
27
- this.refresh$ = this.state$.pipe(throttleTime(100), map(() => undefined));
68
+ this.beforeMonthViewRender$ = this._config.pipe(switchMap((x) => {
69
+ let factory;
70
+ if (x.beforeMonthViewRenderFunctionFactory) {
71
+ factory = asObservable(x.beforeMonthViewRenderFunctionFactory);
72
+ }
73
+ else {
74
+ factory = asObservable(x.customizeDay).pipe(map((x) => dbxScheduleSelectionCalendarBeforeMonthViewRenderFactory(x)));
75
+ }
76
+ return factory.pipe(map((x) => x(this.state$)));
77
+ }), shareReplay(1));
78
+ this.refresh$ = combineLatest([this.state$, this.beforeMonthViewRender$]).pipe(throttleTime(100), map(() => undefined));
28
79
  this.events$ = this.calendarStore.visibleEvents$.pipe(map(prepareAndSortCalendarEvents), shareReplay(1));
29
80
  this.viewDate$ = this.calendarStore.date$;
30
81
  }
@@ -40,7 +91,7 @@ export class DbxScheduleSelectionCalendarComponent {
40
91
  return this._config.value;
41
92
  }
42
93
  set config(config) {
43
- this._config.next(config);
94
+ this._config.next(config ?? {});
44
95
  }
45
96
  dayClicked({ date }) {
46
97
  this.dbxCalendarScheduleSelectionStore.toggleSelectedDates(date);
@@ -49,34 +100,8 @@ export class DbxScheduleSelectionCalendarComponent {
49
100
  this.clickEvent.emit({ action, event });
50
101
  }
51
102
  beforeMonthViewRender(renderEvent) {
52
- const { body } = renderEvent;
53
- this.state$.pipe(first()).subscribe(({ isEnabledDay, indexFactory, isEnabledFilterDay, allowedDaysOfWeek }) => {
54
- body.forEach((viewDay) => {
55
- const { date } = viewDay;
56
- const i = indexFactory(date);
57
- const day = date.getDay();
58
- let state;
59
- if (!isEnabledFilterDay(i)) {
60
- viewDay.cssClass = 'cal-day-not-applicable';
61
- state = CalendarScheduleSelectionDayState.NOT_APPLICABLE;
62
- }
63
- else if (!allowedDaysOfWeek.has(day)) {
64
- viewDay.cssClass = 'cal-day-disabled';
65
- state = CalendarScheduleSelectionDayState.DISABLED;
66
- }
67
- else if (isEnabledDay(i)) {
68
- viewDay.cssClass = 'cal-day-selected';
69
- state = CalendarScheduleSelectionDayState.SELECTED;
70
- }
71
- else {
72
- viewDay.cssClass = 'cal-day-not-selected';
73
- state = CalendarScheduleSelectionDayState.NOT_SELECTED;
74
- }
75
- viewDay.meta = {
76
- state,
77
- i
78
- };
79
- });
103
+ this.beforeMonthViewRender$.pipe(first()).subscribe((x) => {
104
+ x(renderEvent);
80
105
  });
81
106
  }
82
107
  }
@@ -90,4 +115,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
90
115
  }], config: [{
91
116
  type: Input
92
117
  }] } });
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBYSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQVcsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekgsT0FBTyxFQUFvQixnQkFBZ0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBcUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNySCxPQUFPLEVBQStCLG9DQUFvQyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdEcsT0FBTyxFQUFFLHNEQUFzRCxFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7QUFrQmhJLE1BQU0sT0FBTyxxQ0FBcUM7SUEyQmhELFlBQXFCLGFBQWtDLEVBQVcsaUNBQW9FO1FBQWpILGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUFXLHNDQUFpQyxHQUFqQyxpQ0FBaUMsQ0FBbUM7UUExQjlILFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBOEMsRUFBRSxDQUFDLENBQUM7UUFFOUUsOEJBQXlCLEdBQUcs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QyxLQUFLLEdBQUcsaUNBQWlDLENBQUMsY0FBYyxDQUFDO2lCQUMxRDtxQkFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQWdCLENBQUMsRUFBRTtvQkFDbkQsT0FBTyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQztvQkFDdEMsS0FBSyxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQztpQkFDcEQ7cUJBQU0sSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzFCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUM7b0JBQ3RDLEtBQUssR0FBRyxpQ0FBaUMsQ0FBQyxRQUFRLENBQUM7aUJBQ3BEO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLENBQUM7b0JBQzFDLEtBQUssR0FBRyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUM7aUJBQ3hEO2dCQUVELE9BQU8sQ0FBQyxJQUFJLEdBQUc7b0JBQ2IsS0FBSztvQkFDTCxDQUFDO2lCQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7bUlBdEZVLHFDQUFxQzt1SEFBckMscUNBQXFDLCtIQUZyQyxDQUFDLGdCQUFnQixDQUFDLDBCQ3pCL0Isc3pDQXFCQTs0RkRNYSxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UsaUNBQWlDLGFBRWhDLENBQUMsZ0JBQWdCLENBQUM7dUpBaUI3QixVQUFVO3NCQURULE1BQU07Z0JBMEJILE1BQU07c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uRGVzdHJveSwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCwgQ2FsZW5kYXJNb250aFZpZXdCZWZvcmVSZW5kZXJFdmVudCwgQ2FsZW5kYXJNb250aFZpZXdEYXkgfSBmcm9tICdhbmd1bGFyLWNhbGVuZGFyJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIFN1YmplY3QsIGZpcnN0LCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERieENhbGVuZGFyRXZlbnQsIERieENhbGVuZGFyU3RvcmUsIHByZXBhcmVBbmRTb3J0Q2FsZW5kYXJFdmVudHMgfSBmcm9tICdAZGVyZWVrYi9kYngtd2ViL2NhbGVuZGFyJztcbmltcG9ydCB7IERheU9mV2VlaywgTWF5YmUgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlJztcbmltcG9ydCB7IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXlTdGF0ZSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbk1ldGFkYXRhIH0gZnJvbSAnLi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24nO1xuaW1wb3J0IHsgRGJ4SW5qZWN0aW9uQ29tcG9uZW50Q29uZmlnLCBzd2l0Y2hNYXBEYnhJbmplY3Rpb25Db21wb25lbnRDb25maWcgfSBmcm9tICdAZGVyZWVrYi9kYngtY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckRhdGVQb3BvdmVyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24ucG9wb3Zlci5idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQ29tcG9uZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIGNsZWFyIHNlbGVjdGlvbiBidXR0b24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBkaXNwbGF5aW5nIGEgY3VzdG9tIHNlbGVjdGlvbiBidXR0b24uIFdoZW4gbnVsbC91bmRlZmluZWQvdHJ1ZSBpcyBwYXNzZWQsIHdpbGwgc2hvdyB0aGUgZGVmYXVsdCBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyRGF0ZVBvcG92ZXJCdXR0b25Db21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBidXR0b25JbmplY3Rpb25Db25maWc/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxEYnhJbmplY3Rpb25Db21wb25lbnRDb25maWc8YW55PiB8IGJvb2xlYW4+Pj47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbRGJ4Q2FsZW5kYXJTdG9yZV1cbn0pXG5leHBvcnQgY2xhc3MgRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQ29tcG9uZW50Q29uZmlnPih7fSk7XG5cbiAgcmVhZG9ubHkgc2hvd0NsZWFyU2VsZWN0aW9uQnV0dG9uJCA9IHRoaXMuX2NvbmZpZy5waXBlKFxuICAgIG1hcCgoY29uZmlnKSA9PiBjb25maWcuc2hvd0NsZWFyU2VsZWN0aW9uQnV0dG9uID8/IHRydWUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICByZWFkb25seSBkYXRlUG9wb3ZlckJ1dHRvbkluamVjdGlvbkNvbmZpZyQ6IE9ic2VydmFibGU8TWF5YmU8RGJ4SW5qZWN0aW9uQ29tcG9uZW50Q29uZmlnPGFueT4+PiA9IHRoaXMuX2NvbmZpZy5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5idXR0b25JbmplY3Rpb25Db25maWcpLFxuICAgIHN3aXRjaE1hcERieEluamVjdGlvbkNvbXBvbmVudENvbmZpZyhEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyRGF0ZVBvcG92ZXJCdXR0b25Db21wb25lbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgQE91dHB1dCgpXG4gIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERieENhbGVuZGFyRXZlbnQ8VD4+KCk7XG5cbiAgLy8gcmVmcmVzaCBhbnkgdGltZSB0aGUgc2VsZWN0ZWQgZGF5IGZ1bmN0aW9uIHVwZGF0ZXNcbiAgcmVhZG9ubHkgc3RhdGUkID0gdGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUuc3RhdGUkO1xuICByZWFkb25seSByZWZyZXNoJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgdGhyb3R0bGVUaW1lKDEwMCksXG4gICAgbWFwKCgpID0+IHVuZGVmaW5lZClcbiAgKSBhcyBTdWJqZWN0PHVuZGVmaW5lZD47XG5cbiAgcmVhZG9ubHkgZXZlbnRzJCA9IHRoaXMuY2FsZW5kYXJTdG9yZS52aXNpYmxlRXZlbnRzJC5waXBlKG1hcChwcmVwYXJlQW5kU29ydENhbGVuZGFyRXZlbnRzKSwgc2hhcmVSZXBsYXkoMSkpO1xuICByZWFkb25seSB2aWV3RGF0ZSQgPSB0aGlzLmNhbGVuZGFyU3RvcmUuZGF0ZSQ7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY2FsZW5kYXJTdG9yZTogRGJ4Q2FsZW5kYXJTdG9yZTxUPiwgcmVhZG9ubHkgZGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlOiBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhclN0b3JlLnNldE5hdmlnYXRpb25SYW5nZUxpbWl0KHRoaXMuZGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlLm1pbk1heERhdGVSYW5nZSQpOyAvLyBzZXQgbmF2aWdhdGlvbiBsaW1pdCB0byB0aGUgbWluL21heCBhbGxvd2VkIGRhdGVzLlxuICAgIHRoaXMuY2FsZW5kYXJTdG9yZS5zZXRTaG93UGFnZUJ1dHRvbnModHJ1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9jb25maWcuY29tcGxldGUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb25maWcoY29uZmlnOiBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoY29uZmlnKTtcbiAgfVxuXG4gIGRheUNsaWNrZWQoeyBkYXRlIH06IHsgZGF0ZTogRGF0ZSB9KTogdm9pZCB7XG4gICAgdGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUudG9nZ2xlU2VsZWN0ZWREYXRlcyhkYXRlKTtcbiAgfVxuXG4gIGV2ZW50Q2xpY2tlZChhY3Rpb246IHN0cmluZywgZXZlbnQ6IENhbGVuZGFyRXZlbnQ8VD4pOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdCh7IGFjdGlvbiwgZXZlbnQgfSk7XG4gIH1cblxuICBiZWZvcmVNb250aFZpZXdSZW5kZXIocmVuZGVyRXZlbnQ6IENhbGVuZGFyTW9udGhWaWV3QmVmb3JlUmVuZGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IGJvZHkgfTogeyBib2R5OiBDYWxlbmRhck1vbnRoVmlld0RheTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uTWV0YWRhdGE+W10gfSA9IHJlbmRlckV2ZW50O1xuICAgIHRoaXMuc3RhdGUkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCh7IGlzRW5hYmxlZERheSwgaW5kZXhGYWN0b3J5LCBpc0VuYWJsZWRGaWx0ZXJEYXksIGFsbG93ZWREYXlzT2ZXZWVrIH0pID0+IHtcbiAgICAgIGJvZHkuZm9yRWFjaCgodmlld0RheSkgPT4ge1xuICAgICAgICBjb25zdCB7IGRhdGUgfSA9IHZpZXdEYXk7XG4gICAgICAgIGNvbnN0IGkgPSBpbmRleEZhY3RvcnkoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XG5cbiAgICAgICAgbGV0IHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGU7XG5cbiAgICAgICAgaWYgKCFpc0VuYWJsZWRGaWx0ZXJEYXkoaSkpIHtcbiAgICAgICAgICB2aWV3RGF5LmNzc0NsYXNzID0gJ2NhbC1kYXktbm90LWFwcGxpY2FibGUnO1xuICAgICAgICAgIHN0YXRlID0gQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRheVN0YXRlLk5PVF9BUFBMSUNBQkxFO1xuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd2VkRGF5c09mV2Vlay5oYXMoZGF5IGFzIERheU9mV2VlaykpIHtcbiAgICAgICAgICB2aWV3RGF5LmNzc0NsYXNzID0gJ2NhbC1kYXktZGlzYWJsZWQnO1xuICAgICAgICAgIHN0YXRlID0gQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRheVN0YXRlLkRJU0FCTEVEO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICAgIHZpZXdEYXkuY3NzQ2xhc3MgPSAnY2FsLWRheS1zZWxlY3RlZCc7XG4gICAgICAgICAgc3RhdGUgPSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGUuU0VMRUNURUQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlld0RheS5jc3NDbGFzcyA9ICdjYWwtZGF5LW5vdC1zZWxlY3RlZCc7XG4gICAgICAgICAgc3RhdGUgPSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGUuTk9UX1NFTEVDVEVEO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld0RheS5tZXRhID0ge1xuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGJ4LWNhbGVuZGFyLWJhc2UgY2xhc3M9XCJkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyXCI+XG4gIDxuZy1jb250YWluZXIgY29udHJvbHM+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbiQgfCBhc3luY1wiPlxuICAgICAgPGRieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItc2VsZWN0aW9uLXRvZ2dsZS1idXR0b24+PC9kYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLXNlbGVjdGlvbi10b2dnbGUtYnV0dG9uPlxuICAgICAgPGRieC1idXR0b24tc3BhY2VyPjwvZGJ4LWJ1dHRvbi1zcGFjZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRieC1pbmplY3Rpb24gW2NvbmZpZ109XCJkYXRlUG9wb3ZlckJ1dHRvbkluamVjdGlvbkNvbmZpZyQgfCBhc3luY1wiPjwvZGJ4LWluamVjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJkYngtY2FsZW5kYXItY29udGVudCBkYngtY2FsZW5kYXItY29udGVudC1tb250aFwiPlxuICAgIDxtd2wtY2FsZW5kYXItbW9udGgtdmlldyBbcmVmcmVzaF09XCJyZWZyZXNoJFwiIFt2aWV3RGF0ZV09XCIodmlld0RhdGUkIHwgYXN5bmMpIVwiIFtldmVudHNdPVwiKGV2ZW50cyQgfCBhc3luYykhXCIgKGRheUNsaWNrZWQpPVwiZGF5Q2xpY2tlZCgkZXZlbnQuZGF5KVwiIChldmVudENsaWNrZWQpPVwiZXZlbnRDbGlja2VkKCdDbGlja2VkJywgJGV2ZW50LmV2ZW50KVwiIChiZWZvcmVWaWV3UmVuZGVyKT1cImJlZm9yZU1vbnRoVmlld1JlbmRlcigkZXZlbnQpXCIgW2NlbGxUZW1wbGF0ZV09XCJtb250aERheUNlbGxUZW1wbGF0ZVwiPjwvbXdsLWNhbGVuZGFyLW1vbnRoLXZpZXc+XG4gIDwvZGl2PlxuPC9kYngtY2FsZW5kYXItYmFzZT5cblxuPCEtLSBDZWxsIC0tPlxuPG5nLXRlbXBsYXRlICNtb250aERheUNlbGxUZW1wbGF0ZSBsZXQtZGF5PVwiZGF5XCIgbGV0LWxvY2FsZT1cImxvY2FsZVwiPlxuICA8ZGl2IGNsYXNzPVwiY2FsLWNlbGwtdG9wXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJjYWwtZGF5LWJhZGdlXCIgKm5nSWY9XCJkYXkuYmFkZ2VUb3RhbCA+IDBcIj57eyBkYXkuYmFkZ2VUb3RhbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImNhbC1kYXktbnVtYmVyXCI+e3sgZGF5LmRhdGUgfCBjYWxlbmRhckRhdGU6ICdtb250aFZpZXdEYXlOdW1iZXInOmxvY2FsZSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLWNlbGwgW2RheV09XCJkYXlcIj48L2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItY2VsbD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBYSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFMUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQVcsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQWMsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuSixPQUFPLEVBQW9CLGdCQUFnQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0csT0FBTyxFQUFrQyxpQ0FBaUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hILE9BQU8sRUFBRSxpQ0FBaUMsRUFBcUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNySCxPQUFPLEVBQStCLG9DQUFvQyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEcsT0FBTyxFQUE4QyxZQUFZLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxzREFBc0QsRUFBRSxNQUFNLHdEQUF3RCxDQUFDOzs7Ozs7Ozs7O0FBMkJoSSxNQUFNLFVBQVUsd0RBQXdELENBQUMsYUFBeUY7SUFDaEssTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFFN0MsT0FBTyxDQUFD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bnRFbWl0dGVyLCBPdXRwdXQsIE9uRGVzdHJveSwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCwgQ2FsZW5kYXJNb250aFZpZXdCZWZvcmVSZW5kZXJFdmVudCwgQ2FsZW5kYXJNb250aFZpZXdEYXkgfSBmcm9tICdhbmd1bGFyLWNhbGVuZGFyJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIFN1YmplY3QsIGZpcnN0LCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGJ4Q2FsZW5kYXJFdmVudCwgRGJ4Q2FsZW5kYXJTdG9yZSwgcHJlcGFyZUFuZFNvcnRDYWxlbmRhckV2ZW50cyB9IGZyb20gJ0BkZXJlZWtiL2RieC13ZWIvY2FsZW5kYXInO1xuaW1wb3J0IHsgRGF5T2ZXZWVrLCBNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbi5zdG9yZSc7XG5pbXBvcnQgeyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGUsIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25NZXRhZGF0YSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcbmltcG9ydCB7IERieEluamVjdGlvbkNvbXBvbmVudENvbmZpZywgc3dpdGNoTWFwRGJ4SW5qZWN0aW9uQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU9yVmFsdWUsIE9ic2VydmFibGVPclZhbHVlR2V0dGVyLCBhc09ic2VydmFibGUsIGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJEYXRlUG9wb3ZlckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnBvcG92ZXIuYnV0dG9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckNvbXBvbmVudENvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBjbGVhciBzZWxlY3Rpb24gYnV0dG9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG93Q2xlYXJTZWxlY3Rpb25CdXR0b24/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgZGlzcGxheWluZyBhIGN1c3RvbSBzZWxlY3Rpb24gYnV0dG9uLiBXaGVuIG51bGwvdW5kZWZpbmVkL3RydWUgaXMgcGFzc2VkLCB3aWxsIHNob3cgdGhlIGRlZmF1bHQgRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckRhdGVQb3BvdmVyQnV0dG9uQ29tcG9uZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uSW5qZWN0aW9uQ29uZmlnPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8RGJ4SW5qZWN0aW9uQ29tcG9uZW50Q29uZmlnPGFueT4gfCBib29sZWFuPj4+O1xuICAvKipcbiAgICogQ3VzdG9taXplIGRheSBmdW5jdGlvbi4gV2hlbiBhIG5ldyBmdW5jdGlvbiBpcyBwaXBlZCB0aHJvdWdoIHRoZSBjYWxlbmRhciBpcyByZWZyZXNoZWQuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21pemVEYXk/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZTxNYXliZTxEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQmVmb3JlTW9udGhWaWV3UmVuZGVyTW9kaWZ5RGF5RnVuY3Rpb24+Pj47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgYmVmb3JlTW9udGhWaWV3UmVuZGVyXG4gICAqL1xuICByZWFkb25seSBiZWZvcmVNb250aFZpZXdSZW5kZXJGdW5jdGlvbkZhY3Rvcnk/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZTxEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQmVmb3JlTW9udGhWaWV3UmVuZGVyRnVuY3Rpb25GYWN0b3J5Pj47XG59XG5cbmV4cG9ydCB0eXBlIERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJCZWZvcmVNb250aFZpZXdSZW5kZXJNb2RpZnlEYXlGdW5jdGlvbiA9ICh2aWV3RGF5OiBDYWxlbmRhck1vbnRoVmlld0RheTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uTWV0YWRhdGE+LCBzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQmVmb3JlTW9udGhWaWV3UmVuZGVyRnVuY3Rpb24gPSAocmVuZGVyRXZlbnQ6IENhbGVuZGFyTW9udGhWaWV3QmVmb3JlUmVuZGVyRXZlbnQpID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJCZWZvcmVNb250aFZpZXdSZW5kZXJGdW5jdGlvbkZhY3RvcnkgPSAoc3RhdGU6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPikgPT4gRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckJlZm9yZU1vbnRoVmlld1JlbmRlckZ1bmN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gZGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckJlZm9yZU1vbnRoVmlld1JlbmRlckZhY3RvcnkoaW5wdXRNb2RpZnlGbj86IE1heWJlPERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJCZWZvcmVNb250aFZpZXdSZW5kZXJNb2RpZnlEYXlGdW5jdGlvbj4pOiBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQmVmb3JlTW9udGhWaWV3UmVuZGVyRnVuY3Rpb25GYWN0b3J5IHtcbiAgY29uc3QgbW9kaWZ5Rm4gPSBpbnB1dE1vZGlmeUZuIHx8ICgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIChzdGF0ZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPikgPT4ge1xuICAgIHJldHVybiAocmVuZGVyRXZlbnQ6IENhbGVuZGFyTW9udGhWaWV3QmVmb3JlUmVuZGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYm9keSB9OiB7IGJvZHk6IENhbGVuZGFyTW9udGhWaWV3RGF5PENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25NZXRhZGF0YT5bXSB9ID0gcmVuZGVyRXZlbnQ7XG5cbiAgICAgIC8vIHVzZSBsYXRlc3QvY3VycmVudCBzdGF0ZVxuICAgICAgc3RhdGUkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChjYWxlbmRhclNjaGVkdWxlU3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB7IGlzRW5hYmxlZERheSwgaW5kZXhGYWN0b3J5LCBpc0VuYWJsZWRGaWx0ZXJEYXksIGFsbG93ZWREYXlzT2ZXZWVrIH0gPSBjYWxlbmRhclNjaGVkdWxlU3RhdGU7XG4gICAgICAgIGJvZHkuZm9yRWFjaCgodmlld0RheSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZGF0ZSB9ID0gdmlld0RheTtcbiAgICAgICAgICBjb25zdCBpID0gaW5kZXhGYWN0b3J5KGRhdGUpO1xuICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XG5cbiAgICAgICAgICBsZXQgc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXlTdGF0ZTtcblxuICAgICAgICAgIGlmICghaXNFbmFibGVkRmlsdGVyRGF5KGkpKSB7XG4gICAgICAgICAgICB2aWV3RGF5LmNzc0NsYXNzID0gJ2NhbC1kYXktbm90LWFwcGxpY2FibGUnO1xuICAgICAgICAgICAgc3RhdGUgPSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGUuTk9UX0FQUExJQ0FCTEU7XG4gICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dlZERheXNPZldlZWsuaGFzKGRheSBhcyBEYXlPZldlZWspKSB7XG4gICAgICAgICAgICB2aWV3RGF5LmNzc0NsYXNzID0gJ2NhbC1kYXktZGlzYWJsZWQnO1xuICAgICAgICAgICAgc3RhdGUgPSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF5U3RhdGUuRElTQUJMRUQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgICAgIHZpZXdEYXkuY3NzQ2xhc3MgPSAnY2FsLWRheS1zZWxlY3RlZCc7XG4gICAgICAgICAgICBzdGF0ZSA9IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXlTdGF0ZS5TRUxFQ1RFRDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmlld0RheS5jc3NDbGFzcyA9ICdjYWwtZGF5LW5vdC1zZWxlY3RlZCc7XG4gICAgICAgICAgICBzdGF0ZSA9IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXlTdGF0ZS5OT1RfU0VMRUNURUQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbWV0YSA9IHtcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgaVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2aWV3RGF5Lm1ldGEgPSBtZXRhO1xuXG4gICAgICAgICAgbW9kaWZ5Rm4odmlld0RheSwgY2FsZW5kYXJTY2hlZHVsZVN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW0RieENhbGVuZGFyU3RvcmVdXG59KVxuZXhwb3J0IGNsYXNzIERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckNvbXBvbmVudENvbmZpZz4oe30pO1xuXG4gIHJlYWRvbmx5IHNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbiQgPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBtYXAoKGNvbmZpZykgPT4gY29uZmlnLnNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbiA/PyB0cnVlKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVBvcG92ZXJCdXR0b25JbmplY3Rpb25Db25maWckOiBPYnNlcnZhYmxlPE1heWJlPERieEluamVjdGlvbkNvbXBvbmVudENvbmZpZzxhbnk+Pj4gPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBtYXAoKHgpID0+IHguYnV0dG9uSW5qZWN0aW9uQ29uZmlnKSxcbiAgICBzd2l0Y2hNYXBEYnhJbmplY3Rpb25Db21wb25lbnRDb25maWcoRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckRhdGVQb3BvdmVyQnV0dG9uQ29tcG9uZW50KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYnhDYWxlbmRhckV2ZW50PFQ+PigpO1xuXG4gIC8vIHJlZnJlc2ggYW55IHRpbWUgdGhlIHNlbGVjdGVkIGRheSBmdW5jdGlvbiB1cGRhdGVzXG4gIHJlYWRvbmx5IHN0YXRlJCA9IHRoaXMuZGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlLnN0YXRlJDtcblxuICByZWFkb25seSBiZWZvcmVNb250aFZpZXdSZW5kZXIkID0gdGhpcy5fY29uZmlnLnBpcGUoXG4gICAgc3dpdGNoTWFwKCh4KSA9PiB7XG4gICAgICBsZXQgZmFjdG9yeTogT2JzZXJ2YWJsZTxEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyQmVmb3JlTW9udGhWaWV3UmVuZGVyRnVuY3Rpb25GYWN0b3J5PjtcblxuICAgICAgaWYgKHguYmVmb3JlTW9udGhWaWV3UmVuZGVyRnVuY3Rpb25GYWN0b3J5KSB7XG4gICAgICAgIGZhY3RvcnkgPSBhc09ic2VydmFibGUoeC5iZWZvcmVNb250aFZpZXdSZW5kZXJGdW5jdGlvbkZhY3RvcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeSA9IGFzT2JzZXJ2YWJsZSh4LmN1c3RvbWl6ZURheSkucGlwZShtYXAoKHgpID0+IGRieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJCZWZvcmVNb250aFZpZXdSZW5kZXJGYWN0b3J5KHgpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWN0b3J5LnBpcGUobWFwKCh4KSA9PiB4KHRoaXMuc3RhdGUkKSkpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcmVmcmVzaCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnN0YXRlJCwgdGhpcy5iZWZvcmVNb250aFZpZXdSZW5kZXIkXSkucGlwZShcbiAgICB0aHJvdHRsZVRpbWUoMTAwKSxcbiAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKVxuICApIGFzIFN1YmplY3Q8dW5kZWZpbmVkPjtcblxuICByZWFkb25seSBldmVudHMkID0gdGhpcy5jYWxlbmRhclN0b3JlLnZpc2libGVFdmVudHMkLnBpcGUobWFwKHByZXBhcmVBbmRTb3J0Q2FsZW5kYXJFdmVudHMpLCBzaGFyZVJlcGxheSgxKSk7XG4gIHJlYWRvbmx5IHZpZXdEYXRlJCA9IHRoaXMuY2FsZW5kYXJTdG9yZS5kYXRlJDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjYWxlbmRhclN0b3JlOiBEYnhDYWxlbmRhclN0b3JlPFQ+LCByZWFkb25seSBkYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmU6IERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyU3RvcmUuc2V0TmF2aWdhdGlvblJhbmdlTGltaXQodGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUubWluTWF4RGF0ZVJhbmdlJCk7IC8vIHNldCBuYXZpZ2F0aW9uIGxpbWl0IHRvIHRoZSBtaW4vbWF4IGFsbG93ZWQgZGF0ZXMuXG4gICAgdGhpcy5jYWxlbmRhclN0b3JlLnNldFNob3dQYWdlQnV0dG9ucyh0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvbmZpZyhjb25maWc6IE1heWJlPERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJDb21wb25lbnRDb25maWc+KSB7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoY29uZmlnID8/IHt9KTtcbiAgfVxuXG4gIGRheUNsaWNrZWQoeyBkYXRlIH06IHsgZGF0ZTogRGF0ZSB9KTogdm9pZCB7XG4gICAgdGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUudG9nZ2xlU2VsZWN0ZWREYXRlcyhkYXRlKTtcbiAgfVxuXG4gIGV2ZW50Q2xpY2tlZChhY3Rpb246IHN0cmluZywgZXZlbnQ6IENhbGVuZGFyRXZlbnQ8VD4pOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdCh7IGFjdGlvbiwgZXZlbnQgfSk7XG4gIH1cblxuICBiZWZvcmVNb250aFZpZXdSZW5kZXIocmVuZGVyRXZlbnQ6IENhbGVuZGFyTW9udGhWaWV3QmVmb3JlUmVuZGVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZU1vbnRoVmlld1JlbmRlciQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHgocmVuZGVyRXZlbnQpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGJ4LWNhbGVuZGFyLWJhc2UgY2xhc3M9XCJkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyXCI+XG4gIDxuZy1jb250YWluZXIgY29udHJvbHM+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDbGVhclNlbGVjdGlvbkJ1dHRvbiQgfCBhc3luY1wiPlxuICAgICAgPGRieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItc2VsZWN0aW9uLXRvZ2dsZS1idXR0b24+PC9kYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLXNlbGVjdGlvbi10b2dnbGUtYnV0dG9uPlxuICAgICAgPGRieC1idXR0b24tc3BhY2VyPjwvZGJ4LWJ1dHRvbi1zcGFjZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRieC1pbmplY3Rpb24gW2NvbmZpZ109XCJkYXRlUG9wb3ZlckJ1dHRvbkluamVjdGlvbkNvbmZpZyQgfCBhc3luY1wiPjwvZGJ4LWluamVjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJkYngtY2FsZW5kYXItY29udGVudCBkYngtY2FsZW5kYXItY29udGVudC1tb250aFwiPlxuICAgIDxtd2wtY2FsZW5kYXItbW9udGgtdmlldyBbcmVmcmVzaF09XCJyZWZyZXNoJFwiIFt2aWV3RGF0ZV09XCIodmlld0RhdGUkIHwgYXN5bmMpIVwiIFtldmVudHNdPVwiKGV2ZW50cyQgfCBhc3luYykhXCIgKGRheUNsaWNrZWQpPVwiZGF5Q2xpY2tlZCgkZXZlbnQuZGF5KVwiIChldmVudENsaWNrZWQpPVwiZXZlbnRDbGlja2VkKCdDbGlja2VkJywgJGV2ZW50LmV2ZW50KVwiIChiZWZvcmVWaWV3UmVuZGVyKT1cImJlZm9yZU1vbnRoVmlld1JlbmRlcigkZXZlbnQpXCIgW2NlbGxUZW1wbGF0ZV09XCJtb250aERheUNlbGxUZW1wbGF0ZVwiPjwvbXdsLWNhbGVuZGFyLW1vbnRoLXZpZXc+XG4gIDwvZGl2PlxuPC9kYngtY2FsZW5kYXItYmFzZT5cblxuPCEtLSBDZWxsIC0tPlxuPG5nLXRlbXBsYXRlICNtb250aERheUNlbGxUZW1wbGF0ZSBsZXQtZGF5PVwiZGF5XCIgbGV0LWxvY2FsZT1cImxvY2FsZVwiPlxuICA8ZGl2IGNsYXNzPVwiY2FsLWNlbGwtdG9wXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJjYWwtZGF5LWJhZGdlXCIgKm5nSWY9XCJkYXkuYmFkZ2VUb3RhbCA+IDBcIj57eyBkYXkuYmFkZ2VUb3RhbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImNhbC1kYXktbnVtYmVyXCI+e3sgZGF5LmRhdGUgfCBjYWxlbmRhckRhdGU6ICdtb250aFZpZXdEYXlOdW1iZXInOmxvY2FsZSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLWNlbGwgW2RheV09XCJkYXlcIj48L2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItY2VsbD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=