cps-ui-kit 0.165.0 → 17.1.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.
Files changed (166) hide show
  1. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +824 -0
  2. package/esm2022/lib/components/cps-button/cps-button.component.mjs +190 -0
  3. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +235 -0
  4. package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +149 -0
  5. package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +94 -0
  6. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +382 -0
  7. package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +209 -0
  8. package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +138 -0
  9. package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +193 -0
  10. package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +61 -0
  11. package/esm2022/lib/components/cps-input/cps-input.component.mjs +386 -0
  12. package/{esm2020 → esm2022}/lib/components/cps-loader/cps-loader.component.mjs +5 -5
  13. package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +552 -0
  14. package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +114 -0
  15. package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +30 -0
  16. package/{esm2020 → esm2022}/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +7 -7
  19. package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +55 -0
  20. package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +158 -0
  21. package/esm2022/lib/components/cps-select/cps-select.component.mjs +615 -0
  22. package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +110 -0
  23. package/{esm2020 → esm2022}/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +4 -4
  24. package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +303 -0
  25. package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +79 -0
  26. package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +408 -0
  27. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +149 -0
  28. package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +88 -0
  29. package/esm2022/lib/components/cps-table/cps-table.component.mjs +941 -0
  30. package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +181 -0
  31. package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +5 -5
  32. package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +5 -5
  33. package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +5 -5
  34. package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +220 -0
  35. package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +136 -0
  36. package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +291 -0
  37. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +351 -0
  38. package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +251 -0
  39. package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +87 -0
  40. package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +1196 -0
  41. package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +5 -5
  42. package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +5 -5
  43. package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +5 -5
  44. package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +5 -5
  45. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +43 -0
  46. package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +354 -0
  47. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +619 -0
  48. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +257 -0
  49. package/{esm2020 → esm2022}/lib/pipes/internal/check-option-selected.pipe.mjs +4 -4
  50. package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +25 -0
  51. package/{esm2020 → esm2022}/lib/pipes/internal/label-by-value.pipe.mjs +4 -4
  52. package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +99 -0
  53. package/{esm2020 → esm2022}/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +5 -5
  54. package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +470 -0
  55. package/{esm2020 → esm2022}/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +5 -5
  56. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +3 -0
  57. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +126 -0
  58. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +91 -0
  59. package/{esm2020 → esm2022}/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +23 -23
  60. package/esm2022/lib/utils/colors-utils.mjs +57 -0
  61. package/esm2022/lib/utils/internal/size-utils.mjs +24 -0
  62. package/{esm2020 → esm2022}/public-api.mjs +2 -2
  63. package/{fesm2020 → fesm2022}/cps-ui-kit.mjs +481 -391
  64. package/fesm2022/cps-ui-kit.mjs.map +1 -0
  65. package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
  66. package/lib/components/cps-button/cps-button.component.d.ts +1 -1
  67. package/lib/components/cps-button-toggle/cps-button-toggle.component.d.ts +2 -2
  68. package/lib/components/cps-checkbox/cps-checkbox.component.d.ts +2 -2
  69. package/lib/components/cps-chip/cps-chip.component.d.ts +1 -1
  70. package/lib/components/cps-datepicker/cps-datepicker.component.d.ts +2 -2
  71. package/lib/components/cps-expansion-panel/cps-expansion-panel.component.d.ts +1 -1
  72. package/lib/components/cps-file-upload/cps-file-upload.component.d.ts +1 -1
  73. package/lib/components/cps-icon/cps-icon.component.d.ts +1 -1
  74. package/lib/components/cps-info-circle/cps-info-circle.component.d.ts +2 -2
  75. package/lib/components/cps-input/cps-input.component.d.ts +2 -2
  76. package/lib/components/cps-loader/cps-loader.component.d.ts +1 -1
  77. package/lib/components/cps-menu/cps-menu.component.d.ts +1 -1
  78. package/lib/components/cps-paginator/cps-paginator.component.d.ts +1 -1
  79. package/lib/components/cps-progress-circular/cps-progress-circular.component.d.ts +1 -1
  80. package/lib/components/cps-progress-linear/cps-progress-linear.component.d.ts +1 -1
  81. package/lib/components/cps-radio-group/cps-radio/cps-radio.component.d.ts +1 -1
  82. package/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.d.ts +1 -1
  83. package/lib/components/cps-radio-group/cps-radio-group.component.d.ts +2 -2
  84. package/lib/components/cps-select/cps-select.component.d.ts +2 -2
  85. package/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.d.ts +1 -1
  86. package/lib/components/cps-tab-group/cps-tab/cps-tab.component.d.ts +1 -1
  87. package/lib/components/cps-tab-group/cps-tab-group.component.d.ts +1 -1
  88. package/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.d.ts +1 -1
  89. package/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.d.ts +1 -1
  90. package/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.d.ts +1 -1
  91. package/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.d.ts +1 -1
  92. package/lib/components/cps-table/cps-table.component.d.ts +1 -1
  93. package/lib/components/cps-table/directives/cps-table-column-filter.directive.d.ts +1 -1
  94. package/lib/components/cps-table/directives/cps-table-column-sortable.directive.d.ts +1 -1
  95. package/lib/components/cps-table/directives/cps-table-row-selectable.directive.d.ts +1 -1
  96. package/lib/components/cps-tag/cps-tag.component.d.ts +1 -1
  97. package/lib/components/cps-textarea/cps-textarea.component.d.ts +2 -2
  98. package/lib/components/cps-timepicker/cps-timepicker.component.d.ts +2 -2
  99. package/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.d.ts +1 -1
  100. package/lib/components/cps-tree-select/cps-tree-select.component.d.ts +1 -1
  101. package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +4 -4
  102. package/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.d.ts +1 -1
  103. package/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.d.ts +1 -1
  104. package/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.d.ts +1 -1
  105. package/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.d.ts +1 -1
  106. package/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.d.ts +2 -2
  107. package/lib/directives/{cps-tooltip.directive.d.ts → cps-tooltip/cps-tooltip.directive.d.ts} +2 -2
  108. package/lib/services/cps-dialog/cps-dialog.service.d.ts +13 -0
  109. package/lib/services/cps-dialog/utils/cps-dialog-config.d.ts +1 -1
  110. package/lib/services/cps-notification/cps-notification.service.d.ts +32 -0
  111. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +1 -1
  112. package/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.d.ts +1 -1
  113. package/package.json +12 -18
  114. package/public-api.d.ts +1 -1
  115. package/esm2020/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -824
  116. package/esm2020/lib/components/cps-button/cps-button.component.mjs +0 -190
  117. package/esm2020/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -235
  118. package/esm2020/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -149
  119. package/esm2020/lib/components/cps-chip/cps-chip.component.mjs +0 -94
  120. package/esm2020/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
  121. package/esm2020/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -209
  122. package/esm2020/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -138
  123. package/esm2020/lib/components/cps-icon/cps-icon.component.mjs +0 -193
  124. package/esm2020/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
  125. package/esm2020/lib/components/cps-input/cps-input.component.mjs +0 -386
  126. package/esm2020/lib/components/cps-menu/cps-menu.component.mjs +0 -552
  127. package/esm2020/lib/components/cps-paginator/cps-paginator.component.mjs +0 -113
  128. package/esm2020/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
  129. package/esm2020/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -55
  130. package/esm2020/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -158
  131. package/esm2020/lib/components/cps-select/cps-select.component.mjs +0 -615
  132. package/esm2020/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
  133. package/esm2020/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -299
  134. package/esm2020/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
  135. package/esm2020/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -408
  136. package/esm2020/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -148
  137. package/esm2020/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -88
  138. package/esm2020/lib/components/cps-table/cps-table.component.mjs +0 -940
  139. package/esm2020/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
  140. package/esm2020/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -210
  141. package/esm2020/lib/components/cps-tag/cps-tag.component.mjs +0 -136
  142. package/esm2020/lib/components/cps-textarea/cps-textarea.component.mjs +0 -291
  143. package/esm2020/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -351
  144. package/esm2020/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -250
  145. package/esm2020/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
  146. package/esm2020/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1192
  147. package/esm2020/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -43
  148. package/esm2020/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -334
  149. package/esm2020/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -616
  150. package/esm2020/lib/directives/cps-tooltip.directive.mjs +0 -257
  151. package/esm2020/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
  152. package/esm2020/lib/services/cps-dialog/cps-dialog.service.mjs +0 -86
  153. package/esm2020/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
  154. package/esm2020/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
  155. package/esm2020/lib/services/cps-notification/cps-notification.service.mjs +0 -94
  156. package/esm2020/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -91
  157. package/esm2020/lib/utils/colors-utils.mjs +0 -57
  158. package/esm2020/lib/utils/internal/size-utils.mjs +0 -24
  159. package/fesm2015/cps-ui-kit.mjs +0 -12086
  160. package/fesm2015/cps-ui-kit.mjs.map +0 -1
  161. package/fesm2020/cps-ui-kit.mjs.map +0 -1
  162. /package/{esm2020 → esm2022}/cps-ui-kit.mjs +0 -0
  163. /package/{esm2020 → esm2022}/lib/components/cps-table/cps-column-filter-types.mjs +0 -0
  164. /package/{esm2020 → esm2022}/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -0
@@ -1,351 +0,0 @@
1
- import { Component, EventEmitter, Input, Optional, Output, Self, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { Subscription } from 'rxjs';
5
- import { CpsButtonToggleComponent } from '../cps-button-toggle/cps-button-toggle.component';
6
- import { CpsAutocompleteComponent } from '../cps-autocomplete/cps-autocomplete.component';
7
- import { CpsInfoCircleComponent } from '../cps-info-circle/cps-info-circle.component';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/forms";
10
- import * as i2 from "@angular/common";
11
- /**
12
- * CpsTimepickerComponent allows to pick a specific time from a set of available options or input it manually.
13
- * @group Components
14
- */
15
- export class CpsTimepickerComponent {
16
- /**
17
- * Value of the timepicker.
18
- * @group Props
19
- */
20
- set value(value) {
21
- if (!value)
22
- value = undefined;
23
- this._value = value;
24
- this.onChange(value);
25
- }
26
- get value() {
27
- return this._value;
28
- }
29
- constructor(_control) {
30
- this._control = _control;
31
- this.dayPeriodOptions = [
32
- { label: 'AM', value: 'AM' },
33
- { label: 'PM', value: 'PM' }
34
- ];
35
- this.hoursOptions = [];
36
- this.minutesOptions = this._getRange(0, 59).map((m) => ({
37
- value: m.toString().padStart(2, '0'),
38
- label: m.toString().padStart(2, '0')
39
- }));
40
- this.secondsOptions = [];
41
- this._statusChangesSubscription = new Subscription();
42
- /**
43
- * Label of the timepicker.
44
- * @group Props
45
- */
46
- this.label = '';
47
- /**
48
- * Determines whether the timepicker is disabled.
49
- * @group Props
50
- */
51
- this.disabled = false;
52
- /**
53
- * Determines whether the timepicker uses 24-hour format.
54
- * @group Props
55
- */
56
- this.use24HourTime = false;
57
- /**
58
- * Determines whether the timepicker has seconds.
59
- * @group Props
60
- */
61
- this.withSeconds = false;
62
- /**
63
- * Bottom hint text for the timepicker.
64
- * @group Props
65
- */
66
- this.hint = '';
67
- /**
68
- * Hides hint and validation errors.
69
- * @group Props
70
- */
71
- this.hideDetails = false;
72
- /**
73
- * When it is not an empty string, an info icon is displayed to show text for more info.
74
- * @group Props
75
- */
76
- this.infoTooltip = '';
77
- /**
78
- * InfoTooltip class for styling.
79
- * @group Props
80
- */
81
- this.infoTooltipClass = 'cps-tooltip-content';
82
- /**
83
- * Max width of infoTooltip, of type number denoting pixels or string.
84
- * @group Props
85
- */
86
- this.infoTooltipMaxWidth = '100%';
87
- /**
88
- * Determines whether the infoTooltip is persistent.
89
- * @group Props
90
- */
91
- this.infoTooltipPersistent = false;
92
- /**
93
- * Position of infoTooltip, it can be 'top', 'bottom', 'left' or 'right'.
94
- * @group Props
95
- */
96
- this.infoTooltipPosition = 'top';
97
- /**
98
- * Callback to invoke on value change.
99
- * @param {string} string - value changed.
100
- * @group Emits
101
- */
102
- this.valueChanged = new EventEmitter();
103
- this.error = '';
104
- this.hoursError = '';
105
- this.minutesError = '';
106
- this.secondsError = '';
107
- this._value = undefined;
108
- // eslint-disable-next-line @typescript-eslint/no-empty-function
109
- this.onChange = (event) => { };
110
- // eslint-disable-next-line @typescript-eslint/no-empty-function
111
- this.onTouched = () => { };
112
- if (this._control) {
113
- this._control.valueAccessor = this;
114
- }
115
- }
116
- ngOnInit() {
117
- this._initHoursOptions();
118
- if (this.withSeconds) {
119
- this.secondsOptions = this._getRange(0, 59).map((m) => ({
120
- value: m.toString().padStart(2, '0'),
121
- label: m.toString().padStart(2, '0')
122
- }));
123
- }
124
- this._statusChangesSubscription = this._control?.statusChanges?.subscribe(() => {
125
- this._checkErrors();
126
- });
127
- }
128
- ngAfterViewInit() {
129
- if (this.hoursField)
130
- this.hoursField.isTimePickerField = true;
131
- if (this.minutesField)
132
- this.minutesField.isTimePickerField = true;
133
- if (this.secondsField)
134
- this.secondsField.isTimePickerField = true;
135
- }
136
- ngOnDestroy() {
137
- this._statusChangesSubscription?.unsubscribe();
138
- }
139
- registerOnChange(fn) {
140
- this.onChange = fn;
141
- }
142
- registerOnTouched(fn) {
143
- this.onTouched = fn;
144
- }
145
- // eslint-disable-next-line @typescript-eslint/no-empty-function
146
- setDisabledState(disabled) { }
147
- writeValue(value) {
148
- this.value = value;
149
- }
150
- onFieldBlur() {
151
- this._control?.control?.markAsTouched();
152
- this._checkErrors();
153
- }
154
- updateHours(hours) {
155
- const userInput = this.hoursField?.inputText || hours || '';
156
- if (userInput) {
157
- this._initValue();
158
- const h = parseInt(userInput, 10);
159
- if (!isNaN(h) && this.value) {
160
- if (h >= 13 && h <= 23 && !this.use24HourTime) {
161
- this.value.dayPeriod = 'PM';
162
- }
163
- }
164
- }
165
- if (this.value?.hours !== hours) {
166
- if (this.value)
167
- this.value.hours = hours;
168
- }
169
- this._tryUpdateValue();
170
- }
171
- updateMinutes(minutes) {
172
- minutes = minutes || '';
173
- if (minutes)
174
- this._initValue();
175
- if (this.value?.minutes !== minutes) {
176
- if (this.value)
177
- this.value.minutes = minutes;
178
- }
179
- this._tryUpdateValue();
180
- }
181
- updateSeconds(seconds) {
182
- seconds = seconds || '';
183
- if (seconds)
184
- this._initValue();
185
- if (this.value?.seconds !== seconds) {
186
- if (this.value)
187
- this.value.seconds = seconds;
188
- }
189
- this._tryUpdateValue();
190
- }
191
- updateDayPeriod(dayPeriod) {
192
- if (dayPeriod)
193
- this._initValue();
194
- if (this.value?.dayPeriod !== dayPeriod) {
195
- if (this.value)
196
- this.value.dayPeriod = dayPeriod;
197
- }
198
- this._tryUpdateValue();
199
- }
200
- numberOnly(event) {
201
- const charCode = event.which ? event.which : event.keyCode;
202
- if (charCode > 31 && (charCode < 48 || charCode > 57)) {
203
- return false;
204
- }
205
- return true;
206
- }
207
- _initValue() {
208
- if (!this.value) {
209
- this.value = {
210
- hours: '',
211
- minutes: ''
212
- };
213
- }
214
- if (!this.use24HourTime && !('dayPeriod' in this.value)) {
215
- this.value.dayPeriod = 'AM';
216
- }
217
- if (this.withSeconds && !('seconds' in this.value)) {
218
- this.value.seconds = '';
219
- }
220
- }
221
- _isValueValid() {
222
- if (!this.value)
223
- return false;
224
- if (!this.value.hours || !this.value.minutes)
225
- return false;
226
- if (this.withSeconds && !this.value.seconds)
227
- return false;
228
- if (!this.use24HourTime && !this.value.dayPeriod)
229
- return false;
230
- return true;
231
- }
232
- _updateErrors() {
233
- this.error = 'Time is invalid';
234
- this.hoursError = this.value?.hours ? '' : this.error;
235
- this.minutesError = this.value?.minutes ? '' : this.error;
236
- if (this.withSeconds)
237
- this.secondsError = this.value?.seconds ? '' : this.error;
238
- }
239
- _setErrors(error) {
240
- this.error = error;
241
- this.hoursError = error;
242
- this.minutesError = error;
243
- this.secondsError = this.withSeconds ? error : '';
244
- }
245
- _checkErrors() {
246
- if (!this._control)
247
- return;
248
- if (this.value && !this._isValueValid()) {
249
- this._updateErrors();
250
- return;
251
- }
252
- const errors = this._control?.errors;
253
- if (!this._control?.control?.touched || !errors) {
254
- this._setErrors('');
255
- return;
256
- }
257
- if ('required' in errors) {
258
- this._setErrors('Field is required');
259
- return;
260
- }
261
- const errArr = Object.values(errors);
262
- if (errArr.length < 1) {
263
- this._setErrors('');
264
- return;
265
- }
266
- const message = errArr.find((msg) => typeof msg === 'string');
267
- this._setErrors(message || 'Unknown error');
268
- }
269
- _initHoursOptions() {
270
- const getHourAlias = (h) => {
271
- h = h === 12 ? 0 : h + 12;
272
- return h.toString().padStart(2, '0');
273
- };
274
- this.hoursOptions = (this.use24HourTime ? this._getRange(0, 23) : this._getRange(1, 12)).map((h) => {
275
- const res = {
276
- value: h.toString().padStart(2, '0'),
277
- label: h.toString().padStart(2, '0')
278
- };
279
- if (!this.use24HourTime)
280
- res.alias = getHourAlias(h);
281
- return res;
282
- });
283
- }
284
- _updateValue(value) {
285
- this.writeValue(value);
286
- this.onChange(value);
287
- this.valueChanged.emit(value);
288
- }
289
- _tryUpdateValue() {
290
- if (this.value?.hours &&
291
- this.value?.minutes &&
292
- (!this.withSeconds || (this.withSeconds && this.value?.seconds)) &&
293
- (this.use24HourTime || (!this.use24HourTime && this.value?.dayPeriod)))
294
- this._updateValue(this.value);
295
- }
296
- _getRange(startFrom, until) {
297
- return Array.from({ length: until + 1 - startFrom }, (_, k) => k + startFrom);
298
- }
299
- }
300
- CpsTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CpsTimepickerComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
301
- CpsTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CpsTimepickerComponent, isStandalone: true, selector: "cps-timepicker", inputs: { label: "label", disabled: "disabled", use24HourTime: "use24HourTime", withSeconds: "withSeconds", hint: "hint", hideDetails: "hideDetails", infoTooltip: "infoTooltip", infoTooltipClass: "infoTooltipClass", infoTooltipMaxWidth: "infoTooltipMaxWidth", infoTooltipPersistent: "infoTooltipPersistent", infoTooltipPosition: "infoTooltipPosition", value: "value" }, outputs: { valueChanged: "valueChanged" }, viewQueries: [{ propertyName: "hoursField", first: true, predicate: ["hoursField"], descendants: true }, { propertyName: "minutesField", first: true, predicate: ["minutesField"], descendants: true }, { propertyName: "secondsField", first: true, predicate: ["secondsField"], descendants: true }], ngImport: i0, template: "<div class=\"cps-timepicker\">\n <div\n class=\"cps-timepicker-label\"\n [ngClass]=\"{ 'cps-timepicker-label-disabled': disabled }\"\n *ngIf=\"label\">\n <label>{{ label }}</label>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-timepicker-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n <div class=\"cps-timepicker-body\">\n <cps-autocomplete\n #hoursField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"hoursOptions\"\n [withOptionsAliases]=\"!use24HourTime\"\n [useOptionsAliasesWhenNoMatch]=\"true\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.hours\"\n (valueChanged)=\"updateHours($event)\"\n [externalError]=\"hoursError\"\n placeholder=\"HH\"></cps-autocomplete>\n <span class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n #minutesField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"minutesOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.minutes\"\n (valueChanged)=\"updateMinutes($event)\"\n [externalError]=\"minutesError\"\n placeholder=\"MM\"></cps-autocomplete>\n <span *ngIf=\"withSeconds\" class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n *ngIf=\"withSeconds\"\n #secondsField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"secondsOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.seconds\"\n (valueChanged)=\"updateSeconds($event)\"\n [externalError]=\"secondsError\"\n placeholder=\"SS\"></cps-autocomplete>\n <cps-button-toggle\n *ngIf=\"!use24HourTime\"\n class=\"cps-timepicker-am-pm-selector\"\n [options]=\"dayPeriodOptions\"\n [disabled]=\"disabled\"\n [value]=\"value?.dayPeriod || 'AM'\"\n (valueChanged)=\"updateDayPeriod($event)\">\n </cps-button-toggle>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-timepicker-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-timepicker-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host .cps-timepicker{display:flex;flex-direction:column}:host .cps-timepicker .cps-timepicker-label{align-items:center;display:inline-flex;margin-bottom:.2rem;color:var(--cps-color-text-dark);font-size:.875rem;font-weight:600}:host .cps-timepicker .cps-timepicker-label-info-circle{margin-left:8px}:host .cps-timepicker .cps-timepicker-label-disabled{color:var(--cps-color-text-mild)}:host .cps-timepicker-body{display:flex;flex-direction:row}:host .cps-timepicker-body .cps-timepicker-am-pm-selector{margin-left:10px;margin-top:0}:host .cps-timepicker-body .cps-timepicker-delimiter{color:var(--cps-color-text-lightest);font-size:24px;margin:0 10px}:host .cps-timepicker .cps-timepicker-hint{color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}:host .cps-timepicker .cps-timepicker-error{color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CpsButtonToggleComponent, selector: "cps-button-toggle", inputs: ["label", "options", "multiple", "disabled", "mandatory", "equalWidths", "optionTooltipPosition", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsAutocompleteComponent, selector: "cps-autocomplete", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "showChevron", "withOptionsAliases", "useOptionsAliasesWhenNoMatch", "optionAlias", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "emptyMessage", "showEmptyMessage", "virtualScroll", "numToleratedItems", "externalError", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "value"], outputs: ["valueChanged", "blurred"] }, { kind: "component", type: CpsInfoCircleComponent, selector: "cps-info-circle", inputs: ["size", "tooltipText", "tooltipPosition", "tooltipContentClass", "tooltipMaxWidth", "tooltipPersistent"] }] });
302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CpsTimepickerComponent, decorators: [{
303
- type: Component,
304
- args: [{ selector: 'cps-timepicker', standalone: true, imports: [
305
- CommonModule,
306
- FormsModule,
307
- CpsButtonToggleComponent,
308
- CpsAutocompleteComponent,
309
- CpsInfoCircleComponent
310
- ], template: "<div class=\"cps-timepicker\">\n <div\n class=\"cps-timepicker-label\"\n [ngClass]=\"{ 'cps-timepicker-label-disabled': disabled }\"\n *ngIf=\"label\">\n <label>{{ label }}</label>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-timepicker-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n <div class=\"cps-timepicker-body\">\n <cps-autocomplete\n #hoursField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"hoursOptions\"\n [withOptionsAliases]=\"!use24HourTime\"\n [useOptionsAliasesWhenNoMatch]=\"true\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.hours\"\n (valueChanged)=\"updateHours($event)\"\n [externalError]=\"hoursError\"\n placeholder=\"HH\"></cps-autocomplete>\n <span class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n #minutesField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"minutesOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.minutes\"\n (valueChanged)=\"updateMinutes($event)\"\n [externalError]=\"minutesError\"\n placeholder=\"MM\"></cps-autocomplete>\n <span *ngIf=\"withSeconds\" class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n *ngIf=\"withSeconds\"\n #secondsField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [options]=\"secondsOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.seconds\"\n (valueChanged)=\"updateSeconds($event)\"\n [externalError]=\"secondsError\"\n placeholder=\"SS\"></cps-autocomplete>\n <cps-button-toggle\n *ngIf=\"!use24HourTime\"\n class=\"cps-timepicker-am-pm-selector\"\n [options]=\"dayPeriodOptions\"\n [disabled]=\"disabled\"\n [value]=\"value?.dayPeriod || 'AM'\"\n (valueChanged)=\"updateDayPeriod($event)\">\n </cps-button-toggle>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-timepicker-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-timepicker-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host .cps-timepicker{display:flex;flex-direction:column}:host .cps-timepicker .cps-timepicker-label{align-items:center;display:inline-flex;margin-bottom:.2rem;color:var(--cps-color-text-dark);font-size:.875rem;font-weight:600}:host .cps-timepicker .cps-timepicker-label-info-circle{margin-left:8px}:host .cps-timepicker .cps-timepicker-label-disabled{color:var(--cps-color-text-mild)}:host .cps-timepicker-body{display:flex;flex-direction:row}:host .cps-timepicker-body .cps-timepicker-am-pm-selector{margin-left:10px;margin-top:0}:host .cps-timepicker-body .cps-timepicker-delimiter{color:var(--cps-color-text-lightest);font-size:24px;margin:0 10px}:host .cps-timepicker .cps-timepicker-hint{color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}:host .cps-timepicker .cps-timepicker-error{color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}\n"] }]
311
- }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
312
- type: Self
313
- }, {
314
- type: Optional
315
- }] }]; }, propDecorators: { label: [{
316
- type: Input
317
- }], disabled: [{
318
- type: Input
319
- }], use24HourTime: [{
320
- type: Input
321
- }], withSeconds: [{
322
- type: Input
323
- }], hint: [{
324
- type: Input
325
- }], hideDetails: [{
326
- type: Input
327
- }], infoTooltip: [{
328
- type: Input
329
- }], infoTooltipClass: [{
330
- type: Input
331
- }], infoTooltipMaxWidth: [{
332
- type: Input
333
- }], infoTooltipPersistent: [{
334
- type: Input
335
- }], infoTooltipPosition: [{
336
- type: Input
337
- }], value: [{
338
- type: Input
339
- }], valueChanged: [{
340
- type: Output
341
- }], hoursField: [{
342
- type: ViewChild,
343
- args: ['hoursField']
344
- }], minutesField: [{
345
- type: ViewChild,
346
- args: ['minutesField']
347
- }], secondsField: [{
348
- type: ViewChild,
349
- args: ['secondsField']
350
- }] } });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRpbWVwaWNrZXIvY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRpbWVwaWNrZXIvY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUNMLHdCQUF3QixFQUV6QixNQUFNLGtEQUFrRCxDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRTFGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7O0FBU3RGOzs7R0FHRztBQWNILE1BQU0sT0FBTyxzQkFBc0I7SUFxRmpDOzs7T0FHRztJQUNILElBQWEsS0FBSyxDQUFDLEtBQTBCO1FBQzNDLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQXlCRCxZQUF3QyxRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdkgzRCxxQkFBZ0IsR0FBRztZQUNqQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUNGLENBQUM7UUFFN0IsaUJBQVksR0FBdUMsRUFBRSxDQUFDO1FBRXRELG1CQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVKLG1CQUFjLEdBQXVDLEVBQUUsQ0FBQztRQUVoRCwrQkFBMEIsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0RTs7O1dBR0c7UUFDTSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRXBCOzs7V0FHRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7OztXQUdHO1FBQ00sa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFL0I7OztXQUdHO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFN0I7OztXQUdHO1FBQ00sU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVuQjs7O1dBR0c7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7O1dBR0c7UUFDTSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUUxQjs7O1dBR0c7UUFDTSxxQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQztRQUVsRDs7O1dBR0c7UUFDTSx3QkFBbUIsR0FBb0IsTUFBTSxDQUFDO1FBRXZEOzs7V0FHRztRQUNNLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUV2Qzs7O1dBR0c7UUFDTSx3QkFBbUIsR0FBdUIsS0FBSyxDQUFDO1FBZ0J6RDs7OztXQUlHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBV3JELFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRVYsV0FBTSxHQUF3QixTQUFTLENBQUM7UUFtQ2hELGdFQUFnRTtRQUNoRSxhQUFRLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM5QixnRUFBZ0U7UUFDaEUsY0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQW5DbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO2dCQUNwQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO2FBQ3JDLENBQUMsQ0FBQyxDQUFDO1NBQ0w7UUFFRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUN2RSxHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUNjLENBQUM7SUFDcEIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNwRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQywwQkFBMEIsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBT0QsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLGdCQUFnQixDQUFDLFFBQWlCLElBQUcsQ0FBQztJQUV0QyxVQUFVLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQzdCO2FBQ0Y7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBZTtRQUMzQixPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlO1FBQzNCLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUNuQyxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUM5QztRQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsZUFBZSxDQUFDLFNBQXNCO1FBQ3BDLElBQUksU0FBUztZQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMzRCxJQUFJLFFBQVEsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRTtZQUNyRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDN0I7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM5RCxDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRTNCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLE9BQU87U0FDUjtRQUVELElBQUksVUFBVSxJQUFJLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDckMsT0FBTztTQUNSO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsT0FBTztTQUNSO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLFlBQVksR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQ2pDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLENBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDbkUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNWLE1BQU0sR0FBRyxHQUFxRDtnQkFDNUQsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztnQkFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUNyQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO2dCQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQ0UsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztZQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUV0RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsS0FBYTtRQUNoRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2YsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUN4QixDQUFDO0lBQ0osQ0FBQzs7bUhBblZVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLCt3QkMvQ25DLGsxRkFvRkEsK2hDRDlDSSxZQUFZLGdPQUNaLFdBQVcsK0JBQ1gsd0JBQXdCLHVUQUN4Qix3QkFBd0IseXNCQUN4QixzQkFBc0I7MkZBS2Isc0JBQXNCO2tCQWJsQyxTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsd0JBQXdCO3dCQUN4Qix3QkFBd0I7d0JBQ3hCLHNCQUFzQjtxQkFDdkI7OzBCQThIWSxJQUFJOzswQkFBSSxRQUFROzRDQW5HcEIsS0FBSztzQkFBYixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsYUFBYTtzQkFBckIsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLElBQUk7c0JBQVosS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU1HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFNRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBTUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQU1PLEtBQUs7c0JBQWpCLEtBQUs7Z0JBZUksWUFBWTtzQkFBckIsTUFBTTtnQkFHUCxVQUFVO3NCQURULFNBQVM7dUJBQUMsWUFBWTtnQkFJdkIsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWM7Z0JBSXpCLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2VsZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENwc0J1dHRvblRvZ2dsZUNvbXBvbmVudCxcbiAgQ3BzQnV0dG9uVG9nZ2xlT3B0aW9uXG59IGZyb20gJy4uL2Nwcy1idXR0b24tdG9nZ2xlL2Nwcy1idXR0b24tdG9nZ2xlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtYXV0b2NvbXBsZXRlL2Nwcy1hdXRvY29tcGxldGUuY29tcG9uZW50JztcbmltcG9ydCB7IENwc1Rvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY3BzLXRvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IENwc0luZm9DaXJjbGVDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtaW5mby1jaXJjbGUvY3BzLWluZm8tY2lyY2xlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3BzVGltZSB7XG4gIGhvdXJzOiBzdHJpbmc7XG4gIG1pbnV0ZXM6IHN0cmluZztcbiAgc2Vjb25kcz86IHN0cmluZztcbiAgZGF5UGVyaW9kPzogJ0FNJyB8ICdQTSc7XG59XG5cbi8qKlxuICogQ3BzVGltZXBpY2tlckNvbXBvbmVudCBhbGxvd3MgdG8gcGljayBhIHNwZWNpZmljIHRpbWUgZnJvbSBhIHNldCBvZiBhdmFpbGFibGUgb3B0aW9ucyBvciBpbnB1dCBpdCBtYW51YWxseS5cbiAqIEBncm91cCBDb21wb25lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nwcy10aW1lcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDcHNCdXR0b25Ub2dnbGVDb21wb25lbnQsXG4gICAgQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50LFxuICAgIENwc0luZm9DaXJjbGVDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nwcy10aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDcHNUaW1lcGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgZGF5UGVyaW9kT3B0aW9ucyA9IFtcbiAgICB7IGxhYmVsOiAnQU0nLCB2YWx1ZTogJ0FNJyB9LFxuICAgIHsgbGFiZWw6ICdQTScsIHZhbHVlOiAnUE0nIH1cbiAgXSBhcyBDcHNCdXR0b25Ub2dnbGVPcHRpb25bXTtcblxuICBob3Vyc09wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICBtaW51dGVzT3B0aW9ucyA9IHRoaXMuX2dldFJhbmdlKDAsIDU5KS5tYXAoKG0pID0+ICh7XG4gICAgdmFsdWU6IG0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgIGxhYmVsOiBtLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICB9KSk7XG5cbiAgc2Vjb25kc09wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLyoqXG4gICAqIExhYmVsIG9mIHRoZSB0aW1lcGlja2VyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGltZXBpY2tlciBpcyBkaXNhYmxlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRpbWVwaWNrZXIgdXNlcyAyNC1ob3VyIGZvcm1hdC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB1c2UyNEhvdXJUaW1lID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGltZXBpY2tlciBoYXMgc2Vjb25kcy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB3aXRoU2Vjb25kcyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBCb3R0b20gaGludCB0ZXh0IGZvciB0aGUgdGltZXBpY2tlci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBoaW50ID0gJyc7XG5cbiAgLyoqXG4gICAqIEhpZGVzIGhpbnQgYW5kIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVEZXRhaWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZW4gaXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZywgYW4gaW5mbyBpY29uIGlzIGRpc3BsYXllZCB0byBzaG93IHRleHQgZm9yIG1vcmUgaW5mby5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcCA9ICcnO1xuXG4gIC8qKlxuICAgKiBJbmZvVG9vbHRpcCBjbGFzcyBmb3Igc3R5bGluZy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcENsYXNzID0gJ2Nwcy10b29sdGlwLWNvbnRlbnQnO1xuXG4gIC8qKlxuICAgKiBNYXggd2lkdGggb2YgaW5mb1Rvb2x0aXAsIG9mIHR5cGUgbnVtYmVyIGRlbm90aW5nIHBpeGVscyBvciBzdHJpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXBNYXhXaWR0aDogbnVtYmVyIHwgc3RyaW5nID0gJzEwMCUnO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGluZm9Ub29sdGlwIGlzIHBlcnNpc3RlbnQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXBQZXJzaXN0ZW50ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9uIG9mIGluZm9Ub29sdGlwLCBpdCBjYW4gYmUgJ3RvcCcsICdib3R0b20nLCAnbGVmdCcgb3IgJ3JpZ2h0Jy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBDcHNUb29sdGlwUG9zaXRpb24gPSAndG9wJztcblxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIHRpbWVwaWNrZXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBDcHNUaW1lIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBDcHNUaW1lIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHZhbHVlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHZhbHVlIGNoYW5nZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3BzVGltZT4oKTtcblxuICBAVmlld0NoaWxkKCdob3Vyc0ZpZWxkJylcbiAgaG91cnNGaWVsZCE6IENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdtaW51dGVzRmllbGQnKVxuICBtaW51dGVzRmllbGQhOiBDcHNBdXRvY29tcGxldGVDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnc2Vjb25kc0ZpZWxkJylcbiAgc2Vjb25kc0ZpZWxkPzogQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50O1xuXG4gIGVycm9yID0gJyc7XG4gIGhvdXJzRXJyb3IgPSAnJztcbiAgbWludXRlc0Vycm9yID0gJyc7XG4gIHNlY29uZHNFcnJvciA9ICcnO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBDcHNUaW1lIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKEBTZWxmKCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfY29udHJvbDogTmdDb250cm9sKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdEhvdXJzT3B0aW9ucygpO1xuXG4gICAgaWYgKHRoaXMud2l0aFNlY29uZHMpIHtcbiAgICAgIHRoaXMuc2Vjb25kc09wdGlvbnMgPSB0aGlzLl9nZXRSYW5nZSgwLCA1OSkubWFwKChtKSA9PiAoe1xuICAgICAgICB2YWx1ZTogbS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXG4gICAgICAgIGxhYmVsOiBtLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLl9jb250cm9sPy5zdGF0dXNDaGFuZ2VzPy5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoZWNrRXJyb3JzKCk7XG4gICAgICB9XG4gICAgKSBhcyBTdWJzY3JpcHRpb247XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG91cnNGaWVsZCkgdGhpcy5ob3Vyc0ZpZWxkLmlzVGltZVBpY2tlckZpZWxkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5taW51dGVzRmllbGQpIHRoaXMubWludXRlc0ZpZWxkLmlzVGltZVBpY2tlckZpZWxkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zZWNvbmRzRmllbGQpIHRoaXMuc2Vjb25kc0ZpZWxkLmlzVGltZVBpY2tlckZpZWxkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IENwc1RpbWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBvbkZpZWxkQmx1cigpIHtcbiAgICB0aGlzLl9jb250cm9sPy5jb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgfVxuXG4gIHVwZGF0ZUhvdXJzKGhvdXJzOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1c2VySW5wdXQgPSB0aGlzLmhvdXJzRmllbGQ/LmlucHV0VGV4dCB8fCBob3VycyB8fCAnJztcbiAgICBpZiAodXNlcklucHV0KSB7XG4gICAgICB0aGlzLl9pbml0VmFsdWUoKTtcbiAgICAgIGNvbnN0IGggPSBwYXJzZUludCh1c2VySW5wdXQsIDEwKTtcbiAgICAgIGlmICghaXNOYU4oaCkgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgICBpZiAoaCA+PSAxMyAmJiBoIDw9IDIzICYmICF0aGlzLnVzZTI0SG91clRpbWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLmRheVBlcmlvZCA9ICdQTSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy52YWx1ZT8uaG91cnMgIT09IGhvdXJzKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkgdGhpcy52YWx1ZS5ob3VycyA9IGhvdXJzO1xuICAgIH1cbiAgICB0aGlzLl90cnlVcGRhdGVWYWx1ZSgpO1xuICB9XG5cbiAgdXBkYXRlTWludXRlcyhtaW51dGVzOiBzdHJpbmcpIHtcbiAgICBtaW51dGVzID0gbWludXRlcyB8fCAnJztcbiAgICBpZiAobWludXRlcykgdGhpcy5faW5pdFZhbHVlKCk7XG4gICAgaWYgKHRoaXMudmFsdWU/Lm1pbnV0ZXMgIT09IG1pbnV0ZXMpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLnZhbHVlLm1pbnV0ZXMgPSBtaW51dGVzO1xuICAgIH1cbiAgICB0aGlzLl90cnlVcGRhdGVWYWx1ZSgpO1xuICB9XG5cbiAgdXBkYXRlU2Vjb25kcyhzZWNvbmRzOiBzdHJpbmcpIHtcbiAgICBzZWNvbmRzID0gc2Vjb25kcyB8fCAnJztcbiAgICBpZiAoc2Vjb25kcykgdGhpcy5faW5pdFZhbHVlKCk7XG4gICAgaWYgKHRoaXMudmFsdWU/LnNlY29uZHMgIT09IHNlY29uZHMpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLnZhbHVlLnNlY29uZHMgPSBzZWNvbmRzO1xuICAgIH1cbiAgICB0aGlzLl90cnlVcGRhdGVWYWx1ZSgpO1xuICB9XG5cbiAgdXBkYXRlRGF5UGVyaW9kKGRheVBlcmlvZDogJ0FNJyB8ICdQTScpIHtcbiAgICBpZiAoZGF5UGVyaW9kKSB0aGlzLl9pbml0VmFsdWUoKTtcbiAgICBpZiAodGhpcy52YWx1ZT8uZGF5UGVyaW9kICE9PSBkYXlQZXJpb2QpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLnZhbHVlLmRheVBlcmlvZCA9IGRheVBlcmlvZDtcbiAgICB9XG4gICAgdGhpcy5fdHJ5VXBkYXRlVmFsdWUoKTtcbiAgfVxuXG4gIG51bWJlck9ubHkoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNoYXJDb2RlID0gZXZlbnQud2hpY2ggPyBldmVudC53aGljaCA6IGV2ZW50LmtleUNvZGU7XG4gICAgaWYgKGNoYXJDb2RlID4gMzEgJiYgKGNoYXJDb2RlIDwgNDggfHwgY2hhckNvZGUgPiA1NykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0ge1xuICAgICAgICBob3VyczogJycsXG4gICAgICAgIG1pbnV0ZXM6ICcnXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMudXNlMjRIb3VyVGltZSAmJiAhKCdkYXlQZXJpb2QnIGluIHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlLmRheVBlcmlvZCA9ICdBTSc7XG4gICAgfVxuICAgIGlmICh0aGlzLndpdGhTZWNvbmRzICYmICEoJ3NlY29uZHMnIGluIHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlLnNlY29uZHMgPSAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbHVlVmFsaWQoKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnZhbHVlLmhvdXJzIHx8ICF0aGlzLnZhbHVlLm1pbnV0ZXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy53aXRoU2Vjb25kcyAmJiAhdGhpcy52YWx1ZS5zZWNvbmRzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnVzZTI0SG91clRpbWUgJiYgIXRoaXMudmFsdWUuZGF5UGVyaW9kKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVFcnJvcnMoKSB7XG4gICAgdGhpcy5lcnJvciA9ICdUaW1lIGlzIGludmFsaWQnO1xuICAgIHRoaXMuaG91cnNFcnJvciA9IHRoaXMudmFsdWU/LmhvdXJzID8gJycgOiB0aGlzLmVycm9yO1xuICAgIHRoaXMubWludXRlc0Vycm9yID0gdGhpcy52YWx1ZT8ubWludXRlcyA/ICcnIDogdGhpcy5lcnJvcjtcbiAgICBpZiAodGhpcy53aXRoU2Vjb25kcylcbiAgICAgIHRoaXMuc2Vjb25kc0Vycm9yID0gdGhpcy52YWx1ZT8uc2Vjb25kcyA/ICcnIDogdGhpcy5lcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEVycm9ycyhlcnJvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgIHRoaXMuaG91cnNFcnJvciA9IGVycm9yO1xuICAgIHRoaXMubWludXRlc0Vycm9yID0gZXJyb3I7XG4gICAgdGhpcy5zZWNvbmRzRXJyb3IgPSB0aGlzLndpdGhTZWNvbmRzID8gZXJyb3IgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRXJyb3JzKCkge1xuICAgIGlmICghdGhpcy5fY29udHJvbCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudmFsdWUgJiYgIXRoaXMuX2lzVmFsdWVWYWxpZCgpKSB7XG4gICAgICB0aGlzLl91cGRhdGVFcnJvcnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLl9jb250cm9sPy5lcnJvcnM7XG5cbiAgICBpZiAoIXRoaXMuX2NvbnRyb2w/LmNvbnRyb2w/LnRvdWNoZWQgfHwgIWVycm9ycykge1xuICAgICAgdGhpcy5fc2V0RXJyb3JzKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoJ3JlcXVpcmVkJyBpbiBlcnJvcnMpIHtcbiAgICAgIHRoaXMuX3NldEVycm9ycygnRmllbGQgaXMgcmVxdWlyZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJBcnIgPSBPYmplY3QudmFsdWVzKGVycm9ycyk7XG4gICAgaWYgKGVyckFyci5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLl9zZXRFcnJvcnMoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyQXJyLmZpbmQoKG1zZykgPT4gdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpO1xuXG4gICAgdGhpcy5fc2V0RXJyb3JzKG1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRIb3Vyc09wdGlvbnMoKSB7XG4gICAgY29uc3QgZ2V0SG91ckFsaWFzID0gKGg6IG51bWJlcikgPT4ge1xuICAgICAgaCA9IGggPT09IDEyID8gMCA6IGggKyAxMjtcbiAgICAgIHJldHVybiBoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5ob3Vyc09wdGlvbnMgPSAoXG4gICAgICB0aGlzLnVzZTI0SG91clRpbWUgPyB0aGlzLl9nZXRSYW5nZSgwLCAyMykgOiB0aGlzLl9nZXRSYW5nZSgxLCAxMilcbiAgICApLm1hcCgoaCkgPT4ge1xuICAgICAgY29uc3QgcmVzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGFsaWFzPzogc3RyaW5nIH0gPSB7XG4gICAgICAgIHZhbHVlOiBoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgbGFiZWw6IGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGlzLnVzZTI0SG91clRpbWUpIHJlcy5hbGlhcyA9IGdldEhvdXJBbGlhcyhoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZSh2YWx1ZTogQ3BzVGltZSkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF90cnlVcGRhdGVWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZhbHVlPy5ob3VycyAmJlxuICAgICAgdGhpcy52YWx1ZT8ubWludXRlcyAmJlxuICAgICAgKCF0aGlzLndpdGhTZWNvbmRzIHx8ICh0aGlzLndpdGhTZWNvbmRzICYmIHRoaXMudmFsdWU/LnNlY29uZHMpKSAmJlxuICAgICAgKHRoaXMudXNlMjRIb3VyVGltZSB8fCAoIXRoaXMudXNlMjRIb3VyVGltZSAmJiB0aGlzLnZhbHVlPy5kYXlQZXJpb2QpKVxuICAgIClcbiAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmFuZ2Uoc3RhcnRGcm9tOiBudW1iZXIsIHVudGlsOiBudW1iZXIpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiB1bnRpbCArIDEgLSBzdGFydEZyb20gfSxcbiAgICAgIChfLCBrKSA9PiBrICsgc3RhcnRGcm9tXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNwcy10aW1lcGlja2VyXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNwcy10aW1lcGlja2VyLWxhYmVsXCJcbiAgICBbbmdDbGFzc109XCJ7ICdjcHMtdGltZXBpY2tlci1sYWJlbC1kaXNhYmxlZCc6IGRpc2FibGVkIH1cIlxuICAgICpuZ0lmPVwibGFiZWxcIj5cbiAgICA8bGFiZWw+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgIDxjcHMtaW5mby1jaXJjbGVcbiAgICAgICpuZ0lmPVwiaW5mb1Rvb2x0aXBcIlxuICAgICAgY2xhc3M9XCJjcHMtdGltZXBpY2tlci1sYWJlbC1pbmZvLWNpcmNsZVwiXG4gICAgICBzaXplPVwieHNtYWxsXCJcbiAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiaW5mb1Rvb2x0aXBQb3NpdGlvblwiXG4gICAgICBbdG9vbHRpcENvbnRlbnRDbGFzc109XCJpbmZvVG9vbHRpcENsYXNzXCJcbiAgICAgIFt0b29sdGlwTWF4V2lkdGhdPVwiaW5mb1Rvb2x0aXBNYXhXaWR0aFwiXG4gICAgICBbdG9vbHRpcFBlcnNpc3RlbnRdPVwiaW5mb1Rvb2x0aXBQZXJzaXN0ZW50XCJcbiAgICAgIFt0b29sdGlwVGV4dF09XCJpbmZvVG9vbHRpcFwiPlxuICAgIDwvY3BzLWluZm8tY2lyY2xlPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNwcy10aW1lcGlja2VyLWJvZHlcIj5cbiAgICA8Y3BzLWF1dG9jb21wbGV0ZVxuICAgICAgI2hvdXJzRmllbGRcbiAgICAgIChrZXlwcmVzcyk9XCJudW1iZXJPbmx5KCRldmVudClcIlxuICAgICAgd2lkdGg9XCI2MFwiXG4gICAgICBbb3B0aW9uc109XCJob3Vyc09wdGlvbnNcIlxuICAgICAgW3dpdGhPcHRpb25zQWxpYXNlc109XCIhdXNlMjRIb3VyVGltZVwiXG4gICAgICBbdXNlT3B0aW9uc0FsaWFzZXNXaGVuTm9NYXRjaF09XCJ0cnVlXCJcbiAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbc2hvd0NoZXZyb25dPVwiZmFsc2VcIlxuICAgICAgW3Nob3dFbXB0eU1lc3NhZ2VdPVwiZmFsc2VcIlxuICAgICAgKGJsdXJyZWQpPVwib25GaWVsZEJsdXIoKVwiXG4gICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZT8uaG91cnNcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVIb3VycygkZXZlbnQpXCJcbiAgICAgIFtleHRlcm5hbEVycm9yXT1cImhvdXJzRXJyb3JcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJISFwiPjwvY3BzLWF1dG9jb21wbGV0ZT5cbiAgICA8c3BhbiBjbGFzcz1cImNwcy10aW1lcGlja2VyLWRlbGltaXRlclwiPjo8L3NwYW4+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgICNtaW51dGVzRmllbGRcbiAgICAgIChrZXlwcmVzcyk9XCJudW1iZXJPbmx5KCRldmVudClcIlxuICAgICAgd2lkdGg9XCI2MFwiXG4gICAgICBbb3B0aW9uc109XCJtaW51dGVzT3B0aW9uc1wiXG4gICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3Nob3dDaGV2cm9uXT1cImZhbHNlXCJcbiAgICAgIFtzaG93RW1wdHlNZXNzYWdlXT1cImZhbHNlXCJcbiAgICAgIChibHVycmVkKT1cIm9uRmllbGRCbHVyKClcIlxuICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICBbdmFsdWVdPVwidmFsdWU/Lm1pbnV0ZXNcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVNaW51dGVzKCRldmVudClcIlxuICAgICAgW2V4dGVybmFsRXJyb3JdPVwibWludXRlc0Vycm9yXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiTU1cIj48L2Nwcy1hdXRvY29tcGxldGU+XG4gICAgPHNwYW4gKm5nSWY9XCJ3aXRoU2Vjb25kc1wiIGNsYXNzPVwiY3BzLXRpbWVwaWNrZXItZGVsaW1pdGVyXCI+Ojwvc3Bhbj5cbiAgICA8Y3BzLWF1dG9jb21wbGV0ZVxuICAgICAgKm5nSWY9XCJ3aXRoU2Vjb25kc1wiXG4gICAgICAjc2Vjb25kc0ZpZWxkXG4gICAgICAoa2V5cHJlc3MpPVwibnVtYmVyT25seSgkZXZlbnQpXCJcbiAgICAgIHdpZHRoPVwiNjBcIlxuICAgICAgW29wdGlvbnNdPVwic2Vjb25kc09wdGlvbnNcIlxuICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtzaG93Q2hldnJvbl09XCJmYWxzZVwiXG4gICAgICBbc2hvd0VtcHR5TWVzc2FnZV09XCJmYWxzZVwiXG4gICAgICAoYmx1cnJlZCk9XCJvbkZpZWxkQmx1cigpXCJcbiAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgW3ZhbHVlXT1cInZhbHVlPy5zZWNvbmRzXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwidXBkYXRlU2Vjb25kcygkZXZlbnQpXCJcbiAgICAgIFtleHRlcm5hbEVycm9yXT1cInNlY29uZHNFcnJvclwiXG4gICAgICBwbGFjZWhvbGRlcj1cIlNTXCI+PC9jcHMtYXV0b2NvbXBsZXRlPlxuICAgIDxjcHMtYnV0dG9uLXRvZ2dsZVxuICAgICAgKm5nSWY9XCIhdXNlMjRIb3VyVGltZVwiXG4gICAgICBjbGFzcz1cImNwcy10aW1lcGlja2VyLWFtLXBtLXNlbGVjdG9yXCJcbiAgICAgIFtvcHRpb25zXT1cImRheVBlcmlvZE9wdGlvbnNcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZT8uZGF5UGVyaW9kIHx8ICdBTSdcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJ1cGRhdGVEYXlQZXJpb2QoJGV2ZW50KVwiPlxuICAgIDwvY3BzLWJ1dHRvbi10b2dnbGU+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiIWVycm9yICYmICFoaWRlRGV0YWlsc1wiIGNsYXNzPVwiY3BzLXRpbWVwaWNrZXItaGludFwiPlxuICAgIHt7IGhpbnQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJlcnJvciAmJiAhaGlkZURldGFpbHNcIiBjbGFzcz1cImNwcy10aW1lcGlja2VyLWVycm9yXCI+XG4gICAge3sgZXJyb3IgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==