@openmrs/ngx-formentry 19.0.1-pre.489 → 19.0.1-pre.497

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 (208) hide show
  1. package/components/input/label.component.d.ts +1 -1
  2. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
  3. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
  4. package/components/number-input/number-input.component.d.ts +1 -1
  5. package/components/select/select.component.d.ts +1 -1
  6. package/fesm2022/openmrs-ngx-formentry.mjs +412 -380
  7. package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
  8. package/form-entry/form-entry.module.d.ts +2 -2
  9. package/form-entry/form-factory/form.factory.d.ts +2 -2
  10. package/form-entry/helpers/js-expression-helper.d.ts +2 -2
  11. package/form-entry/services/form-schema-compiler.service.d.ts +2 -0
  12. package/form-entry/value-adapters/obs.adapter.d.ts +0 -1
  13. package/form-entry/value-adapters/person-attribute.adapter.d.ts +3 -3
  14. package/lib/index.d.ts +1 -1
  15. package/package.json +10 -12
  16. package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
  17. package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
  18. package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
  19. package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
  20. package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
  21. package/esm2022/abstract-controls-extension/index.mjs +0 -5
  22. package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
  23. package/esm2022/change-tracking/control-relation.mjs +0 -44
  24. package/esm2022/change-tracking/control-relations.mjs +0 -32
  25. package/esm2022/components/afe-ng-select.component.mjs +0 -101
  26. package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
  27. package/esm2022/components/check-box/checkbox.component.mjs +0 -110
  28. package/esm2022/components/check-box/checkbox.module.mjs +0 -19
  29. package/esm2022/components/custom-component-wrapper/custom-component-wrapper..module.mjs +0 -22
  30. package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
  31. package/esm2022/components/custom-control-wrapper/custom-control-wrapper..module.mjs +0 -23
  32. package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
  33. package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
  34. package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
  35. package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
  36. package/esm2022/components/date-time-picker/index.mjs +0 -9
  37. package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
  38. package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
  39. package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
  40. package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
  41. package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
  42. package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
  43. package/esm2022/components/input/input.directive.mjs +0 -78
  44. package/esm2022/components/input/input.module.mjs +0 -23
  45. package/esm2022/components/input/label.component.mjs +0 -263
  46. package/esm2022/components/input/text-area.directive.mjs +0 -58
  47. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
  48. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
  49. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
  50. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
  51. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
  52. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
  53. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
  54. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
  55. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
  56. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
  57. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
  58. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
  59. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
  60. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
  61. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
  62. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
  63. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  64. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
  65. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
  66. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
  67. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
  68. package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
  69. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
  70. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
  71. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
  72. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
  73. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
  74. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
  75. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
  76. package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
  77. package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
  78. package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
  79. package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
  80. package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
  81. package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
  82. package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
  83. package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
  84. package/esm2022/components/number-input/number-input.component.mjs +0 -254
  85. package/esm2022/components/number-input/number-input.module.mjs +0 -21
  86. package/esm2022/components/number-input/number.directive.mjs +0 -22
  87. package/esm2022/components/radio-button/radio.component.mjs +0 -98
  88. package/esm2022/components/radio-button/radio.module.mjs +0 -19
  89. package/esm2022/components/select/optgroup.directive.mjs +0 -19
  90. package/esm2022/components/select/option.directive.mjs +0 -19
  91. package/esm2022/components/select/select.component.mjs +0 -182
  92. package/esm2022/components/select/select.module.mjs +0 -23
  93. package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
  94. package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
  95. package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
  96. package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
  97. package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
  98. package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
  99. package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
  100. package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
  101. package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
  102. package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
  103. package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
  104. package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
  105. package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
  106. package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
  107. package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
  108. package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
  109. package/esm2022/form-entry/form-entry.module.mjs +0 -194
  110. package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
  111. package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
  112. package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
  113. package/esm2022/form-entry/form-factory/form.factory.mjs +0 -144
  114. package/esm2022/form-entry/form-factory/form.mjs +0 -190
  115. package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
  116. package/esm2022/form-entry/form-factory/index.mjs +0 -7
  117. package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
  118. package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
  119. package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
  120. package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
  121. package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
  122. package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
  123. package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -314
  124. package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
  125. package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
  126. package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
  127. package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
  128. package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
  129. package/esm2022/form-entry/question-models/date-question.mjs +0 -12
  130. package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
  131. package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
  132. package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
  133. package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
  134. package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
  135. package/esm2022/form-entry/question-models/group-question.mjs +0 -12
  136. package/esm2022/form-entry/question-models/index.mjs +0 -24
  137. package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
  138. package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
  139. package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
  140. package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
  141. package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
  142. package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
  143. package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
  144. package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
  145. package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
  146. package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
  147. package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
  148. package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
  149. package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
  150. package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
  151. package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
  152. package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
  153. package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
  154. package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
  155. package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
  156. package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
  157. package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
  158. package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
  159. package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
  160. package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
  161. package/esm2022/form-entry/question-models/models.mjs +0 -13
  162. package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
  163. package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
  164. package/esm2022/form-entry/question-models/question-base.mjs +0 -26
  165. package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
  166. package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
  167. package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
  168. package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
  169. package/esm2022/form-entry/question-models/select-option.mjs +0 -7
  170. package/esm2022/form-entry/question-models/select-question.mjs +0 -12
  171. package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
  172. package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
  173. package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
  174. package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
  175. package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
  176. package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
  177. package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
  178. package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
  179. package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -248
  180. package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
  181. package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
  182. package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
  183. package/esm2022/form-entry/validators/date.validator.mjs +0 -18
  184. package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
  185. package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
  186. package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
  187. package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
  188. package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
  189. package/esm2022/form-entry/validators/max.validator.mjs +0 -21
  190. package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
  191. package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
  192. package/esm2022/form-entry/validators/min.validator.mjs +0 -21
  193. package/esm2022/form-entry/validators/required.validator.mjs +0 -11
  194. package/esm2022/form-entry/validators/validations.mjs +0 -5
  195. package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
  196. package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
  197. package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
  198. package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -542
  199. package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
  200. package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
  201. package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
  202. package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
  203. package/esm2022/lib/index.mjs +0 -59
  204. package/esm2022/openmrs-ngx-formentry.mjs +0 -5
  205. package/esm2022/public_api.mjs +0 -2
  206. package/esm2022/shared.module.mjs +0 -21
  207. /package/components/custom-component-wrapper/{custom-component-wrapper..module.d.ts → custom-component-wrapper.module.d.ts} +0 -0
  208. /package/components/custom-control-wrapper/{custom-control-wrapper..module.d.ts → custom-control-wrapper.module.d.ts} +0 -0
@@ -1,614 +0,0 @@
1
- import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Optional, Output, Renderer2 } from '@angular/core';
2
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
- import { DOWN_ARROW } from '@angular/cdk/keycodes';
4
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
5
- import { OwlDateTimeComponent } from './date-time-picker.component';
6
- import { DateTimeAdapter } from './adapter/date-time-adapter.class';
7
- import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
8
- import { Subscription } from 'rxjs';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./adapter/date-time-adapter.class";
11
- export const OWL_DATETIME_VALUE_ACCESSOR = {
12
- provide: NG_VALUE_ACCESSOR,
13
- useExisting: forwardRef(() => OwlDateTimeInputDirective),
14
- multi: true
15
- };
16
- export const OWL_DATETIME_VALIDATORS = {
17
- provide: NG_VALIDATORS,
18
- useExisting: forwardRef(() => OwlDateTimeInputDirective),
19
- multi: true
20
- };
21
- export class OwlDateTimeInputDirective {
22
- get owlDateTimeInputAriaHaspopup() {
23
- return true;
24
- }
25
- get maxIso8601() {
26
- return this.max ? this.dateTimeAdapter.toIso8601(this.max) : null;
27
- }
28
- get minIso8601() {
29
- return this.min ? this.dateTimeAdapter.toIso8601(this.min) : null;
30
- }
31
- get owlDateTimeInputAriaOwns() {
32
- return (this.dtPicker.opened && this.dtPicker.id) || null;
33
- }
34
- get owlDateTimeInputDisabled() {
35
- return this.disabled;
36
- }
37
- handleBlurOnHost($event) {
38
- this.onModelTouched();
39
- }
40
- handleChangeOnHost($event) {
41
- let v;
42
- if (this.isInSingleMode) {
43
- v = this.value;
44
- }
45
- else if (this.isInRangeMode) {
46
- v = this.values;
47
- }
48
- this.dateTimeChange.emit({
49
- source: this,
50
- value: v,
51
- input: this.elmRef.nativeElement
52
- });
53
- }
54
- handleInputOnHost($event) {
55
- const value = $event.target.value;
56
- if (this._selectMode === 'single') {
57
- this.changeInputInSingleMode(value);
58
- }
59
- else if (this._selectMode === 'range') {
60
- this.changeInputInRangeMode(value);
61
- }
62
- else {
63
- this.changeInputInRangeFromToMode(value);
64
- }
65
- }
66
- handleKeydownOnHost($event) {
67
- if ($event.altKey && $event.keyCode === DOWN_ARROW) {
68
- this.dtPicker.open();
69
- $event.preventDefault();
70
- }
71
- }
72
- /**
73
- * The date time picker that this input is associated with.
74
- * */
75
- set owlDateTime(value) {
76
- this.registerDateTimePicker(value);
77
- }
78
- /**
79
- * A function to filter date time
80
- */
81
- set owlDateTimeFilter(filter) {
82
- this._dateTimeFilter = filter;
83
- this.validatorOnChange();
84
- }
85
- get dateTimeFilter() {
86
- return this._dateTimeFilter;
87
- }
88
- get disabled() {
89
- return !!this._disabled;
90
- }
91
- set disabled(value) {
92
- const newValue = coerceBooleanProperty(value);
93
- const element = this.elmRef.nativeElement;
94
- if (this._disabled !== newValue) {
95
- this._disabled = newValue;
96
- this.disabledChange.emit(newValue);
97
- }
98
- // We need to null check the `blur` method, because it's undefined during SSR.
99
- if (newValue && element.blur) {
100
- // Normally, native input elements automatically blur if they turn disabled. This behavior
101
- // is problematic, because it would mean that it triggers another change detection cycle,
102
- // which then causes a changed after checked error if the input element was focused before.
103
- element.blur();
104
- }
105
- }
106
- get min() {
107
- return this._min;
108
- }
109
- set min(value) {
110
- this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
111
- this.validatorOnChange();
112
- }
113
- get max() {
114
- return this._max;
115
- }
116
- set max(value) {
117
- this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
118
- this.validatorOnChange();
119
- }
120
- get selectMode() {
121
- return this._selectMode;
122
- }
123
- set selectMode(mode) {
124
- if (mode !== 'single' &&
125
- mode !== 'range' &&
126
- mode !== 'rangeFrom' &&
127
- mode !== 'rangeTo') {
128
- throw Error('OwlDateTime Error: invalid selectMode value!');
129
- }
130
- this._selectMode = mode;
131
- }
132
- get value() {
133
- return this._value;
134
- }
135
- set value(value) {
136
- value = this.dateTimeAdapter.deserialize(value);
137
- this.lastValueValid = !value || this.dateTimeAdapter.isValid(value);
138
- value = this.getValidDate(value);
139
- const oldDate = this._value;
140
- this._value = value;
141
- // set the input property 'value'
142
- if ((this.value, this.dtPicker)) {
143
- this.formatNativeInputValue();
144
- }
145
- // check if the input value changed
146
- if (!this.dateTimeAdapter.isEqual(oldDate, value)) {
147
- this.valueChange.emit(value);
148
- }
149
- }
150
- get values() {
151
- return this._values;
152
- }
153
- set values(values) {
154
- if (values && values.length > 0) {
155
- this._values = values.map((v) => {
156
- v = this.dateTimeAdapter.deserialize(v);
157
- return this.getValidDate(v);
158
- });
159
- this.lastValueValid =
160
- (!this._values[0] || this.dateTimeAdapter.isValid(this._values[0])) &&
161
- (!this._values[1] || this.dateTimeAdapter.isValid(this._values[1]));
162
- }
163
- else {
164
- this._values = [];
165
- this.lastValueValid = true;
166
- }
167
- // set the input property 'value'
168
- this.formatNativeInputValue();
169
- this.valueChange.emit(this._values);
170
- }
171
- get elementRef() {
172
- return this.elmRef;
173
- }
174
- get isInSingleMode() {
175
- return this._selectMode === 'single';
176
- }
177
- get isInRangeMode() {
178
- return (this._selectMode === 'range' ||
179
- this._selectMode === 'rangeFrom' ||
180
- this._selectMode === 'rangeTo');
181
- }
182
- constructor(elmRef, renderer, dateTimeAdapter, dateTimeFormats) {
183
- this.elmRef = elmRef;
184
- this.renderer = renderer;
185
- this.dateTimeAdapter = dateTimeAdapter;
186
- this.dateTimeFormats = dateTimeFormats;
187
- /**
188
- * The picker's select mode
189
- */
190
- this._selectMode = 'single';
191
- /**
192
- * The character to separate the 'from' and 'to' in input value
193
- */
194
- this.rangeSeparator = '~';
195
- this._values = [];
196
- /**
197
- * Callback to invoke when `change` event is fired on this `<input>`
198
- * */
199
- this.dateTimeChange = new EventEmitter();
200
- /**
201
- * Callback to invoke when an `input` event is fired on this `<input>`.
202
- * */
203
- this.dateTimeInput = new EventEmitter();
204
- this.dtPickerSub = Subscription.EMPTY;
205
- this.localeSub = Subscription.EMPTY;
206
- this.lastValueValid = true;
207
- /** The form control validator for whether the input parses. */
208
- this.parseValidator = () => {
209
- return this.lastValueValid
210
- ? null
211
- : { owlDateTimeParse: { text: this.elmRef.nativeElement.value } };
212
- };
213
- /** The form control validator for the min date. */
214
- this.minValidator = (control) => {
215
- if (this.isInSingleMode) {
216
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
217
- return !this.min ||
218
- !controlValue ||
219
- this.dateTimeAdapter.compare(this.min, controlValue) <= 0
220
- ? null
221
- : { owlDateTimeMin: { min: this.min, actual: controlValue } };
222
- }
223
- else if (this.isInRangeMode && control.value) {
224
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
225
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
226
- return !this.min ||
227
- !controlValueFrom ||
228
- !controlValueTo ||
229
- this.dateTimeAdapter.compare(this.min, controlValueFrom) <= 0
230
- ? null
231
- : {
232
- owlDateTimeMin: {
233
- min: this.min,
234
- actual: [controlValueFrom, controlValueTo]
235
- }
236
- };
237
- }
238
- };
239
- /** The form control validator for the max date. */
240
- this.maxValidator = (control) => {
241
- if (this.isInSingleMode) {
242
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
243
- return !this.max ||
244
- !controlValue ||
245
- this.dateTimeAdapter.compare(this.max, controlValue) >= 0
246
- ? null
247
- : { owlDateTimeMax: { max: this.max, actual: controlValue } };
248
- }
249
- else if (this.isInRangeMode && control.value) {
250
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
251
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
252
- return !this.max ||
253
- !controlValueFrom ||
254
- !controlValueTo ||
255
- this.dateTimeAdapter.compare(this.max, controlValueTo) >= 0
256
- ? null
257
- : {
258
- owlDateTimeMax: {
259
- max: this.max,
260
- actual: [controlValueFrom, controlValueTo]
261
- }
262
- };
263
- }
264
- };
265
- /** The form control validator for the date filter. */
266
- this.filterValidator = (control) => {
267
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
268
- return !this._dateTimeFilter ||
269
- !controlValue ||
270
- this._dateTimeFilter(controlValue)
271
- ? null
272
- : { owlDateTimeFilter: true };
273
- };
274
- /**
275
- * The form control validator for the range.
276
- * Check whether the 'before' value is before the 'to' value
277
- * */
278
- this.rangeValidator = (control) => {
279
- if (this.isInSingleMode || !control.value) {
280
- return null;
281
- }
282
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
283
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
284
- return !controlValueFrom ||
285
- !controlValueTo ||
286
- this.dateTimeAdapter.compare(controlValueFrom, controlValueTo) <= 0
287
- ? null
288
- : { owlDateTimeRange: true };
289
- };
290
- /** The combined form control validator for this input. */
291
- this.validator = Validators.compose([
292
- this.parseValidator,
293
- this.minValidator,
294
- this.maxValidator,
295
- this.filterValidator,
296
- this.rangeValidator
297
- ]);
298
- /** Emits when the value changes (either due to user input or programmatic change). */
299
- this.valueChange = new EventEmitter();
300
- /** Emits when the disabled state has changed */
301
- this.disabledChange = new EventEmitter();
302
- this.onModelChange = () => { };
303
- this.onModelTouched = () => { };
304
- this.validatorOnChange = () => { };
305
- if (!this.dateTimeAdapter) {
306
- throw Error(`OwlDateTimePicker: No provider found for DateTimePicker. You must import one of the following ` +
307
- `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
308
- `custom implementation.`);
309
- }
310
- if (!this.dateTimeFormats) {
311
- throw Error(`OwlDateTimePicker: No provider found for OWL_DATE_TIME_FORMATS. You must import one of the following ` +
312
- `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
313
- `custom implementation.`);
314
- }
315
- this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
316
- this.value = this.value;
317
- });
318
- }
319
- ngOnInit() {
320
- if (!this.dtPicker) {
321
- throw Error(`OwlDateTimePicker: the picker input doesn't have any associated owl-date-time component`);
322
- }
323
- this.formatNativeInputValue();
324
- }
325
- ngAfterContentInit() {
326
- this.dtPickerSub = this.dtPicker.confirmSelectedChange.subscribe((selecteds) => {
327
- if (Array.isArray(selecteds)) {
328
- this.values = selecteds;
329
- }
330
- else {
331
- this.value = selecteds;
332
- }
333
- this.onModelChange(selecteds);
334
- this.onModelTouched();
335
- this.dateTimeChange.emit({
336
- source: this,
337
- value: selecteds,
338
- input: this.elmRef.nativeElement
339
- });
340
- this.dateTimeInput.emit({
341
- source: this,
342
- value: selecteds,
343
- input: this.elmRef.nativeElement
344
- });
345
- });
346
- }
347
- ngOnDestroy() {
348
- this.dtPickerSub.unsubscribe();
349
- this.localeSub.unsubscribe();
350
- this.valueChange.complete();
351
- this.disabledChange.complete();
352
- }
353
- writeValue(value) {
354
- if (this.isInSingleMode) {
355
- this.value = value;
356
- }
357
- else {
358
- this.values = value;
359
- }
360
- }
361
- registerOnChange(fn) {
362
- this.onModelChange = fn;
363
- }
364
- registerOnTouched(fn) {
365
- this.onModelTouched = fn;
366
- }
367
- setDisabledState(isDisabled) {
368
- this.disabled = isDisabled;
369
- }
370
- validate(c) {
371
- return this.validator ? this.validator(c) : null;
372
- }
373
- registerOnValidatorChange(fn) {
374
- this.validatorOnChange = fn;
375
- }
376
- /**
377
- * Set the native input property 'value'
378
- */
379
- formatNativeInputValue() {
380
- if (this.isInSingleMode) {
381
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', this._value
382
- ? this.dateTimeAdapter.format(this._value, this.dtPicker.formatString)
383
- : '');
384
- }
385
- else if (this.isInRangeMode) {
386
- if (this._values && this.values.length > 0) {
387
- const from = this._values[0];
388
- const to = this._values[1];
389
- const fromFormatted = from
390
- ? this.dateTimeAdapter.format(from, this.dtPicker.formatString)
391
- : '';
392
- const toFormatted = to
393
- ? this.dateTimeAdapter.format(to, this.dtPicker.formatString)
394
- : '';
395
- if (!fromFormatted && !toFormatted) {
396
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', null);
397
- }
398
- else {
399
- if (this._selectMode === 'range') {
400
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted + ' ' + this.rangeSeparator + ' ' + toFormatted);
401
- }
402
- else if (this._selectMode === 'rangeFrom') {
403
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted);
404
- }
405
- else if (this._selectMode === 'rangeTo') {
406
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', toFormatted);
407
- }
408
- }
409
- }
410
- else {
411
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', '');
412
- }
413
- }
414
- return;
415
- }
416
- /**
417
- * Register the relationship between this input and its picker component
418
- */
419
- registerDateTimePicker(picker) {
420
- if (picker) {
421
- this.dtPicker = picker;
422
- this.dtPicker.registerInput(this);
423
- }
424
- }
425
- /**
426
- * Convert a given obj to a valid date object
427
- */
428
- getValidDate(obj) {
429
- return this.dateTimeAdapter.isDateInstance(obj) &&
430
- this.dateTimeAdapter.isValid(obj)
431
- ? obj
432
- : null;
433
- }
434
- /**
435
- * Convert a time string to a date-time string
436
- * When pickerType is 'timer', the value in the picker's input is a time string.
437
- * The dateTimeAdapter parse fn could not parse a time string to a Date Object.
438
- * Therefore we need this fn to convert a time string to a date-time string.
439
- */
440
- convertTimeStringToDateTimeString(timeString, dateTime) {
441
- if (timeString) {
442
- const v = dateTime || this.dateTimeAdapter.now();
443
- const dateString = this.dateTimeAdapter.format(v, this.dateTimeFormats.datePickerInput);
444
- return dateString + ' ' + timeString;
445
- }
446
- else {
447
- return null;
448
- }
449
- }
450
- /**
451
- * Handle input change in single mode
452
- */
453
- changeInputInSingleMode(inputValue) {
454
- let value = inputValue;
455
- if (this.dtPicker.pickerType === 'timer') {
456
- value = this.convertTimeStringToDateTimeString(value, this.value);
457
- }
458
- let result = this.dateTimeAdapter.parse(value, this.dateTimeFormats.parseInput);
459
- this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
460
- result = this.getValidDate(result);
461
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
462
- // result equals to null means there is input event, but the input value is invalid
463
- if (!this.isSameValue(result, this._value) || result === null) {
464
- this._value = result;
465
- this.valueChange.emit(result);
466
- this.onModelChange(result);
467
- this.dateTimeInput.emit({
468
- source: this,
469
- value: result,
470
- input: this.elmRef.nativeElement
471
- });
472
- }
473
- }
474
- /**
475
- * Handle input change in rangeFrom or rangeTo mode
476
- */
477
- changeInputInRangeFromToMode(inputValue) {
478
- const originalValue = this._selectMode === 'rangeFrom' ? this._values[0] : this._values[1];
479
- if (this.dtPicker.pickerType === 'timer') {
480
- inputValue = this.convertTimeStringToDateTimeString(inputValue, originalValue);
481
- }
482
- let result = this.dateTimeAdapter.parse(inputValue, this.dateTimeFormats.parseInput);
483
- this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
484
- result = this.getValidDate(result);
485
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
486
- if ((this._selectMode === 'rangeFrom' &&
487
- this.isSameValue(result, this._values[0]) &&
488
- result) ||
489
- (this._selectMode === 'rangeTo' &&
490
- this.isSameValue(result, this._values[1]) &&
491
- result)) {
492
- return;
493
- }
494
- this._values =
495
- this._selectMode === 'rangeFrom'
496
- ? [result, this._values[1]]
497
- : [this._values[0], result];
498
- this.valueChange.emit(this._values);
499
- this.onModelChange(this._values);
500
- this.dateTimeInput.emit({
501
- source: this,
502
- value: this._values,
503
- input: this.elmRef.nativeElement
504
- });
505
- }
506
- /**
507
- * Handle input change in range mode
508
- */
509
- changeInputInRangeMode(inputValue) {
510
- const selecteds = inputValue.split(this.rangeSeparator);
511
- let fromString = selecteds[0];
512
- let toString = selecteds[1];
513
- if (this.dtPicker.pickerType === 'timer') {
514
- fromString = this.convertTimeStringToDateTimeString(fromString, this.values[0]);
515
- toString = this.convertTimeStringToDateTimeString(toString, this.values[1]);
516
- }
517
- let from = this.dateTimeAdapter.parse(fromString, this.dateTimeFormats.parseInput);
518
- let to = this.dateTimeAdapter.parse(toString, this.dateTimeFormats.parseInput);
519
- this.lastValueValid =
520
- (!from || this.dateTimeAdapter.isValid(from)) &&
521
- (!to || this.dateTimeAdapter.isValid(to));
522
- from = this.getValidDate(from);
523
- to = this.getValidDate(to);
524
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
525
- if (!this.isSameValue(from, this._values[0]) ||
526
- !this.isSameValue(to, this._values[1]) ||
527
- (from === null && to === null)) {
528
- this._values = [from, to];
529
- this.valueChange.emit(this._values);
530
- this.onModelChange(this._values);
531
- this.dateTimeInput.emit({
532
- source: this,
533
- value: this._values,
534
- input: this.elmRef.nativeElement
535
- });
536
- }
537
- }
538
- /**
539
- * Check if the two value is the same
540
- */
541
- isSameValue(first, second) {
542
- if (first && second) {
543
- return this.dateTimeAdapter.compare(first, second) === 0;
544
- }
545
- return first === second;
546
- }
547
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlDateTimeInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
548
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: OwlDateTimeInputDirective, selector: "input[owlDateTime]", inputs: { owlDateTime: "owlDateTime", owlDateTimeFilter: "owlDateTimeFilter", min: "min", max: "max", selectMode: "selectMode", value: "value", values: "values", _disabled: "_disabled", rangeSeparator: "rangeSeparator" }, outputs: { dateTimeChange: "dateTimeChange", dateTimeInput: "dateTimeInput" }, host: { listeners: { "blur": "handleBlurOnHost($event)", "change": "handleChangeOnHost($event)", "input": "handleInputOnHost($event)", "keydown": "handleKeydownOnHost($event)" }, properties: { "attr.aria-haspopup": "this.owlDateTimeInputAriaHaspopup", "attr.max": "this.maxIso8601", "attr.min": "this.minIso8601", "attr.aria-owns": "this.owlDateTimeInputAriaOwns", "disabled": "this.owlDateTimeInputDisabled" } }, providers: [OWL_DATETIME_VALUE_ACCESSOR, OWL_DATETIME_VALIDATORS], exportAs: ["owlDateTimeInput"], ngImport: i0 }); }
549
- }
550
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlDateTimeInputDirective, decorators: [{
551
- type: Directive,
552
- args: [{
553
- selector: 'input[owlDateTime]',
554
- exportAs: 'owlDateTimeInput',
555
- providers: [OWL_DATETIME_VALUE_ACCESSOR, OWL_DATETIME_VALIDATORS]
556
- }]
557
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DateTimeAdapter, decorators: [{
558
- type: Optional
559
- }] }, { type: undefined, decorators: [{
560
- type: Optional
561
- }, {
562
- type: Inject,
563
- args: [OWL_DATE_TIME_FORMATS]
564
- }] }], propDecorators: { owlDateTimeInputAriaHaspopup: [{
565
- type: HostBinding,
566
- args: ['attr.aria-haspopup']
567
- }], maxIso8601: [{
568
- type: HostBinding,
569
- args: ['attr.max']
570
- }], minIso8601: [{
571
- type: HostBinding,
572
- args: ['attr.min']
573
- }], owlDateTimeInputAriaOwns: [{
574
- type: HostBinding,
575
- args: ['attr.aria-owns']
576
- }], owlDateTimeInputDisabled: [{
577
- type: HostBinding,
578
- args: ['disabled']
579
- }], handleBlurOnHost: [{
580
- type: HostListener,
581
- args: ['blur', ['$event']]
582
- }], handleChangeOnHost: [{
583
- type: HostListener,
584
- args: ['change', ['$event']]
585
- }], handleInputOnHost: [{
586
- type: HostListener,
587
- args: ['input', ['$event']]
588
- }], handleKeydownOnHost: [{
589
- type: HostListener,
590
- args: ['keydown', ['$event']]
591
- }], owlDateTime: [{
592
- type: Input
593
- }], owlDateTimeFilter: [{
594
- type: Input
595
- }], min: [{
596
- type: Input
597
- }], max: [{
598
- type: Input
599
- }], selectMode: [{
600
- type: Input
601
- }], value: [{
602
- type: Input
603
- }], values: [{
604
- type: Input
605
- }], _disabled: [{
606
- type: Input
607
- }], rangeSeparator: [{
608
- type: Input
609
- }], dateTimeChange: [{
610
- type: Output
611
- }], dateTimeInput: [{
612
- type: Output
613
- }] } });
614
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9jb21wb25lbnRzL25neC1waWNrLWRhdGV0aW1lL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFJakIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQ0wscUJBQXFCLEVBRXRCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBR3BDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFRO0lBQzlDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztJQUN4RCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBUTtJQUMxQyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQU9GLE1BQU0sT0FBTyx5QkFBeUI7SUFPcEMsSUFDSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBNkIsVUFBVTtRQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFRCxJQUE2QixVQUFVO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQW1DLHdCQUF3QjtRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQTZCLHdCQUF3QjtRQUNuRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUdNLGdCQUFnQixDQUFDLE1BQWE7UUFDbkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFHTSxrQkFBa0IsQ0FBQyxNQUFhO1FBQ3JDLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzlCLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixNQUFNLEVBQUUsSUFBSTtZQUNaLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR00saUJBQWlCLENBQUMsTUFBVztRQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBR00sbUJBQW1CLENBQUMsTUFBcUI7UUFDOUMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7U0FFSztJQUNMLElBQ0ksV0FBVyxDQUFDLEtBQThCO1FBQzVDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLGlCQUFpQixDQUFDLE1BQW1DO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBRTFDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QiwwRkFBMEY7WUFDMUYseUZBQXlGO1lBQ3pGLDJGQUEyRjtZQUMzRixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLEtBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsS0FBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFDSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFnQjtRQUM3QixJQUNFLElBQUksS0FBSyxRQUFRO1lBQ2pCLElBQUksS0FBSyxPQUFPO1lBQ2hCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyxTQUFTLEVBQ2xCLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFlO1FBQ3ZCLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFXO1FBQ3BCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlCLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWM7Z0JBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTztZQUM1QixJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVc7WUFDaEMsSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQy9CLENBQUM7SUFDSixDQUFDO0lBc0xELFlBQ1UsTUFBa0IsRUFDbEIsUUFBbUIsRUFDUCxlQUFtQyxFQUcvQyxlQUFtQztRQUxuQyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDUCxvQkFBZSxHQUFmLGVBQWUsQ0FBb0I7UUFHL0Msb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBOUs3Qzs7V0FFRztRQUNLLGdCQUFXLEdBQWUsUUFBUSxDQUFDO1FBRTNDOztXQUVHO1FBRUgsbUJBQWMsR0FBRyxHQUFHLENBQUM7UUFJYixZQUFPLEdBQVEsRUFBRSxDQUFDO1FBRTFCOzthQUVLO1FBRUwsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXpDOzthQUVLO1FBRUwsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBS2hDLGdCQUFXLEdBQWlCLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDL0MsY0FBUyxHQUFpQixZQUFZLENBQUMsS0FBSyxDQUFDO1FBRTdDLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTlCLCtEQUErRDtRQUN2RCxtQkFBYyxHQUFnQixHQUE0QixFQUFFO1lBQ2xFLE9BQU8sSUFBSSxDQUFDLGNBQWM7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdEUsQ0FBQyxDQUFDO1FBRUYsbURBQW1EO1FBQzNDLGlCQUFZLEdBQWdCLENBQ2xDLE9BQXdCLEVBQ0MsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUNoRCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRztvQkFDZCxDQUFDLFlBQVk7b0JBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUN6RCxDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUNsRSxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuRCxDQUFDO2dCQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkQsQ0FBQztnQkFDRixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7b0JBQ2QsQ0FBQyxnQkFBZ0I7b0JBQ2pCLENBQUMsY0FBYztvQkFDZixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQztvQkFDN0QsQ0FBQyxDQUFDLElBQUk7b0JBQ04sQ0FBQyxDQUFDO3dCQUNFLGNBQWMsRUFBRTs0QkFDZCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7NEJBQ2IsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO3lCQUMzQztxQkFDRixDQUFDO1lBQ1IsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLG1EQUFtRDtRQUMzQyxpQkFBWSxHQUFnQixDQUNsQyxPQUF3QixFQUNDLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FDaEQsQ0FBQztnQkFDRixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7b0JBQ2QsQ0FBQyxZQUFZO29CQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDekQsQ0FBQyxDQUFDLElBQUk7b0JBQ04sQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDbEUsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkQsQ0FBQztnQkFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25ELENBQUM7Z0JBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUNkLENBQUMsZ0JBQWdCO29CQUNqQixDQUFDLGNBQWM7b0JBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDO29CQUMzRCxDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUM7d0JBQ0UsY0FBYyxFQUFFOzRCQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRzs0QkFDYixNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7eUJBQzNDO3FCQUNGLENBQUM7WUFDUixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsc0RBQXNEO1FBQzlDLG9CQUFlLEdBQWdCLENBQ3JDLE9BQXdCLEVBQ0MsRUFBRTtZQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ2hELENBQUM7WUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWU7Z0JBQzFCLENBQUMsWUFBWTtnQkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBRUY7OzthQUdLO1FBQ0csbUJBQWMsR0FBZ0IsQ0FDcEMsT0FBd0IsRUFDQyxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25ELENBQUM7WUFDRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25ELENBQUM7WUFFRixPQUFPLENBQUMsZ0JBQWdCO2dCQUN0QixDQUFDLGNBQWM7Z0JBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDbkUsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDO1FBRUYsMERBQTBEO1FBQ2xELGNBQVMsR0FBdUIsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUN6RCxJQUFJLENBQUMsY0FBYztZQUNuQixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsZUFBZTtZQUNwQixJQUFJLENBQUMsY0FBYztTQUNwQixDQUFDLENBQUM7UUFFSCxzRkFBc0Y7UUFDL0UsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUV4RCxnREFBZ0Q7UUFDekMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTVDLGtCQUFhLEdBQWEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ25DLG1CQUFjLEdBQWEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ3BDLHNCQUFpQixHQUFhLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQVU3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxDQUNULGdHQUFnRztnQkFDOUYsbUdBQW1HO2dCQUNuRyx3QkFBd0IsQ0FDM0IsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxDQUNULHVHQUF1RztnQkFDckcsbUdBQW1HO2dCQUNuRyx3QkFBd0IsQ0FDM0IsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNNLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sS0FBSyxDQUNULHlGQUF5RixDQUMxRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FDOUQsQ0FBQyxTQUFrQixFQUFFLEVBQUU7WUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQzFCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUN6QixDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEtBQUssRUFBRSxTQUFTO2dCQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQ2pDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixNQUFNLEVBQUUsSUFBSTtnQkFDWixLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFPO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUFPO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sUUFBUSxDQUFDLENBQWtCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxFQUFjO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksc0JBQXNCO1FBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFDekIsT0FBTyxFQUNQLElBQUksQ0FBQyxNQUFNO2dCQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUN0RSxDQUFDLENBQUMsRUFBRSxDQUNQLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUUzQixNQUFNLGFBQWEsR0FBRyxJQUFJO29CQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO29CQUMvRCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLE1BQU0sV0FBVyxHQUFHLEVBQUU7b0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7b0JBQzdELENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBRVAsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFDekIsT0FBTyxFQUNQLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUM5RCxDQUFDO29CQUNKLENBQUM7eUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO3dCQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQ3pCLE9BQU8sRUFDUCxhQUFhLENBQ2QsQ0FBQztvQkFDSixDQUFDO3lCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUN6QixPQUFPLEVBQ1AsV0FBVyxDQUNaLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87SUFDVCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0IsQ0FBQyxNQUErQjtRQUM1RCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FBQyxHQUFRO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO1lBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNqQyxDQUFDLENBQUMsR0FBRztZQUNMLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQ0FBaUMsQ0FDdkMsVUFBa0IsRUFDbEIsUUFBVztRQUVYLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxFQUNELElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUNyQyxDQUFDO1lBQ0YsT0FBTyxVQUFVLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QixDQUFDLFVBQWtCO1FBQ2hELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLEtBQUssR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQ3JDLEtBQUssRUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsMkZBQTJGO1FBQzNGLG1GQUFtRjtRQUNuRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixNQUFNLEVBQUUsSUFBSTtnQkFDWixLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyw0QkFBNEIsQ0FBQyxVQUFrQjtRQUNyRCxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUNqRCxVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQ3JDLFVBQVUsRUFDVixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsMkZBQTJGO1FBQzNGLElBQ0UsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVc7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUM7WUFDVCxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxDQUFDLEVBQ1QsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU87WUFDVixJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVc7Z0JBQzlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUN0QixNQUFNLEVBQUUsSUFBSTtZQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTztZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQixDQUFDLFVBQWtCO1FBQy9DLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hELElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUNqRCxVQUFVLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1lBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FDL0MsUUFBUSxFQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FDbkMsVUFBVSxFQUNWLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUNoQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQ2pDLFFBQVEsRUFDUixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzQiwyRkFBMkY7UUFDM0YsSUFDRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQzlCLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDdEIsTUFBTSxFQUFFLElBQUk7Z0JBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsS0FBZSxFQUFFLE1BQWdCO1FBQ25ELElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO0lBQzFCLENBQUM7K0dBNXNCVSx5QkFBeUIsb0hBd1kxQixxQkFBcUI7bUdBeFlwQix5QkFBeUIsd3ZCQUZ6QixDQUFDLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDOzs0RkFFdEQseUJBQXlCO2tCQUxyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFNBQVMsRUFBRSxDQUFDLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDO2lCQUNsRTs7MEJBdVlJLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMscUJBQXFCO3lDQWhZM0IsNEJBQTRCO3NCQUQvQixXQUFXO3VCQUFDLG9CQUFvQjtnQkFLSixVQUFVO3NCQUF0QyxXQUFXO3VCQUFDLFVBQVU7Z0JBSU0sVUFBVTtzQkFBdEMsV0FBVzt1QkFBQyxVQUFVO2dCQUlZLHdCQUF3QjtzQkFBMUQsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBSUEsd0JBQXdCO3NCQUFwRCxXQUFXO3VCQUFDLFVBQVU7Z0JBS2hCLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXpCLGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBaUIzQixpQkFBaUI7c0JBRHZCLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWExQixtQkFBbUI7c0JBRHpCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVkvQixXQUFXO3NCQURkLEtBQUs7Z0JBU0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQThCRixHQUFHO3NCQUROLEtBQUs7Z0JBVUYsR0FBRztzQkFETixLQUFLO2dCQVVGLFVBQVU7c0JBRGIsS0FBSztnQkFrQkYsS0FBSztzQkFEUixLQUFLO2dCQXVCRixNQUFNO3NCQURULEtBQUs7Z0JBNkNFLFNBQVM7c0JBRGhCLEtBQUs7Z0JBa0JOLGNBQWM7c0JBRGIsS0FBSztnQkFXTixjQUFjO3NCQURiLE1BQU07Z0JBT1AsYUFBYTtzQkFEWixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBET1dOX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBPd2xEYXRlVGltZUNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7XG4gIE9XTF9EQVRFX1RJTUVfRk9STUFUUyxcbiAgT3dsRGF0ZVRpbWVGb3JtYXRzXG59IGZyb20gJy4vYWRhcHRlci9kYXRlLXRpbWUtZm9ybWF0LmNsYXNzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VsZWN0TW9kZSB9IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IE9XTF9EQVRFVElNRV9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgT1dMX0RBVEVUSU1FX1ZBTElEQVRPUlM6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFtvd2xEYXRlVGltZV0nLFxuICBleHBvcnRBczogJ293bERhdGVUaW1lSW5wdXQnLFxuICBwcm92aWRlcnM6IFtPV0xfREFURVRJTUVfVkFMVUVfQUNDRVNTT1IsIE9XTF9EQVRFVElNRV9WQUxJREFUT1JTXVxufSlcbmV4cG9ydCBjbGFzcyBPd2xEYXRlVGltZUlucHV0RGlyZWN0aXZlPFQ+XG4gIGltcGxlbWVudHNcbiAgICBPbkluaXQsXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgVmFsaWRhdG9yIHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGFzcG9wdXAnKVxuICBnZXQgb3dsRGF0ZVRpbWVJbnB1dEFyaWFIYXNwb3B1cCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5tYXgnKSBnZXQgbWF4SXNvODYwMSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXggPyB0aGlzLmRhdGVUaW1lQWRhcHRlci50b0lzbzg2MDEodGhpcy5tYXgpIDogbnVsbDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5taW4nKSBnZXQgbWluSXNvODYwMSgpIHtcbiAgICByZXR1cm4gdGhpcy5taW4gPyB0aGlzLmRhdGVUaW1lQWRhcHRlci50b0lzbzg2MDEodGhpcy5taW4pIDogbnVsbDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW93bnMnKSBnZXQgb3dsRGF0ZVRpbWVJbnB1dEFyaWFPd25zKCkge1xuICAgIHJldHVybiAodGhpcy5kdFBpY2tlci5vcGVuZWQgJiYgdGhpcy5kdFBpY2tlci5pZCkgfHwgbnVsbDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnZGlzYWJsZWQnKSBnZXQgb3dsRGF0ZVRpbWVJbnB1dERpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBoYW5kbGVCbHVyT25Ib3N0KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBwdWJsaWMgaGFuZGxlQ2hhbmdlT25Ib3N0KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgdjtcbiAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgdiA9IHRoaXMudmFsdWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIHYgPSB0aGlzLnZhbHVlcztcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVUaW1lQ2hhbmdlLmVtaXQoe1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgdmFsdWU6IHYsXG4gICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBwdWJsaWMgaGFuZGxlSW5wdXRPbkhvc3QoJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9ICRldmVudC50YXJnZXQudmFsdWU7XG4gICAgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICB0aGlzLmNoYW5nZUlucHV0SW5TaW5nbGVNb2RlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZScpIHtcbiAgICAgIHRoaXMuY2hhbmdlSW5wdXRJblJhbmdlTW9kZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbmdlSW5wdXRJblJhbmdlRnJvbVRvTW9kZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBoYW5kbGVLZXlkb3duT25Ib3N0KCRldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICgkZXZlbnQuYWx0S2V5ICYmICRldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XG4gICAgICB0aGlzLmR0UGlja2VyLm9wZW4oKTtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSB0aW1lIHBpY2tlciB0aGF0IHRoaXMgaW5wdXQgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKiAqL1xuICBASW5wdXQoKVxuICBzZXQgb3dsRGF0ZVRpbWUodmFsdWU6IE93bERhdGVUaW1lQ29tcG9uZW50PFQ+KSB7XG4gICAgdGhpcy5yZWdpc3RlckRhdGVUaW1lUGlja2VyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIGZpbHRlciBkYXRlIHRpbWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBvd2xEYXRlVGltZUZpbHRlcihmaWx0ZXI6IChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyID0gZmlsdGVyO1xuICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxuICBnZXQgZGF0ZVRpbWVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVUaW1lRmlsdGVyO1xuICB9XG4gIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICh0aGlzLl9kaXNhYmxlZCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmVtaXQobmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gbnVsbCBjaGVjayB0aGUgYGJsdXJgIG1ldGhvZCwgYmVjYXVzZSBpdCdzIHVuZGVmaW5lZCBkdXJpbmcgU1NSLlxuICAgIGlmIChuZXdWYWx1ZSAmJiBlbGVtZW50LmJsdXIpIHtcbiAgICAgIC8vIE5vcm1hbGx5LCBuYXRpdmUgaW5wdXQgZWxlbWVudHMgYXV0b21hdGljYWxseSBibHVyIGlmIHRoZXkgdHVybiBkaXNhYmxlZC4gVGhpcyBiZWhhdmlvclxuICAgICAgLy8gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgaXQgd291bGQgbWVhbiB0aGF0IGl0IHRyaWdnZXJzIGFub3RoZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSxcbiAgICAgIC8vIHdoaWNoIHRoZW4gY2F1c2VzIGEgY2hhbmdlZCBhZnRlciBjaGVja2VkIGVycm9yIGlmIHRoZSBpbnB1dCBlbGVtZW50IHdhcyBmb2N1c2VkIGJlZm9yZS5cbiAgICAgIGVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWluKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgc2V0IG1pbih2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4KCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgc2V0IG1heCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZTtcbiAgfVxuXG4gIHNldCBzZWxlY3RNb2RlKG1vZGU6IFNlbGVjdE1vZGUpIHtcbiAgICBpZiAoXG4gICAgICBtb2RlICE9PSAnc2luZ2xlJyAmJlxuICAgICAgbW9kZSAhPT0gJ3JhbmdlJyAmJlxuICAgICAgbW9kZSAhPT0gJ3JhbmdlRnJvbScgJiZcbiAgICAgIG1vZGUgIT09ICdyYW5nZVRvJ1xuICAgICkge1xuICAgICAgdGhyb3cgRXJyb3IoJ093bERhdGVUaW1lIEVycm9yOiBpbnZhbGlkIHNlbGVjdE1vZGUgdmFsdWUhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0TW9kZSA9IG1vZGU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gIXZhbHVlIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodmFsdWUpO1xuICAgIHZhbHVlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpO1xuICAgIGNvbnN0IG9sZERhdGUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgLy8gc2V0IHRoZSBpbnB1dCBwcm9wZXJ0eSAndmFsdWUnXG4gICAgaWYgKCh0aGlzLnZhbHVlLCB0aGlzLmR0UGlja2VyKSkge1xuICAgICAgdGhpcy5mb3JtYXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGlucHV0IHZhbHVlIGNoYW5nZWRcbiAgICBpZiAoIXRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzRXF1YWwob2xkRGF0ZSwgdmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBzZXQgdmFsdWVzKHZhbHVlczogVFtdKSB7XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzLm1hcCgodikgPT4ge1xuICAgICAgICB2ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodik7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZSh2KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9XG4gICAgICAgICghdGhpcy5fdmFsdWVzWzBdIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5fdmFsdWVzWzBdKSkgJiZcbiAgICAgICAgKCF0aGlzLl92YWx1ZXNbMV0gfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl92YWx1ZXNbMV0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGlucHV0IHByb3BlcnR5ICd2YWx1ZSdcbiAgICB0aGlzLmZvcm1hdE5hdGl2ZUlucHV0VmFsdWUoKTtcblxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZXMpO1xuICB9XG5cbiAgZ2V0IGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuZWxtUmVmO1xuICB9XG5cbiAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlID09PSAnc2luZ2xlJztcbiAgfVxuXG4gIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XG4gICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fFxuICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGVUaW1lRmlsdGVyOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGRhdGUgdGltZSBwaWNrZXIncyBpbnB1dCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuICovXG4gIHByaXZhdGUgX21pbjogVCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gIHByaXZhdGUgX21heDogVCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBwaWNrZXIncyBzZWxlY3QgbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0TW9kZTogU2VsZWN0TW9kZSA9ICdzaW5nbGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhcmFjdGVyIHRvIHNlcGFyYXRlIHRoZSAnZnJvbScgYW5kICd0bycgaW4gaW5wdXQgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJhbmdlU2VwYXJhdG9yID0gJ34nO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBUIHwgbnVsbDtcblxuICBwcml2YXRlIF92YWx1ZXM6IFRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBgY2hhbmdlYCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIGA8aW5wdXQ+YFxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgZGF0ZVRpbWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYW4gYGlucHV0YCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIGA8aW5wdXQ+YC5cbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIGRhdGVUaW1lSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiogVGhlIGRhdGUtdGltZS1waWNrZXIgdGhhdCB0aGlzIGlucHV0IGlzIGFzc29jaWF0ZWQgd2l0aC4gKi9cbiAgcHVibGljIGR0UGlja2VyOiBPd2xEYXRlVGltZUNvbXBvbmVudDxUPjtcblxuICBwcml2YXRlIGR0UGlja2VyU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgbG9jYWxlU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgcHJpdmF0ZSBsYXN0VmFsdWVWYWxpZCA9IHRydWU7XG5cbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB3aGV0aGVyIHRoZSBpbnB1dCBwYXJzZXMuICovXG4gIHByaXZhdGUgcGFyc2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICByZXR1cm4gdGhpcy5sYXN0VmFsdWVWYWxpZFxuICAgICAgPyBudWxsXG4gICAgICA6IHsgb3dsRGF0ZVRpbWVQYXJzZTogeyB0ZXh0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LnZhbHVlIH0gfTtcbiAgfTtcblxuICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBtaW4gZGF0ZS4gKi9cbiAgcHJpdmF0ZSBtaW5WYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhdGhpcy5taW4gfHxcbiAgICAgICAgIWNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWluLCBjb250cm9sVmFsdWUpIDw9IDBcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogeyBvd2xEYXRlVGltZU1pbjogeyBtaW46IHRoaXMubWluLCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH07XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUgJiYgY29udHJvbC52YWx1ZSkge1xuICAgICAgY29uc3QgY29udHJvbFZhbHVlRnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzBdKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZVRvID0gdGhpcy5nZXRWYWxpZERhdGUoXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgICApO1xuICAgICAgcmV0dXJuICF0aGlzLm1pbiB8fFxuICAgICAgICAhY29udHJvbFZhbHVlRnJvbSB8fFxuICAgICAgICAhY29udHJvbFZhbHVlVG8gfHxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZSh0aGlzLm1pbiwgY29udHJvbFZhbHVlRnJvbSkgPD0gMFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBvd2xEYXRlVGltZU1pbjoge1xuICAgICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgICBhY3R1YWw6IFtjb250cm9sVmFsdWVGcm9tLCBjb250cm9sVmFsdWVUb11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgIH1cbiAgfTtcblxuICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBtYXggZGF0ZS4gKi9cbiAgcHJpdmF0ZSBtYXhWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhdGhpcy5tYXggfHxcbiAgICAgICAgIWNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWF4LCBjb250cm9sVmFsdWUpID49IDBcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogeyBvd2xEYXRlVGltZU1heDogeyBtYXg6IHRoaXMubWF4LCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH07XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUgJiYgY29udHJvbC52YWx1ZSkge1xuICAgICAgY29uc3QgY29udHJvbFZhbHVlRnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzBdKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZVRvID0gdGhpcy5nZXRWYWxpZERhdGUoXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgICApO1xuICAgICAgcmV0dXJuICF0aGlzLm1heCB8fFxuICAgICAgICAhY29udHJvbFZhbHVlRnJvbSB8fFxuICAgICAgICAhY29udHJvbFZhbHVlVG8gfHxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZSh0aGlzLm1heCwgY29udHJvbFZhbHVlVG8pID49IDBcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgb3dsRGF0ZVRpbWVNYXg6IHtcbiAgICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgICAgYWN0dWFsOiBbY29udHJvbFZhbHVlRnJvbSwgY29udHJvbFZhbHVlVG9dXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgZGF0ZSBmaWx0ZXIuICovXG4gIHByaXZhdGUgZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKFxuICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSlcbiAgICApO1xuICAgIHJldHVybiAhdGhpcy5fZGF0ZVRpbWVGaWx0ZXIgfHxcbiAgICAgICFjb250cm9sVmFsdWUgfHxcbiAgICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyKGNvbnRyb2xWYWx1ZSlcbiAgICAgID8gbnVsbFxuICAgICAgOiB7IG93bERhdGVUaW1lRmlsdGVyOiB0cnVlIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgcmFuZ2UuXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlICdiZWZvcmUnIHZhbHVlIGlzIGJlZm9yZSB0aGUgJ3RvJyB2YWx1ZVxuICAgKiAqL1xuICBwcml2YXRlIHJhbmdlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sVmFsdWVGcm9tID0gdGhpcy5nZXRWYWxpZERhdGUoXG4gICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzBdKVxuICAgICk7XG4gICAgY29uc3QgY29udHJvbFZhbHVlVG8gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgKTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlRnJvbSB8fFxuICAgICAgIWNvbnRyb2xWYWx1ZVRvIHx8XG4gICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGNvbnRyb2xWYWx1ZUZyb20sIGNvbnRyb2xWYWx1ZVRvKSA8PSAwXG4gICAgICA/IG51bGxcbiAgICAgIDogeyBvd2xEYXRlVGltZVJhbmdlOiB0cnVlIH07XG4gIH07XG5cbiAgLyoqIFRoZSBjb21iaW5lZCBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGlzIGlucHV0LiAqL1xuICBwcml2YXRlIHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gfCBudWxsID0gVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICB0aGlzLnBhcnNlVmFsaWRhdG9yLFxuICAgIHRoaXMubWluVmFsaWRhdG9yLFxuICAgIHRoaXMubWF4VmFsaWRhdG9yLFxuICAgIHRoaXMuZmlsdGVyVmFsaWRhdG9yLFxuICAgIHRoaXMucmFuZ2VWYWxpZGF0b3JcbiAgXSk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMgKGVpdGhlciBkdWUgdG8gdXNlciBpbnB1dCBvciBwcm9ncmFtbWF0aWMgY2hhbmdlKS4gKi9cbiAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10gfCBUIHwgbnVsbD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgaGFzIGNoYW5nZWQgKi9cbiAgcHVibGljIGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgb25Nb2RlbENoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvbk1vZGVsVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JPbkNoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoT1dMX0RBVEVfVElNRV9GT1JNQVRTKVxuICAgIHByaXZhdGUgZGF0ZVRpbWVGb3JtYXRzOiBPd2xEYXRlVGltZUZvcm1hdHNcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGVUaW1lQWRhcHRlcikge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBPd2xEYXRlVGltZVBpY2tlcjogTm8gcHJvdmlkZXIgZm91bmQgZm9yIERhdGVUaW1lUGlja2VyLiBZb3UgbXVzdCBpbXBvcnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgYCArXG4gICAgICAgICAgYG1vZHVsZXMgYXQgeW91ciBhcHBsaWNhdGlvbiByb290OiBPd2xOYXRpdmVEYXRlVGltZU1vZHVsZSwgT3dsTW9tZW50RGF0ZVRpbWVNb2R1bGUsIG9yIHByb3ZpZGUgYSBgICtcbiAgICAgICAgICBgY3VzdG9tIGltcGxlbWVudGF0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGVUaW1lRm9ybWF0cykge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBPd2xEYXRlVGltZVBpY2tlcjogTm8gcHJvdmlkZXIgZm91bmQgZm9yIE9XTF9EQVRFX1RJTUVfRk9STUFUUy4gWW91IG11c3QgaW1wb3J0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGAgK1xuICAgICAgICAgIGBtb2R1bGVzIGF0IHlvdXIgYXBwbGljYXRpb24gcm9vdDogT3dsTmF0aXZlRGF0ZVRpbWVNb2R1bGUsIE93bE1vbWVudERhdGVUaW1lTW9kdWxlLCBvciBwcm92aWRlIGEgYCArXG4gICAgICAgICAgYGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9jYWxlU3ViID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kdFBpY2tlcikge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBPd2xEYXRlVGltZVBpY2tlcjogdGhlIHBpY2tlciBpbnB1dCBkb2Vzbid0IGhhdmUgYW55IGFzc29jaWF0ZWQgb3dsLWRhdGUtdGltZSBjb21wb25lbnRgXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmZvcm1hdE5hdGl2ZUlucHV0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kdFBpY2tlclN1YiA9IHRoaXMuZHRQaWNrZXIuY29uZmlybVNlbGVjdGVkQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgIChzZWxlY3RlZHM6IFRbXSB8IFQpID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRzKSkge1xuICAgICAgICAgIHRoaXMudmFsdWVzID0gc2VsZWN0ZWRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZHM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2Uoc2VsZWN0ZWRzKTtcbiAgICAgICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmRhdGVUaW1lQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRzLFxuICAgICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXQuZW1pdCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZHMsXG4gICAgICAgICAgaW5wdXQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmR0UGlja2VyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5sb2NhbGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kaXNhYmxlZENoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoYzogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yID8gdGhpcy52YWxpZGF0b3IoYykgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBuYXRpdmUgaW5wdXQgcHJvcGVydHkgJ3ZhbHVlJ1xuICAgKi9cbiAgcHVibGljIGZvcm1hdE5hdGl2ZUlucHV0VmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICd2YWx1ZScsXG4gICAgICAgIHRoaXMuX3ZhbHVlXG4gICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodGhpcy5fdmFsdWUsIHRoaXMuZHRQaWNrZXIuZm9ybWF0U3RyaW5nKVxuICAgICAgICAgIDogJydcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZXMgJiYgdGhpcy52YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5fdmFsdWVzWzBdO1xuICAgICAgICBjb25zdCB0byA9IHRoaXMuX3ZhbHVlc1sxXTtcblxuICAgICAgICBjb25zdCBmcm9tRm9ybWF0dGVkID0gZnJvbVxuICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KGZyb20sIHRoaXMuZHRQaWNrZXIuZm9ybWF0U3RyaW5nKVxuICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IHRvRm9ybWF0dGVkID0gdG9cbiAgICAgICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdCh0bywgdGhpcy5kdFBpY2tlci5mb3JtYXRTdHJpbmcpXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICBpZiAoIWZyb21Gb3JtYXR0ZWQgJiYgIXRvRm9ybWF0dGVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgZnJvbUZvcm1hdHRlZCArICcgJyArIHRoaXMucmFuZ2VTZXBhcmF0b3IgKyAnICcgKyB0b0Zvcm1hdHRlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICBmcm9tRm9ybWF0dGVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICB0b0Zvcm1hdHRlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBpbnB1dCBhbmQgaXRzIHBpY2tlciBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJEYXRlVGltZVBpY2tlcihwaWNrZXI6IE93bERhdGVUaW1lQ29tcG9uZW50PFQ+KSB7XG4gICAgaWYgKHBpY2tlcikge1xuICAgICAgdGhpcy5kdFBpY2tlciA9IHBpY2tlcjtcbiAgICAgIHRoaXMuZHRQaWNrZXIucmVnaXN0ZXJJbnB1dCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGdpdmVuIG9iaiB0byBhIHZhbGlkIGRhdGUgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGdldFZhbGlkRGF0ZShvYmo6IGFueSk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNEYXRlSW5zdGFuY2Uob2JqKSAmJlxuICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChvYmopXG4gICAgICA/IG9ialxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSB0aW1lIHN0cmluZyB0byBhIGRhdGUtdGltZSBzdHJpbmdcbiAgICogV2hlbiBwaWNrZXJUeXBlIGlzICd0aW1lcicsIHRoZSB2YWx1ZSBpbiB0aGUgcGlja2VyJ3MgaW5wdXQgaXMgYSB0aW1lIHN0cmluZy5cbiAgICogVGhlIGRhdGVUaW1lQWRhcHRlciBwYXJzZSBmbiBjb3VsZCBub3QgcGFyc2UgYSB0aW1lIHN0cmluZyB0byBhIERhdGUgT2JqZWN0LlxuICAgKiBUaGVyZWZvcmUgd2UgbmVlZCB0aGlzIGZuIHRvIGNvbnZlcnQgYSB0aW1lIHN0cmluZyB0byBhIGRhdGUtdGltZSBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUaW1lU3RyaW5nVG9EYXRlVGltZVN0cmluZyhcbiAgICB0aW1lU3RyaW5nOiBzdHJpbmcsXG4gICAgZGF0ZVRpbWU6IFRcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICAgIGNvbnN0IHYgPSBkYXRlVGltZSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKTtcbiAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQoXG4gICAgICAgIHYsXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLmRhdGVQaWNrZXJJbnB1dFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkYXRlU3RyaW5nICsgJyAnICsgdGltZVN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgaW4gc2luZ2xlIG1vZGVcbiAgICovXG4gIHByaXZhdGUgY2hhbmdlSW5wdXRJblNpbmdsZU1vZGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICBpZiAodGhpcy5kdFBpY2tlci5waWNrZXJUeXBlID09PSAndGltZXInKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuY29udmVydFRpbWVTdHJpbmdUb0RhdGVUaW1lU3RyaW5nKHZhbHVlLCB0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICB2YWx1ZSxcbiAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLnBhcnNlSW5wdXRcbiAgICApO1xuICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhcmVzdWx0IHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQocmVzdWx0KTtcbiAgICByZXN1bHQgPSB0aGlzLmdldFZhbGlkRGF0ZShyZXN1bHQpO1xuXG4gICAgLy8gaWYgdGhlIG5ld1ZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRWYWx1ZSwgd2UgaW50ZW5kIHRvIG5vdCBmaXJlIHRoZSB2YWx1ZUNoYW5nZSBldmVudFxuICAgIC8vIHJlc3VsdCBlcXVhbHMgdG8gbnVsbCBtZWFucyB0aGVyZSBpcyBpbnB1dCBldmVudCwgYnV0IHRoZSBpbnB1dCB2YWx1ZSBpcyBpbnZhbGlkXG4gICAgaWYgKCF0aGlzLmlzU2FtZVZhbHVlKHJlc3VsdCwgdGhpcy5fdmFsdWUpIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSByZXN1bHQ7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQocmVzdWx0KTtcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShyZXN1bHQpO1xuICAgICAgdGhpcy5kYXRlVGltZUlucHV0LmVtaXQoe1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHZhbHVlOiByZXN1bHQsXG4gICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGlucHV0IGNoYW5nZSBpbiByYW5nZUZyb20gb3IgcmFuZ2VUbyBtb2RlXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZUlucHV0SW5SYW5nZUZyb21Ub01vZGUoaW5wdXRWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9XG4gICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyA/IHRoaXMuX3ZhbHVlc1swXSA6IHRoaXMuX3ZhbHVlc1sxXTtcblxuICAgIGlmICh0aGlzLmR0UGlja2VyLnBpY2tlclR5cGUgPT09ICd0aW1lcicpIHtcbiAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmNvbnZlcnRUaW1lU3RyaW5nVG9EYXRlVGltZVN0cmluZyhcbiAgICAgICAgaW5wdXRWYWx1ZSxcbiAgICAgICAgb3JpZ2luYWxWYWx1ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICBpbnB1dFZhbHVlLFxuICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdHMucGFyc2VJbnB1dFxuICAgICk7XG4gICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9ICFyZXN1bHQgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChyZXN1bHQpO1xuICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHJlc3VsdCk7XG5cbiAgICAvLyBpZiB0aGUgbmV3VmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZFZhbHVlLCB3ZSBpbnRlbmQgdG8gbm90IGZpcmUgdGhlIHZhbHVlQ2hhbmdlIGV2ZW50XG4gICAgaWYgKFxuICAgICAgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nICYmXG4gICAgICAgIHRoaXMuaXNTYW1lVmFsdWUocmVzdWx0LCB0aGlzLl92YWx1ZXNbMF0pICYmXG4gICAgICAgIHJlc3VsdCkgfHxcbiAgICAgICh0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VUbycgJiZcbiAgICAgICAgdGhpcy5pc1NhbWVWYWx1ZShyZXN1bHQsIHRoaXMuX3ZhbHVlc1sxXSkgJiZcbiAgICAgICAgcmVzdWx0KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlcyA9XG4gICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJ1xuICAgICAgICA/IFtyZXN1bHQsIHRoaXMuX3ZhbHVlc1sxXV1cbiAgICAgICAgOiBbdGhpcy5fdmFsdWVzWzBdLCByZXN1bHRdO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZXMpO1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZXMpO1xuICAgIHRoaXMuZGF0ZVRpbWVJbnB1dC5lbWl0KHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZXMsXG4gICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgaW4gcmFuZ2UgbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VJbnB1dEluUmFuZ2VNb2RlKGlucHV0VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkcyA9IGlucHV0VmFsdWUuc3BsaXQodGhpcy5yYW5nZVNlcGFyYXRvcik7XG4gICAgbGV0IGZyb21TdHJpbmcgPSBzZWxlY3RlZHNbMF07XG4gICAgbGV0IHRvU3RyaW5nID0gc2VsZWN0ZWRzWzFdO1xuXG4gICAgaWYgKHRoaXMuZHRQaWNrZXIucGlja2VyVHlwZSA9PT0gJ3RpbWVyJykge1xuICAgICAgZnJvbVN0cmluZyA9IHRoaXMuY29udmVydFRpbWVTdHJpbmdUb0RhdGVUaW1lU3RyaW5nKFxuICAgICAgICBmcm9tU3RyaW5nLFxuICAgICAgICB0aGlzLnZhbHVlc1swXVxuICAgICAgKTtcbiAgICAgIHRvU3RyaW5nID0gdGhpcy5jb252ZXJ0VGltZVN0cmluZ1RvRGF0ZVRpbWVTdHJpbmcoXG4gICAgICAgIHRvU3RyaW5nLFxuICAgICAgICB0aGlzLnZhbHVlc1sxXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgZnJvbSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnBhcnNlKFxuICAgICAgZnJvbVN0cmluZyxcbiAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLnBhcnNlSW5wdXRcbiAgICApO1xuICAgIGxldCB0byA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnBhcnNlKFxuICAgICAgdG9TdHJpbmcsXG4gICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5wYXJzZUlucHV0XG4gICAgKTtcbiAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID1cbiAgICAgICghZnJvbSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKGZyb20pKSAmJlxuICAgICAgKCF0byB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRvKSk7XG4gICAgZnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKGZyb20pO1xuICAgIHRvID0gdGhpcy5nZXRWYWxpZERhdGUodG8pO1xuXG4gICAgLy8gaWYgdGhlIG5ld1ZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRWYWx1ZSwgd2UgaW50ZW5kIHRvIG5vdCBmaXJlIHRoZSB2YWx1ZUNoYW5nZSBldmVudFxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzU2FtZVZhbHVlKGZyb20sIHRoaXMuX3ZhbHVlc1swXSkgfHxcbiAgICAgICF0aGlzLmlzU2FtZVZhbHVlKHRvLCB0aGlzLl92YWx1ZXNbMV0pIHx8XG4gICAgICAoZnJvbSA9PT0gbnVsbCAmJiB0byA9PT0gbnVsbClcbiAgICApIHtcbiAgICAgIHRoaXMuX3ZhbHVlcyA9IFtmcm9tLCB0b107XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWVzKTtcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZXMpO1xuICAgICAgdGhpcy5kYXRlVGltZUlucHV0LmVtaXQoe1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZXMsXG4gICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHR3byB2YWx1ZSBpcyB0aGUgc2FtZVxuICAgKi9cbiAgcHJpdmF0ZSBpc1NhbWVWYWx1ZShmaXJzdDogVCB8IG51bGwsIHNlY29uZDogVCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmaXJzdCwgc2Vjb25kKSA9PT0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlyc3QgPT09IHNlY29uZDtcbiAgfVxufVxuIl19