@gipisistemas/ng-core 1.1.10 → 1.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. package/assets/styles/colors.scss +228 -211
  2. package/assets/styles/styles.scss +50 -5
  3. package/bundles/gipisistemas-ng-core.umd.js +3497 -146
  4. package/bundles/gipisistemas-ng-core.umd.js.map +1 -1
  5. package/bundles/gipisistemas-ng-core.umd.min.js +9 -9
  6. package/bundles/gipisistemas-ng-core.umd.min.js.map +1 -1
  7. package/core/gipi-components/components/abstract-crud.component.d.ts +2 -2
  8. package/core/gipi-components/components/abstract-find.component.d.ts +5 -4
  9. package/core/gipi-components/components/abstract.component.d.ts +1 -0
  10. package/esm2015/core/components/abstract-find.component.js +4 -1
  11. package/esm2015/core/gipi-components/components/abstract-crud.component.js +5 -5
  12. package/esm2015/core/gipi-components/components/abstract-find.component.js +45 -21
  13. package/esm2015/core/gipi-components/components/abstract.component.js +5 -2
  14. package/esm2015/gipi-components.js +19 -6
  15. package/esm2015/gipisistemas-ng-core.js +3 -1
  16. package/esm2015/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  17. package/esm2015/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  18. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  19. package/esm2015/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  20. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +158 -0
  21. package/esm2015/shared/gipi-components/datetime-picker/datetime-picker.module.js +82 -0
  22. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +116 -0
  23. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +676 -0
  24. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +306 -0
  25. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  26. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  27. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  28. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +346 -0
  29. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +83 -0
  30. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  31. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +451 -0
  32. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +151 -0
  33. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +230 -0
  34. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +43 -0
  35. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +139 -0
  36. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  37. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +138 -0
  38. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  39. package/esm2015/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +141 -0
  40. package/esm2015/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  41. package/esm2015/shared/gipi-components/form-field/form-field.component.js +1 -1
  42. package/esm2015/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  43. package/esm2015/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  44. package/esm2015/shared/gipi-components/input-select/input-select.component.js +1 -1
  45. package/esm2015/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  46. package/esm2015/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  47. package/esm2015/shared/gipi-components/range-page/range-page.component.js +1 -1
  48. package/esm2015/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  49. package/esm2015/shared/gipi-components/select-button/select-button.component.js +1 -1
  50. package/esm2015/shared/gipi-components/textarea/textarea.component.js +1 -1
  51. package/esm2015/shared/shared.module.js +51 -3
  52. package/esm5/core/components/abstract-find.component.js +4 -1
  53. package/esm5/core/gipi-components/components/abstract-crud.component.js +5 -5
  54. package/esm5/core/gipi-components/components/abstract-find.component.js +45 -21
  55. package/esm5/core/gipi-components/components/abstract.component.js +5 -2
  56. package/esm5/gipi-components.js +19 -6
  57. package/esm5/gipisistemas-ng-core.js +3 -1
  58. package/esm5/shared/gipi-components/datepicker/date-range-picker/date-range-picker.component.js +1 -1
  59. package/esm5/shared/gipi-components/datepicker/datepicker/datepicker.component.js +3 -3
  60. package/esm5/shared/gipi-components/datepicker/mat-datepicker/calendar-body.js +1 -1
  61. package/esm5/shared/gipi-components/datepicker/mat-datepicker/date-range-input.js +1 -1
  62. package/esm5/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.js +176 -0
  63. package/esm5/shared/gipi-components/datetime-picker/datetime-picker.module.js +85 -0
  64. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.js +119 -0
  65. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.js +747 -0
  66. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.js +332 -0
  67. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.js +30 -0
  68. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.js +7 -0
  69. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.js +7 -0
  70. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.js +377 -0
  71. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.js +89 -0
  72. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.js +1 -0
  73. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.js +495 -0
  74. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.js +160 -0
  75. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.js +248 -0
  76. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.js +49 -0
  77. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.js +145 -0
  78. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.js +3 -0
  79. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.js +141 -0
  80. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.js +20 -0
  81. package/esm5/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.js +151 -0
  82. package/esm5/shared/gipi-components/dropdown-menu/dropdown-menu.component.js +1 -1
  83. package/esm5/shared/gipi-components/form-field/form-field.component.js +1 -1
  84. package/esm5/shared/gipi-components/input-currency/input-currency.component.js +1 -1
  85. package/esm5/shared/gipi-components/input-monthpicker/input-monthpicker.component.js +1 -1
  86. package/esm5/shared/gipi-components/input-select/input-select.component.js +1 -1
  87. package/esm5/shared/gipi-components/month-year-picker/month-year-picker.component.js +1 -1
  88. package/esm5/shared/gipi-components/radio-group/radio-group.component.js +1 -1
  89. package/esm5/shared/gipi-components/range-page/range-page.component.js +1 -1
  90. package/esm5/shared/gipi-components/range-slider/range-slider.component.js +1 -1
  91. package/esm5/shared/gipi-components/select-button/select-button.component.js +1 -1
  92. package/esm5/shared/gipi-components/textarea/textarea.component.js +1 -1
  93. package/esm5/shared/shared.module.js +51 -3
  94. package/fesm2015/gipisistemas-ng-core.js +3264 -191
  95. package/fesm2015/gipisistemas-ng-core.js.map +1 -1
  96. package/fesm5/gipisistemas-ng-core.js +3475 -152
  97. package/fesm5/gipisistemas-ng-core.js.map +1 -1
  98. package/gipi-components.d.ts +16 -0
  99. package/gipisistemas-ng-core.d.ts +2 -0
  100. package/gipisistemas-ng-core.metadata.json +1 -1
  101. package/package.json +4 -4
  102. package/shared/gipi-components/datetime-picker/datetime-picker/datetime-picker.component.d.ts +40 -0
  103. package/shared/gipi-components/datetime-picker/datetime-picker.module.d.ts +2 -0
  104. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar-body.d.ts +50 -0
  105. package/shared/gipi-components/datetime-picker/mat-datetime-picker/calendar.d.ts +140 -0
  106. package/shared/gipi-components/datetime-picker/mat-datetime-picker/clock.d.ts +66 -0
  107. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-animations.d.ts +8 -0
  108. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-errors.d.ts +2 -0
  109. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-filtertype.d.ts +5 -0
  110. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-input.d.ts +98 -0
  111. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-toggle.d.ts +20 -0
  112. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker-type.d.ts +1 -0
  113. package/shared/gipi-components/datetime-picker/mat-datetime-picker/datetimepicker.d.ts +133 -0
  114. package/shared/gipi-components/datetime-picker/mat-datetime-picker/month-view.d.ts +53 -0
  115. package/shared/gipi-components/datetime-picker/mat-datetime-picker/multi-year-view.d.ts +80 -0
  116. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/adapter.module.d.ts +4 -0
  117. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-adapter.d.ts +46 -0
  118. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/datetime-formats.d.ts +20 -0
  119. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-adapter.d.ts +36 -0
  120. package/shared/gipi-components/datetime-picker/mat-datetime-picker/shared/adapter/native-datetime-formats.d.ts +2 -0
  121. package/shared/gipi-components/datetime-picker/mat-datetime-picker/year-view.d.ts +52 -0
@@ -0,0 +1,451 @@
1
+ import { __decorate, __metadata, __param } from "tslib";
2
+ import { Directionality } from '@angular/cdk/bidi';
3
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
4
+ import { ESCAPE } from '@angular/cdk/keycodes';
5
+ import { Overlay, OverlayConfig, OverlayRef, PositionStrategy, } from '@angular/cdk/overlay';
6
+ import { ComponentPortal } from '@angular/cdk/portal';
7
+ import { DOCUMENT } from '@angular/common';
8
+ import { AfterContentInit, ChangeDetectionStrategy, Component, ComponentRef, EventEmitter, Inject, Input, NgZone, OnDestroy, Optional, Output, ViewChild, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
9
+ import { MAT_DATEPICKER_SCROLL_STRATEGY } from '@angular/material/datepicker';
10
+ import { MatDialog, MatDialogRef } from '@angular/material/dialog';
11
+ import { Subject, Subscription } from 'rxjs';
12
+ import { first } from 'rxjs/operators';
13
+ import { GIPIDatetimepickerCalendarComponent, } from './calendar';
14
+ import { createMissingDateImplError } from './datetimepicker-errors';
15
+ import { GIPIDatetimeAdapter } from './shared/adapter/datetime-adapter';
16
+ /** Used to generate a unique ID for each datepicker instance. */
17
+ let datetimepickerUid = 0;
18
+ /**
19
+ * Component used as the content for the datepicker dialog and popup. We use this instead of using
20
+ * MatCalendar directly as the content so we can control the initial focus. This also gives us a
21
+ * place to put additional features of the popup that are not part of the calendar itself in the
22
+ * future. (e.g. confirmation buttons).
23
+ * @docs-private
24
+ */
25
+ let GIPIDatetimepickerContentComponent = class GIPIDatetimepickerContentComponent {
26
+ ngAfterContentInit() {
27
+ this._calendar._focusActiveCell();
28
+ }
29
+ onSelectionChange(date) {
30
+ this.datetimepicker._select(date);
31
+ this.datetimepicker.close();
32
+ }
33
+ /**
34
+ * Handles keydown event on datepicker content.
35
+ * @param event The event.
36
+ */
37
+ _handleKeydown(event) {
38
+ if (event.keyCode === ESCAPE) {
39
+ this.datetimepicker.close();
40
+ event.preventDefault();
41
+ event.stopPropagation();
42
+ }
43
+ }
44
+ };
45
+ __decorate([
46
+ ViewChild(GIPIDatetimepickerCalendarComponent, { static: true }),
47
+ __metadata("design:type", GIPIDatetimepickerCalendarComponent)
48
+ ], GIPIDatetimepickerContentComponent.prototype, "_calendar", void 0);
49
+ GIPIDatetimepickerContentComponent = __decorate([
50
+ Component({
51
+ selector: 'gipi-mat-datetime-picker-content',
52
+ template: "<gipi-mat-datetime-picker-calendar cdkTrapFocus\n class=\"mat-typography\"\n [id]=\"datetimepicker.id\"\n [attr.mode]=\"datetimepicker.mode\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\">\n</gipi-mat-datetime-picker-calendar>",
53
+ encapsulation: ViewEncapsulation.None,
54
+ changeDetection: ChangeDetectionStrategy.OnPush,
55
+ host: {
56
+ class: 'gipi-mat-datetime-picker-content',
57
+ '[class.gipi-mat-datetime-picker-content-touch]': 'datetimepicker?.touchUi',
58
+ '(keydown)': '_handleKeydown($event)',
59
+ },
60
+ styles: ["@use '@angular/material' as mat;.gipi-mat-datetime-picker-content{display:block;background-color:#fff;border-radius:4px!important;overflow:hidden;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.gipi-mat-datetime-picker-calendar{width:296px;height:405px}.gipi-mat-datetime-picker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width:480px){.gipi-mat-datetime-picker-calendar[mode=auto]{width:446px;height:328px}}.gipi-mat-datetime-picker-content-touch{display:block;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.gipi-mat-datetime-picker-dialog .mat-dialog-container{padding:0}"]
61
+ })
62
+ ], GIPIDatetimepickerContentComponent);
63
+ export { GIPIDatetimepickerContentComponent };
64
+ let GIPIDatetimepickerComponent = class GIPIDatetimepickerComponent {
65
+ constructor(_dialog, _overlay, _ngZone, _viewContainerRef, _scrollStrategy, _dateAdapter, _dir, _document) {
66
+ this._dialog = _dialog;
67
+ this._overlay = _overlay;
68
+ this._ngZone = _ngZone;
69
+ this._viewContainerRef = _viewContainerRef;
70
+ this._scrollStrategy = _scrollStrategy;
71
+ this._dateAdapter = _dateAdapter;
72
+ this._dir = _dir;
73
+ this._document = _document;
74
+ /** Whether the calendar is open. */
75
+ this.opened = false;
76
+ /** The id for the datepicker calendar. */
77
+ this.id = `gipi-mat-datetime-picker-${datetimepickerUid++}`;
78
+ /** Emits when the datepicker is disabled. */
79
+ this._disabledChange = new Subject();
80
+ this._validSelected = null;
81
+ /** The element that was focused before the datepicker was opened. */
82
+ this._focusedElementBeforeOpen = null;
83
+ this._inputSubscription = Subscription.EMPTY;
84
+ /** Active multi year view when click on year. */
85
+ this.multiYearSelector = false;
86
+ /** if true change the clock to 12 hour format. */
87
+ this.twelvehour = false;
88
+ /** The view that the calendar should start in. */
89
+ this.startView = 'month';
90
+ this.mode = 'auto';
91
+ this.timeInterval = 1;
92
+ this.ariaNextMonthLabel = 'Next month';
93
+ this.ariaPrevMonthLabel = 'Previous month';
94
+ this.ariaNextYearLabel = 'Next year';
95
+ this.ariaPrevYearLabel = 'Previous year';
96
+ /** Prevent user to select same date time */
97
+ this.preventSameDateTimeSelection = false;
98
+ this._type = 'date';
99
+ /** Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather than a popup and elements have more padding to allow for bigger touch targets. */
100
+ this._touchUi = false;
101
+ /** Emits when the datepicker has been opened. */
102
+ this.openedStream = new EventEmitter();
103
+ /** Emits when the datepicker has been closed. */
104
+ this.closedStream = new EventEmitter();
105
+ /** Emits when the view has been changed. **/
106
+ this.viewChanged = new EventEmitter();
107
+ /**
108
+ * Emits new selected date when selected date changes.
109
+ * @deprecated Switch to the `dateChange` and `dateInput` binding on the input element.
110
+ */
111
+ this.selectedChanged = new EventEmitter();
112
+ if (!this._dateAdapter) {
113
+ throw createMissingDateImplError('DateAdapter');
114
+ }
115
+ }
116
+ get startAt() {
117
+ // If an explicit startAt is set we start there, otherwise we start at whatever the currently selected value is.
118
+ return (this._startAt || (this._datepickerInput ? this._datepickerInput.value : null));
119
+ }
120
+ set startAt(date) {
121
+ this._startAt = this._dateAdapter.getValidDateOrNull(date);
122
+ }
123
+ get openOnFocus() {
124
+ return this._openOnFocus;
125
+ }
126
+ set openOnFocus(value) {
127
+ this._openOnFocus = coerceBooleanProperty(value);
128
+ }
129
+ get type() {
130
+ return this._type;
131
+ }
132
+ set type(value) {
133
+ this._type = value || 'date';
134
+ }
135
+ get touchUi() {
136
+ return this._touchUi;
137
+ }
138
+ set touchUi(value) {
139
+ this._touchUi = coerceBooleanProperty(value);
140
+ }
141
+ get disabled() {
142
+ return this._disabled === undefined && this._datepickerInput
143
+ ? this._datepickerInput.disabled
144
+ : !!this._disabled;
145
+ }
146
+ set disabled(value) {
147
+ const newValue = coerceBooleanProperty(value);
148
+ if (newValue !== this._disabled) {
149
+ this._disabled = newValue;
150
+ this._disabledChange.next(newValue);
151
+ }
152
+ }
153
+ /** The currently selected date. */
154
+ get _selected() {
155
+ return this._validSelected;
156
+ }
157
+ set _selected(value) {
158
+ this._validSelected = value;
159
+ }
160
+ /** The minimum selectable date. */
161
+ get _minDate() {
162
+ return this._datepickerInput && this._datepickerInput.min;
163
+ }
164
+ /** The maximum selectable date. */
165
+ get _maxDate() {
166
+ return this._datepickerInput && this._datepickerInput.max;
167
+ }
168
+ get _dateFilter() {
169
+ return this._datepickerInput && this._datepickerInput._dateFilter;
170
+ }
171
+ _handleFocus() {
172
+ if (!this.opened && this.openOnFocus) {
173
+ this.open();
174
+ }
175
+ }
176
+ _viewChanged(type) {
177
+ this.viewChanged.emit(type);
178
+ }
179
+ ngOnDestroy() {
180
+ this.close();
181
+ this._inputSubscription.unsubscribe();
182
+ this._disabledChange.complete();
183
+ if (this._popupRef) {
184
+ this._popupRef.dispose();
185
+ }
186
+ }
187
+ /** Selects the given date */
188
+ _select(date) {
189
+ const oldValue = this._selected;
190
+ this._selected = date;
191
+ if (!this._dateAdapter.sameDatetime(oldValue, this._selected)) {
192
+ this.selectedChanged.emit(date);
193
+ }
194
+ }
195
+ /**
196
+ * Register an input with this datepicker.
197
+ * @param input The datepicker input to register with this datepicker.
198
+ */
199
+ _registerInput(input) {
200
+ if (this._datepickerInput) {
201
+ throw Error('A MatDatepicker can only be associated with a single input.');
202
+ }
203
+ this._datepickerInput = input;
204
+ this._inputSubscription = this._datepickerInput._valueChange.subscribe((value) => (this._selected = value));
205
+ }
206
+ /** Open the calendar. */
207
+ open() {
208
+ if (this.opened || this.disabled) {
209
+ return;
210
+ }
211
+ if (!this._datepickerInput) {
212
+ throw Error('Attempted to open an MatDatepicker with no associated input.');
213
+ }
214
+ if (this._document) {
215
+ this._focusedElementBeforeOpen = this._document.activeElement;
216
+ }
217
+ this.touchUi ? this._openAsDialog() : this._openAsPopup();
218
+ this.opened = true;
219
+ this.openedStream.emit();
220
+ }
221
+ /** Close the calendar. */
222
+ close() {
223
+ if (!this.opened) {
224
+ return;
225
+ }
226
+ if (this._popupRef && this._popupRef.hasAttached()) {
227
+ this._popupRef.detach();
228
+ }
229
+ if (this._dialogRef) {
230
+ this._dialogRef.close();
231
+ this._dialogRef = null;
232
+ }
233
+ if (this._calendarPortal && this._calendarPortal.isAttached) {
234
+ this._calendarPortal.detach();
235
+ }
236
+ const completeClose = () => {
237
+ // The `_opened` could've been reset already if
238
+ // we got two events in quick succession.
239
+ if (this.opened) {
240
+ this.opened = false;
241
+ this.closedStream.emit();
242
+ this._focusedElementBeforeOpen = null;
243
+ }
244
+ };
245
+ if (this._focusedElementBeforeOpen && typeof this._focusedElementBeforeOpen.focus === 'function') {
246
+ // Because IE moves focus asynchronously, we can't count on it being restored before we've
247
+ // marked the datepicker as closed. If the event fires out of sequence and the element that
248
+ // we're refocusing opens the datepicker on focus, the user could be stuck with not being
249
+ // able to close the calendar at all. We work around it by making the logic, that marks
250
+ // the datepicker as closed, async as well.
251
+ this._focusedElementBeforeOpen.focus();
252
+ setTimeout(completeClose);
253
+ }
254
+ else {
255
+ completeClose();
256
+ }
257
+ }
258
+ /** Open the calendar as a dialog. */
259
+ _openAsDialog() {
260
+ this._dialogRef = this._dialog.open(GIPIDatetimepickerContentComponent, {
261
+ direction: this._dir ? this._dir.value : 'ltr',
262
+ viewContainerRef: this._viewContainerRef,
263
+ panelClass: 'gipi-mat-datetime-picker-dialog',
264
+ });
265
+ this._dialogRef.afterClosed().subscribe(() => this.close());
266
+ this._dialogRef.componentInstance.datetimepicker = this;
267
+ }
268
+ /** Open the calendar as a popup. */
269
+ _openAsPopup() {
270
+ if (!this._calendarPortal) {
271
+ this._calendarPortal = new ComponentPortal(GIPIDatetimepickerContentComponent, this._viewContainerRef);
272
+ }
273
+ if (!this._popupRef) {
274
+ this._createPopup();
275
+ }
276
+ if (!this._popupRef.hasAttached()) {
277
+ const componentRef = this._popupRef.attach(this._calendarPortal);
278
+ componentRef.instance.datetimepicker = this;
279
+ // Update the position once the calendar has rendered.
280
+ this._ngZone.onStable
281
+ .asObservable()
282
+ .pipe(first())
283
+ .subscribe(() => this._popupRef.updatePosition());
284
+ }
285
+ this._popupRef.backdropClick().subscribe(() => this.close());
286
+ }
287
+ /** Create the popup. */
288
+ _createPopup() {
289
+ const overlayConfig = new OverlayConfig({
290
+ positionStrategy: this._createPopupPositionStrategy(),
291
+ hasBackdrop: true,
292
+ backdropClass: 'mat-overlay-transparent-backdrop',
293
+ direction: this._dir ? this._dir.value : 'ltr',
294
+ scrollStrategy: this._scrollStrategy(),
295
+ panelClass: 'gipi-mat-datetime-picker-popup',
296
+ });
297
+ this._popupRef = this._overlay.create(overlayConfig);
298
+ }
299
+ /** Create the popup PositionStrategy. */
300
+ _createPopupPositionStrategy() {
301
+ return this._overlay
302
+ .position()
303
+ .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())
304
+ .withTransformOriginOn('.gipi-mat-datetime-picker-content')
305
+ .withFlexibleDimensions(false)
306
+ .withViewportMargin(8)
307
+ .withLockedPosition()
308
+ .withPositions([
309
+ {
310
+ originX: 'start',
311
+ originY: 'bottom',
312
+ overlayX: 'start',
313
+ overlayY: 'top',
314
+ },
315
+ {
316
+ originX: 'start',
317
+ originY: 'top',
318
+ overlayX: 'start',
319
+ overlayY: 'bottom',
320
+ },
321
+ {
322
+ originX: 'end',
323
+ originY: 'bottom',
324
+ overlayX: 'end',
325
+ overlayY: 'top',
326
+ },
327
+ {
328
+ originX: 'end',
329
+ originY: 'top',
330
+ overlayX: 'end',
331
+ overlayY: 'bottom',
332
+ },
333
+ ]);
334
+ }
335
+ };
336
+ GIPIDatetimepickerComponent.ctorParameters = () => [
337
+ { type: MatDialog },
338
+ { type: Overlay },
339
+ { type: NgZone },
340
+ { type: ViewContainerRef },
341
+ { type: undefined, decorators: [{ type: Inject, args: [MAT_DATEPICKER_SCROLL_STRATEGY,] }] },
342
+ { type: GIPIDatetimeAdapter, decorators: [{ type: Optional }] },
343
+ { type: Directionality, decorators: [{ type: Optional }] },
344
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
345
+ ];
346
+ __decorate([
347
+ Input(),
348
+ __metadata("design:type", Boolean)
349
+ ], GIPIDatetimepickerComponent.prototype, "multiYearSelector", void 0);
350
+ __decorate([
351
+ Input(),
352
+ __metadata("design:type", Boolean)
353
+ ], GIPIDatetimepickerComponent.prototype, "twelvehour", void 0);
354
+ __decorate([
355
+ Input(),
356
+ __metadata("design:type", String)
357
+ ], GIPIDatetimepickerComponent.prototype, "startView", void 0);
358
+ __decorate([
359
+ Input(),
360
+ __metadata("design:type", String)
361
+ ], GIPIDatetimepickerComponent.prototype, "mode", void 0);
362
+ __decorate([
363
+ Input(),
364
+ __metadata("design:type", Number)
365
+ ], GIPIDatetimepickerComponent.prototype, "timeInterval", void 0);
366
+ __decorate([
367
+ Input(),
368
+ __metadata("design:type", Object)
369
+ ], GIPIDatetimepickerComponent.prototype, "ariaNextMonthLabel", void 0);
370
+ __decorate([
371
+ Input(),
372
+ __metadata("design:type", Object)
373
+ ], GIPIDatetimepickerComponent.prototype, "ariaPrevMonthLabel", void 0);
374
+ __decorate([
375
+ Input(),
376
+ __metadata("design:type", Object)
377
+ ], GIPIDatetimepickerComponent.prototype, "ariaNextYearLabel", void 0);
378
+ __decorate([
379
+ Input(),
380
+ __metadata("design:type", Object)
381
+ ], GIPIDatetimepickerComponent.prototype, "ariaPrevYearLabel", void 0);
382
+ __decorate([
383
+ Input(),
384
+ __metadata("design:type", Object)
385
+ ], GIPIDatetimepickerComponent.prototype, "preventSameDateTimeSelection", void 0);
386
+ __decorate([
387
+ Input(),
388
+ __metadata("design:type", Object)
389
+ ], GIPIDatetimepickerComponent.prototype, "panelClass", void 0);
390
+ __decorate([
391
+ Input(),
392
+ __metadata("design:type", Object),
393
+ __metadata("design:paramtypes", [Object])
394
+ ], GIPIDatetimepickerComponent.prototype, "startAt", null);
395
+ __decorate([
396
+ Input(),
397
+ __metadata("design:type", Boolean),
398
+ __metadata("design:paramtypes", [Boolean])
399
+ ], GIPIDatetimepickerComponent.prototype, "openOnFocus", null);
400
+ __decorate([
401
+ Input(),
402
+ __metadata("design:type", String),
403
+ __metadata("design:paramtypes", [String])
404
+ ], GIPIDatetimepickerComponent.prototype, "type", null);
405
+ __decorate([
406
+ Input(),
407
+ __metadata("design:type", Boolean),
408
+ __metadata("design:paramtypes", [Boolean])
409
+ ], GIPIDatetimepickerComponent.prototype, "touchUi", null);
410
+ __decorate([
411
+ Input(),
412
+ __metadata("design:type", Boolean),
413
+ __metadata("design:paramtypes", [Boolean])
414
+ ], GIPIDatetimepickerComponent.prototype, "disabled", null);
415
+ __decorate([
416
+ Output('opened'),
417
+ __metadata("design:type", EventEmitter)
418
+ ], GIPIDatetimepickerComponent.prototype, "openedStream", void 0);
419
+ __decorate([
420
+ Output('closed'),
421
+ __metadata("design:type", EventEmitter)
422
+ ], GIPIDatetimepickerComponent.prototype, "closedStream", void 0);
423
+ __decorate([
424
+ Output(),
425
+ __metadata("design:type", EventEmitter)
426
+ ], GIPIDatetimepickerComponent.prototype, "viewChanged", void 0);
427
+ __decorate([
428
+ Output(),
429
+ __metadata("design:type", Object)
430
+ ], GIPIDatetimepickerComponent.prototype, "selectedChanged", void 0);
431
+ GIPIDatetimepickerComponent = __decorate([
432
+ Component({
433
+ selector: 'gipi-mat-datetime-picker',
434
+ exportAs: 'gipiDatetimePicker',
435
+ template: '',
436
+ changeDetection: ChangeDetectionStrategy.OnPush,
437
+ encapsulation: ViewEncapsulation.None,
438
+ preserveWhitespaces: false
439
+ }),
440
+ __param(4, Inject(MAT_DATEPICKER_SCROLL_STRATEGY)),
441
+ __param(5, Optional()),
442
+ __param(6, Optional()),
443
+ __param(7, Optional()), __param(7, Inject(DOCUMENT)),
444
+ __metadata("design:paramtypes", [MatDialog,
445
+ Overlay,
446
+ NgZone,
447
+ ViewContainerRef, Object, GIPIDatetimeAdapter,
448
+ Directionality, Object])
449
+ ], GIPIDatetimepickerComponent);
450
+ export { GIPIDatetimepickerComponent };
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVwaWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZ2lwaXNpc3RlbWFzL25nLWNvcmUvIiwic291cmNlcyI6WyJzaGFyZWQvZ2lwaS1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlci9tYXQtZGF0ZXRpbWUtcGlja2VyL2RhdGV0aW1lcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUN0TixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQW9CLG1DQUFtQyxHQUFHLE1BQU0sWUFBWSxD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QUEyQjtJQVJ2QyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsUUFBUSxFQUFFLEVBQUU7UUFDWixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtRQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtRQUNyQyxtQkFBbUIsRUFBRSxLQUFLO0tBQzdCLENBQUM7SUFpSk8sV0FBQSxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUN0QyxXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQ1YsV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtxQ0FQWixTQUFTO1FBQ1IsT0FBTztRQUNSLE1BQU07UUFDSSxnQkFBZ0IsVUFFVCxtQkFBbUI7UUFDM0IsY0FBYztHQWxKbkMsMkJBQTJCLENBaVZ2QztTQWpWWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBFU0NBUEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgUG9zaXRpb25TdHJhdGVneSwgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9EQVRFUElDS0VSX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgR0lQSUNhbGVuZGFyVmlldywgR0lQSURhdGV0aW1lcGlja2VyQ2FsZW5kYXJDb21wb25lbnQsIH0gZnJvbSAnLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvciB9IGZyb20gJy4vZGF0ZXRpbWVwaWNrZXItZXJyb3JzJztcbmltcG9ydCB7IEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWZpbHRlcnR5cGUnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lcGlja2VySW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWlucHV0JztcbmltcG9ydCB7IEdJUElEYXRldGltZXBpY2tlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLXR5cGUnO1xuaW1wb3J0IHsgR0lQSURhdGV0aW1lQWRhcHRlciB9IGZyb20gJy4vc2hhcmVkL2FkYXB0ZXIvZGF0ZXRpbWUtYWRhcHRlcic7XG5cbmV4cG9ydCB0eXBlIEdJUElEYXRldGltZXBpY2tlck1vZGUgPSAnYXV0bycgfCAncG9ydHJhaXQnIHwgJ2xhbmRzY2FwZSc7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciBlYWNoIGRhdGVwaWNrZXIgaW5zdGFuY2UuICovXG5sZXQgZGF0ZXRpbWVwaWNrZXJVaWQgPSAwO1xuXG4vKipcbiAqIENvbXBvbmVudCB1c2VkIGFzIHRoZSBjb250ZW50IGZvciB0aGUgZGF0ZXBpY2tlciBkaWFsb2cgYW5kIHBvcHVwLiBXZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBNYXRDYWxlbmRhciBkaXJlY3RseSBhcyB0aGUgY29udGVudCBzbyB3ZSBjYW4gY29udHJvbCB0aGUgaW5pdGlhbCBmb2N1cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFcbiAqIHBsYWNlIHRvIHB1dCBhZGRpdGlvbmFsIGZlYXR1cmVzIG9mIHRoZSBwb3B1cCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY2FsZW5kYXIgaXRzZWxmIGluIHRoZVxuICogZnV0dXJlLiAoZS5nLiBjb25maXJtYXRpb24gYnV0dG9ucykuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnZGF0ZXRpbWVwaWNrZXItY29udGVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0ZXRpbWVwaWNrZXItY29udGVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLWNvbnRlbnQnLFxuICAgICAgICAnW2NsYXNzLmdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1jb250ZW50LXRvdWNoXSc6ICdkYXRldGltZXBpY2tlcj8udG91Y2hVaScsXG4gICAgICAgICcoa2V5ZG93biknOiAnX2hhbmRsZUtleWRvd24oJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgR0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudDxEPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXG4gICAgQFZpZXdDaGlsZChHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgX2NhbGVuZGFyOiBHSVBJRGF0ZXRpbWVwaWNrZXJDYWxlbmRhckNvbXBvbmVudDxEPjtcblxuICAgIGRhdGV0aW1lcGlja2VyOiBHSVBJRGF0ZXRpbWVwaWNrZXJDb21wb25lbnQ8RD47XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLl9mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbkNoYW5nZShkYXRlOiBEKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXIuX3NlbGVjdChkYXRlKTtcbiAgICAgICAgdGhpcy5kYXRldGltZXBpY2tlci5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5ZG93biBldmVudCBvbiBkYXRlcGlja2VyIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudC5cbiAgICAgKi9cbiAgICBfaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGV0aW1lcGlja2VyLmNsb3NlKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyJyxcbiAgICBleHBvcnRBczogJ2dpcGlEYXRldGltZVBpY2tlcicsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEdJUElEYXRldGltZXBpY2tlckNvbXBvbmVudDxEPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgb3Blbi4gKi9cbiAgICBvcGVuZWQgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgaWQgZm9yIHRoZSBkYXRlcGlja2VyIGNhbGVuZGFyLiAqL1xuICAgIGlkID0gYGdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci0ke2RhdGV0aW1lcGlja2VyVWlkKyt9YDtcblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCB0aGlzIGRhdGVwaWNrZXIgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xuICAgIF9kYXRlcGlja2VySW5wdXQ6IEdJUElEYXRldGltZXBpY2tlcklucHV0RGlyZWN0aXZlPEQ+O1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaXMgZGlzYWJsZWQuICovXG4gICAgX2Rpc2FibGVkQ2hhbmdlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgX3ZhbGlkU2VsZWN0ZWQ6IEQgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBBIHJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSB3aGVuIHRoZSBjYWxlbmRhciBpcyBvcGVuZWQgYXMgYSBwb3B1cC4gKi9cbiAgICBwcml2YXRlIF9wb3B1cFJlZjogT3ZlcmxheVJlZjtcblxuICAgIC8qKiBBIHJlZmVyZW5jZSB0byB0aGUgZGlhbG9nIHdoZW4gdGhlIGNhbGVuZGFyIGlzIG9wZW5lZCBhcyBhIGRpYWxvZy4gKi9cbiAgICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+IHwgbnVsbDtcblxuICAgIC8qKiBBIHBvcnRhbCBjb250YWluaW5nIHRoZSBjYWxlbmRhciBmb3IgdGhpcyBkYXRlcGlja2VyLiAqL1xuICAgIHByaXZhdGUgX2NhbGVuZGFyUG9ydGFsOiBDb21wb25lbnRQb3J0YWw8R0lQSURhdGV0aW1lcGlja2VyQ29udGVudENvbXBvbmVudDxEPj47XG5cbiAgICAvKiogVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGRhdGVwaWNrZXIgd2FzIG9wZW5lZC4gKi9cbiAgICBwcml2YXRlIF9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaW5wdXRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICAvKiogQWN0aXZlIG11bHRpIHllYXIgdmlldyB3aGVuIGNsaWNrIG9uIHllYXIuICovXG4gICAgQElucHV0KCkgbXVsdGlZZWFyU2VsZWN0b3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBpZiB0cnVlIGNoYW5nZSB0aGUgY2xvY2sgdG8gMTIgaG91ciBmb3JtYXQuICovXG4gICAgQElucHV0KCkgdHdlbHZlaG91cjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRoZSB2aWV3IHRoYXQgdGhlIGNhbGVuZGFyIHNob3VsZCBzdGFydCBpbi4gKi9cbiAgICBASW5wdXQoKSBzdGFydFZpZXc6IEdJUElDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIEBJbnB1dCgpIG1vZGU6IEdJUElEYXRldGltZXBpY2tlck1vZGUgPSAnYXV0byc7XG4gICAgQElucHV0KCkgdGltZUludGVydmFsOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0TW9udGhMYWJlbCA9ICdOZXh0IG1vbnRoJztcbiAgICBASW5wdXQoKSBhcmlhUHJldk1vbnRoTGFiZWwgPSAnUHJldmlvdXMgbW9udGgnO1xuICAgIEBJbnB1dCgpIGFyaWFOZXh0WWVhckxhYmVsID0gJ05leHQgeWVhcic7XG4gICAgQElucHV0KCkgYXJpYVByZXZZZWFyTGFiZWwgPSAnUHJldmlvdXMgeWVhcic7XG5cbiAgICAvKiogUHJldmVudCB1c2VyIHRvIHNlbGVjdCBzYW1lIGRhdGUgdGltZSAqL1xuICAgIEBJbnB1dCgpIHByZXZlbnRTYW1lRGF0ZVRpbWVTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIC8qKiBDbGFzc2VzIHRvIGJlIHBhc3NlZCB0byB0aGUgZGF0ZSBwaWNrZXIgcGFuZWwuIFN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCBhcyBgbmdDbGFzc2AuICovXG4gICAgQElucHV0KCkgcGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW107XG5cblxuICAgIC8qKiBUaGUgZGF0ZSB0byBvcGVuIHRoZSBjYWxlbmRhciB0byBpbml0aWFsbHkuICovXG4gICAgcHJpdmF0ZSBfc3RhcnRBdDogRCB8IG51bGw7XG4gICAgQElucHV0KCkgZ2V0IHN0YXJ0QXQoKTogRCB8IG51bGwge1xuICAgICAgICAvLyBJZiBhbiBleHBsaWNpdCBzdGFydEF0IGlzIHNldCB3ZSBzdGFydCB0aGVyZSwgb3RoZXJ3aXNlIHdlIHN0YXJ0IGF0IHdoYXRldmVyIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUgaXMuXG4gICAgICAgIHJldHVybiAodGhpcy5fc3RhcnRBdCB8fCAodGhpcy5fZGF0ZXBpY2tlcklucHV0ID8gdGhpcy5fZGF0ZXBpY2tlcklucHV0LnZhbHVlIDogbnVsbCkpO1xuICAgIH1cbiAgICBzZXQgc3RhcnRBdChkYXRlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9zdGFydEF0ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29wZW5PbkZvY3VzOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGdldCBvcGVuT25Gb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW5PbkZvY3VzO1xuICAgIH1cbiAgICBzZXQgb3Blbk9uRm9jdXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fb3Blbk9uRm9jdXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3R5cGU6IEdJUElEYXRldGltZXBpY2tlclR5cGUgPSAnZGF0ZSc7XG4gICAgQElucHV0KCkgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cbiAgICBzZXQgdHlwZSh2YWx1ZTogR0lQSURhdGV0aW1lcGlja2VyVHlwZSkge1xuICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUgfHwgJ2RhdGUnO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBVSSBpcyBpbiB0b3VjaCBtb2RlLiBJbiB0b3VjaCBtb2RlIHRoZSBjYWxlbmRhciBvcGVucyBpbiBhIGRpYWxvZyByYXRoZXIgdGhhbiBhIHBvcHVwIGFuZCBlbGVtZW50cyBoYXZlIG1vcmUgcGFkZGluZyB0byBhbGxvdyBmb3IgYmlnZ2VyIHRvdWNoIHRhcmdldHMuICovXG4gICAgcHJpdmF0ZSBfdG91Y2hVaSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGdldCB0b3VjaFVpKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG91Y2hVaTtcbiAgICB9XG4gICAgc2V0IHRvdWNoVWkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fdG91Y2hVaSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGRhdGVwaWNrZXIgcG9wLXVwIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dFxuICAgICAgICAgICAgPyB0aGlzLl9kYXRlcGlja2VySW5wdXQuZGlzYWJsZWRcbiAgICAgICAgICAgIDogISF0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkQ2hhbmdlLm5leHQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaGFzIGJlZW4gb3BlbmVkLiAqL1xuICAgIEBPdXRwdXQoJ29wZW5lZCcpIG9wZW5lZFN0cmVhbTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRhdGVwaWNrZXIgaGFzIGJlZW4gY2xvc2VkLiAqL1xuICAgIEBPdXRwdXQoJ2Nsb3NlZCcpIGNsb3NlZFN0cmVhbTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHZpZXcgaGFzIGJlZW4gY2hhbmdlZC4gKiovXG4gICAgQE91dHB1dCgpIHZpZXdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8R0lQSUNhbGVuZGFyVmlldz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdJUElDYWxlbmRhclZpZXc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBuZXcgc2VsZWN0ZWQgZGF0ZSB3aGVuIHNlbGVjdGVkIGRhdGUgY2hhbmdlcy5cbiAgICAgKiBAZGVwcmVjYXRlZCBTd2l0Y2ggdG8gdGhlIGBkYXRlQ2hhbmdlYCBhbmQgYGRhdGVJbnB1dGAgYmluZGluZyBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEPigpO1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS4gKi9cbiAgICBnZXQgX3NlbGVjdGVkKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkU2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgc2V0IF9zZWxlY3RlZCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRTZWxlY3RlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgZ2V0IF9taW5EYXRlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCAmJiB0aGlzLl9kYXRlcGlja2VySW5wdXQubWluO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWF4aW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgZ2V0IF9tYXhEYXRlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCAmJiB0aGlzLl9kYXRlcGlja2VySW5wdXQubWF4O1xuICAgIH1cblxuICAgIGdldCBfZGF0ZUZpbHRlcigpOiAoZGF0ZTogRCB8IG51bGwsIHR5cGU6IEdJUElEYXRldGltZXBpY2tlckZpbHRlclR5cGUpID0+IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZXBpY2tlcklucHV0ICYmIHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5fZGF0ZUZpbHRlcjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBASW5qZWN0KE1BVF9EQVRFUElDS0VSX1NDUk9MTF9TVFJBVEVHWSkgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3ksXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBHSVBJRGF0ZXRpbWVBZGFwdGVyPEQ+LFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55XG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yKCdEYXRlQWRhcHRlcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZUZvY3VzKCkge1xuICAgICAgICBpZiAoIXRoaXMub3BlbmVkICYmIHRoaXMub3Blbk9uRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ZpZXdDaGFuZ2VkKHR5cGU6IEdJUElDYWxlbmRhclZpZXcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlZC5lbWl0KHR5cGUpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2lucHV0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cFJlZi5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0cyB0aGUgZ2l2ZW4gZGF0ZSAqL1xuICAgIF9zZWxlY3QoZGF0ZTogRCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NlbGVjdGVkO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGRhdGU7XG4gICAgICAgIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGV0aW1lKG9sZFZhbHVlLCB0aGlzLl9zZWxlY3RlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2VkLmVtaXQoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhbiBpbnB1dCB3aXRoIHRoaXMgZGF0ZXBpY2tlci5cbiAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGRhdGVwaWNrZXIgaW5wdXQgdG8gcmVnaXN0ZXIgd2l0aCB0aGlzIGRhdGVwaWNrZXIuXG4gICAgICovXG4gICAgX3JlZ2lzdGVySW5wdXQoaW5wdXQ6IEdJUElEYXRldGltZXBpY2tlcklucHV0RGlyZWN0aXZlPEQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRlcGlja2VySW5wdXQpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBIE1hdERhdGVwaWNrZXIgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGVwaWNrZXJJbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLl9pbnB1dFN1YnNjcmlwdGlvbiA9IHRoaXMuX2RhdGVwaWNrZXJJbnB1dC5fdmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogRCB8IG51bGwpID0+ICh0aGlzLl9zZWxlY3RlZCA9IHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqIE9wZW4gdGhlIGNhbGVuZGFyLiAqL1xuICAgIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5lZCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9kYXRlcGlja2VySW5wdXQpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBdHRlbXB0ZWQgdG8gb3BlbiBhbiBNYXREYXRlcGlja2VyIHdpdGggbm8gYXNzb2NpYXRlZCBpbnB1dC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiA9IHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdWNoVWkgPyB0aGlzLl9vcGVuQXNEaWFsb2coKSA6IHRoaXMuX29wZW5Bc1BvcHVwKCk7XG4gICAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuZWRTdHJlYW0uZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKiBDbG9zZSB0aGUgY2FsZW5kYXIuICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcG9wdXBSZWYgJiYgdGhpcy5fcG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWYuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclBvcnRhbCAmJiB0aGlzLl9jYWxlbmRhclBvcnRhbC5pc0F0dGFjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclBvcnRhbC5kZXRhY2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlQ2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgYF9vcGVuZWRgIGNvdWxkJ3ZlIGJlZW4gcmVzZXQgYWxyZWFkeSBpZlxuICAgICAgICAgICAgLy8gd2UgZ290IHR3byBldmVudHMgaW4gcXVpY2sgc3VjY2Vzc2lvbi5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZWRTdHJlYW0uZW1pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiAmJiB0eXBlb2YgdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBCZWNhdXNlIElFIG1vdmVzIGZvY3VzIGFzeW5jaHJvbm91c2x5LCB3ZSBjYW4ndCBjb3VudCBvbiBpdCBiZWluZyByZXN0b3JlZCBiZWZvcmUgd2UndmVcbiAgICAgICAgICAgIC8vIG1hcmtlZCB0aGUgZGF0ZXBpY2tlciBhcyBjbG9zZWQuIElmIHRoZSBldmVudCBmaXJlcyBvdXQgb2Ygc2VxdWVuY2UgYW5kIHRoZSBlbGVtZW50IHRoYXRcbiAgICAgICAgICAgIC8vIHdlJ3JlIHJlZm9jdXNpbmcgb3BlbnMgdGhlIGRhdGVwaWNrZXIgb24gZm9jdXMsIHRoZSB1c2VyIGNvdWxkIGJlIHN0dWNrIHdpdGggbm90IGJlaW5nXG4gICAgICAgICAgICAvLyBhYmxlIHRvIGNsb3NlIHRoZSBjYWxlbmRhciBhdCBhbGwuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IG1ha2luZyB0aGUgbG9naWMsIHRoYXQgbWFya3NcbiAgICAgICAgICAgIC8vIHRoZSBkYXRlcGlja2VyIGFzIGNsb3NlZCwgYXN5bmMgYXMgd2VsbC5cbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRFbGVtZW50QmVmb3JlT3Blbi5mb2N1cygpO1xuICAgICAgICAgICAgc2V0VGltZW91dChjb21wbGV0ZUNsb3NlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBsZXRlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBPcGVuIHRoZSBjYWxlbmRhciBhcyBhIGRpYWxvZy4gKi9cbiAgICBwcml2YXRlIF9vcGVuQXNEaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5fZGlyID8gdGhpcy5fZGlyLnZhbHVlIDogJ2x0cicsXG4gICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2dpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1kaWFsb2cnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRldGltZXBpY2tlciA9IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqIE9wZW4gdGhlIGNhbGVuZGFyIGFzIGEgcG9wdXAuICovXG4gICAgcHJpdmF0ZSBfb3BlbkFzUG9wdXAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsZW5kYXJQb3J0YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbDxHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50PEQ+PihHSVBJRGF0ZXRpbWVwaWNrZXJDb250ZW50Q29tcG9uZW50LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3BvcHVwUmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEdJUElEYXRldGltZXBpY2tlckNvbnRlbnRDb21wb25lbnQ8RD4+ID0gdGhpcy5fcG9wdXBSZWYuYXR0YWNoKHRoaXMuX2NhbGVuZGFyUG9ydGFsKTtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kYXRldGltZXBpY2tlciA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb25jZSB0aGUgY2FsZW5kYXIgaGFzIHJlbmRlcmVkLlxuICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3BvcHVwUmVmLnVwZGF0ZVBvc2l0aW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9wdXBSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgdGhlIHBvcHVwLiAqL1xuICAgIHByaXZhdGUgX2NyZWF0ZVBvcHVwKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KCksXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdtYXQtb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA6ICdsdHInLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX3Njcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnZ2lwaS1tYXQtZGF0ZXRpbWUtcGlja2VyLXBvcHVwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXBSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlIHRoZSBwb3B1cCBQb3NpdGlvblN0cmF0ZWd5LiAqL1xuICAgIHByaXZhdGUgX2NyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSgpOiBQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlcbiAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9kYXRlcGlja2VySW5wdXQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpKVxuICAgICAgICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLmdpcGktbWF0LWRhdGV0aW1lLXBpY2tlci1jb250ZW50JylcbiAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgIH1cblxufVxuIl19