@skyux/lookup 5.1.1 → 5.5.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-lookup-testing.umd.js +8 -8
  3. package/bundles/skyux-lookup.umd.js +480 -123
  4. package/documentation.json +1511 -675
  5. package/esm2015/index.js +32 -0
  6. package/esm2015/index.js.map +1 -0
  7. package/esm2015/lib/modules/autocomplete/autocomplete-adapter.service.js +62 -0
  8. package/esm2015/lib/modules/autocomplete/autocomplete-adapter.service.js.map +1 -0
  9. package/esm2015/lib/modules/autocomplete/autocomplete-default-search-function.js +39 -0
  10. package/esm2015/lib/modules/autocomplete/autocomplete-default-search-function.js.map +1 -0
  11. package/esm2015/lib/modules/autocomplete/autocomplete-input.directive.js +220 -0
  12. package/esm2015/lib/modules/autocomplete/autocomplete-input.directive.js.map +1 -0
  13. package/esm2015/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.js +19 -0
  14. package/esm2015/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.js.map +1 -0
  15. package/esm2015/lib/modules/autocomplete/autocomplete.component.js +732 -0
  16. package/esm2015/lib/modules/autocomplete/autocomplete.component.js.map +1 -0
  17. package/esm2015/lib/modules/autocomplete/autocomplete.module.js +65 -0
  18. package/esm2015/lib/modules/autocomplete/autocomplete.module.js.map +1 -0
  19. package/esm2015/lib/modules/autocomplete/types/autocomplete-default-search-function-options.js +2 -0
  20. package/esm2015/lib/modules/autocomplete/types/autocomplete-default-search-function-options.js.map +1 -0
  21. package/esm2015/lib/modules/autocomplete/types/autocomplete-input-text-change.js +2 -0
  22. package/esm2015/lib/modules/autocomplete/types/autocomplete-input-text-change.js.map +1 -0
  23. package/esm2015/lib/modules/autocomplete/types/autocomplete-message-type.js +15 -0
  24. package/esm2015/lib/modules/autocomplete/types/autocomplete-message-type.js.map +1 -0
  25. package/esm2015/lib/modules/autocomplete/types/autocomplete-message.js +2 -0
  26. package/esm2015/lib/modules/autocomplete/types/autocomplete-message.js.map +1 -0
  27. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-args.js +2 -0
  28. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-args.js.map +1 -0
  29. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-function.js +2 -0
  30. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-function.js.map +1 -0
  31. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.js +2 -0
  32. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.js.map +1 -0
  33. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result.js +2 -0
  34. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result.js.map +1 -0
  35. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-filter.js +2 -0
  36. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-filter.js.map +1 -0
  37. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-response.js +2 -0
  38. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-response.js.map +1 -0
  39. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function.js +2 -0
  40. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function.js.map +1 -0
  41. package/esm2015/lib/modules/autocomplete/types/autocomplete-selection-change.js +2 -0
  42. package/esm2015/lib/modules/autocomplete/types/autocomplete-selection-change.js.map +1 -0
  43. package/esm2015/lib/modules/autocomplete/types/autocomplete-show-more-args.js +2 -0
  44. package/esm2015/lib/modules/autocomplete/types/autocomplete-show-more-args.js.map +1 -0
  45. package/esm2015/{modules → lib/modules}/country-field/country-field.component.js +10 -6
  46. package/esm2015/lib/modules/country-field/country-field.component.js.map +1 -0
  47. package/esm2015/lib/modules/country-field/country-field.module.js +49 -0
  48. package/esm2015/lib/modules/country-field/country-field.module.js.map +1 -0
  49. package/esm2015/lib/modules/country-field/types/country.js +2 -0
  50. package/esm2015/lib/modules/country-field/types/country.js.map +1 -0
  51. package/esm2015/lib/modules/lookup/lookup-adapter.service.js +21 -0
  52. package/esm2015/lib/modules/lookup/lookup-adapter.service.js.map +1 -0
  53. package/esm2015/lib/modules/lookup/lookup-autocomplete-adapter.js +72 -0
  54. package/esm2015/lib/modules/lookup/lookup-autocomplete-adapter.js.map +1 -0
  55. package/esm2015/lib/modules/lookup/lookup-item-selected.pipe.js +16 -0
  56. package/esm2015/lib/modules/lookup/lookup-item-selected.pipe.js.map +1 -0
  57. package/esm2015/lib/modules/lookup/lookup-show-more-async-modal.component.js +186 -0
  58. package/esm2015/lib/modules/lookup/lookup-show-more-async-modal.component.js.map +1 -0
  59. package/esm2015/lib/modules/lookup/lookup-show-more-modal.component.js +258 -0
  60. package/esm2015/lib/modules/lookup/lookup-show-more-modal.component.js.map +1 -0
  61. package/esm2015/lib/modules/lookup/lookup.component.js +608 -0
  62. package/esm2015/lib/modules/lookup/lookup.component.js.map +1 -0
  63. package/esm2015/lib/modules/lookup/lookup.module.js +94 -0
  64. package/esm2015/lib/modules/lookup/lookup.module.js.map +1 -0
  65. package/esm2015/lib/modules/lookup/types/lookup-add-click-callback-args.js +2 -0
  66. package/esm2015/lib/modules/lookup/types/lookup-add-click-callback-args.js.map +1 -0
  67. package/esm2015/lib/modules/lookup/types/lookup-add-click-event-args.js +2 -0
  68. package/esm2015/lib/modules/lookup/types/lookup-add-click-event-args.js.map +1 -0
  69. package/esm2015/lib/modules/lookup/types/lookup-select-mode-type.js +2 -0
  70. package/esm2015/lib/modules/lookup/types/lookup-select-mode-type.js.map +1 -0
  71. package/esm2015/lib/modules/lookup/types/lookup-select-mode.js +16 -0
  72. package/esm2015/lib/modules/lookup/types/lookup-select-mode.js.map +1 -0
  73. package/esm2015/lib/modules/lookup/types/lookup-show-more-config.js +2 -0
  74. package/esm2015/lib/modules/lookup/types/lookup-show-more-config.js.map +1 -0
  75. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker-context.js +7 -0
  76. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker-context.js.map +1 -0
  77. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker.js +2 -0
  78. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker.js.map +1 -0
  79. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.js +7 -0
  80. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.js.map +1 -0
  81. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-config.js +2 -0
  82. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-config.js.map +1 -0
  83. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-context.js +7 -0
  84. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-context.js.map +1 -0
  85. package/esm2015/lib/modules/search/search-adapter.service.js +45 -0
  86. package/esm2015/lib/modules/search/search-adapter.service.js.map +1 -0
  87. package/esm2015/lib/modules/search/search.component.js +260 -0
  88. package/esm2015/lib/modules/search/search.component.js.map +1 -0
  89. package/esm2015/lib/modules/search/search.module.js +46 -0
  90. package/esm2015/lib/modules/search/search.module.js.map +1 -0
  91. package/esm2015/lib/modules/shared/sky-lookup-resources.module.js +72 -0
  92. package/esm2015/lib/modules/shared/sky-lookup-resources.module.js.map +1 -0
  93. package/esm2015/lib/modules/shared/sky-lookup-string-utils.js +8 -0
  94. package/esm2015/lib/modules/shared/sky-lookup-string-utils.js.map +1 -0
  95. package/esm2015/lib/polyfills.js +30 -0
  96. package/esm2015/lib/polyfills.js.map +1 -0
  97. package/esm2015/skyux-lookup.js +2 -2
  98. package/esm2015/skyux-lookup.js.map +1 -0
  99. package/esm2015/testing/country-field/country-field-fixture.js +1 -1
  100. package/esm2015/testing/country-field/country-field-fixture.js.map +1 -0
  101. package/esm2015/testing/country-field/country-field-testing.module.js +5 -5
  102. package/esm2015/testing/country-field/country-field-testing.module.js.map +1 -0
  103. package/esm2015/testing/public-api.js +1 -1
  104. package/esm2015/testing/public-api.js.map +1 -0
  105. package/esm2015/testing/search/search-fixture.js +1 -1
  106. package/esm2015/testing/search/search-fixture.js.map +1 -0
  107. package/esm2015/testing/search/search-testing.module.js +5 -5
  108. package/esm2015/testing/search/search-testing.module.js.map +1 -0
  109. package/esm2015/testing/skyux-lookup-testing.js +1 -1
  110. package/esm2015/testing/skyux-lookup-testing.js.map +1 -0
  111. package/fesm2015/skyux-lookup-testing.js +8 -8
  112. package/fesm2015/skyux-lookup-testing.js.map +1 -1
  113. package/fesm2015/skyux-lookup.js +443 -123
  114. package/fesm2015/skyux-lookup.js.map +1 -1
  115. package/index.d.ts +27 -0
  116. package/{modules → lib/modules}/autocomplete/autocomplete-adapter.service.d.ts +0 -0
  117. package/{modules → lib/modules}/autocomplete/autocomplete-default-search-function.d.ts +0 -0
  118. package/{modules → lib/modules}/autocomplete/autocomplete-input.directive.d.ts +0 -0
  119. package/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.d.ts +11 -0
  120. package/{modules → lib/modules}/autocomplete/autocomplete.component.d.ts +17 -6
  121. package/lib/modules/autocomplete/autocomplete.module.d.ts +15 -0
  122. package/{modules → lib/modules}/autocomplete/types/autocomplete-default-search-function-options.d.ts +0 -0
  123. package/{modules → lib/modules}/autocomplete/types/autocomplete-input-text-change.d.ts +0 -0
  124. package/{modules → lib/modules}/autocomplete/types/autocomplete-message-type.d.ts +0 -0
  125. package/{modules → lib/modules}/autocomplete/types/autocomplete-message.d.ts +0 -0
  126. package/lib/modules/autocomplete/types/autocomplete-search-async-args.d.ts +35 -0
  127. package/lib/modules/autocomplete/types/autocomplete-search-async-function.d.ts +4 -0
  128. package/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.d.ts +1 -0
  129. package/lib/modules/autocomplete/types/autocomplete-search-async-result.d.ts +25 -0
  130. package/{modules → lib/modules}/autocomplete/types/autocomplete-search-function-filter.d.ts +0 -0
  131. package/{modules → lib/modules}/autocomplete/types/autocomplete-search-function-response.d.ts +0 -0
  132. package/{modules → lib/modules}/autocomplete/types/autocomplete-search-function.d.ts +0 -0
  133. package/{modules → lib/modules}/autocomplete/types/autocomplete-selection-change.d.ts +0 -0
  134. package/{modules → lib/modules}/autocomplete/types/autocomplete-show-more-args.d.ts +0 -0
  135. package/{modules → lib/modules}/country-field/country-field.component.d.ts +3 -2
  136. package/{modules → lib/modules}/country-field/country-field.module.d.ts +0 -0
  137. package/{modules → lib/modules}/country-field/types/country.d.ts +0 -0
  138. package/{modules → lib/modules}/lookup/lookup-adapter.service.d.ts +0 -0
  139. package/{modules → lib/modules}/lookup/lookup-autocomplete-adapter.d.ts +6 -4
  140. package/lib/modules/lookup/lookup-item-selected.pipe.d.ts +7 -0
  141. package/lib/modules/lookup/lookup-show-more-async-modal.component.d.ts +49 -0
  142. package/{modules → lib/modules}/lookup/lookup-show-more-modal.component.d.ts +0 -0
  143. package/{modules → lib/modules}/lookup/lookup.component.d.ts +3 -0
  144. package/lib/modules/lookup/lookup.module.d.ts +23 -0
  145. package/{modules → lib/modules}/lookup/types/lookup-add-click-callback-args.d.ts +0 -0
  146. package/{modules → lib/modules}/lookup/types/lookup-add-click-event-args.d.ts +0 -0
  147. package/{modules → lib/modules}/lookup/types/lookup-select-mode-type.d.ts +0 -0
  148. package/{modules → lib/modules}/lookup/types/lookup-select-mode.d.ts +0 -0
  149. package/{modules → lib/modules}/lookup/types/lookup-show-more-config.d.ts +0 -0
  150. package/{modules → lib/modules}/lookup/types/lookup-show-more-custom-picker-context.d.ts +0 -0
  151. package/{modules → lib/modules}/lookup/types/lookup-show-more-custom-picker.d.ts +0 -0
  152. package/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.d.ts +17 -0
  153. package/{modules → lib/modules}/lookup/types/lookup-show-more-native-picker-config.d.ts +1 -1
  154. package/{modules → lib/modules}/lookup/types/lookup-show-more-native-picker-context.d.ts +0 -0
  155. package/{modules → lib/modules}/search/search-adapter.service.d.ts +0 -0
  156. package/{modules → lib/modules}/search/search.component.d.ts +5 -5
  157. package/{modules → lib/modules}/search/search.module.d.ts +0 -0
  158. package/{modules → lib/modules}/shared/sky-lookup-resources.module.d.ts +0 -0
  159. package/{modules → lib/modules}/shared/sky-lookup-string-utils.d.ts +0 -0
  160. package/{polyfills.d.ts → lib/polyfills.d.ts} +0 -0
  161. package/package.json +12 -12
  162. package/skyux-lookup.d.ts +1 -1
  163. package/LICENSE +0 -21
  164. package/esm2015/modules/autocomplete/autocomplete-adapter.service.js +0 -61
  165. package/esm2015/modules/autocomplete/autocomplete-default-search-function.js +0 -39
  166. package/esm2015/modules/autocomplete/autocomplete-input.directive.js +0 -220
  167. package/esm2015/modules/autocomplete/autocomplete.component.js +0 -684
  168. package/esm2015/modules/autocomplete/autocomplete.module.js +0 -52
  169. package/esm2015/modules/autocomplete/types/autocomplete-default-search-function-options.js +0 -2
  170. package/esm2015/modules/autocomplete/types/autocomplete-input-text-change.js +0 -2
  171. package/esm2015/modules/autocomplete/types/autocomplete-message-type.js +0 -15
  172. package/esm2015/modules/autocomplete/types/autocomplete-message.js +0 -2
  173. package/esm2015/modules/autocomplete/types/autocomplete-search-function-filter.js +0 -2
  174. package/esm2015/modules/autocomplete/types/autocomplete-search-function-response.js +0 -2
  175. package/esm2015/modules/autocomplete/types/autocomplete-search-function.js +0 -2
  176. package/esm2015/modules/autocomplete/types/autocomplete-selection-change.js +0 -2
  177. package/esm2015/modules/autocomplete/types/autocomplete-show-more-args.js +0 -2
  178. package/esm2015/modules/country-field/country-field.module.js +0 -49
  179. package/esm2015/modules/country-field/types/country.js +0 -2
  180. package/esm2015/modules/lookup/lookup-adapter.service.js +0 -21
  181. package/esm2015/modules/lookup/lookup-autocomplete-adapter.js +0 -67
  182. package/esm2015/modules/lookup/lookup-show-more-modal.component.js +0 -252
  183. package/esm2015/modules/lookup/lookup.component.js +0 -571
  184. package/esm2015/modules/lookup/lookup.module.js +0 -78
  185. package/esm2015/modules/lookup/types/lookup-add-click-callback-args.js +0 -2
  186. package/esm2015/modules/lookup/types/lookup-add-click-event-args.js +0 -2
  187. package/esm2015/modules/lookup/types/lookup-select-mode-type.js +0 -2
  188. package/esm2015/modules/lookup/types/lookup-select-mode.js +0 -16
  189. package/esm2015/modules/lookup/types/lookup-show-more-config.js +0 -2
  190. package/esm2015/modules/lookup/types/lookup-show-more-custom-picker-context.js +0 -7
  191. package/esm2015/modules/lookup/types/lookup-show-more-custom-picker.js +0 -2
  192. package/esm2015/modules/lookup/types/lookup-show-more-native-picker-config.js +0 -2
  193. package/esm2015/modules/lookup/types/lookup-show-more-native-picker-context.js +0 -7
  194. package/esm2015/modules/search/search-adapter.service.js +0 -45
  195. package/esm2015/modules/search/search.component.js +0 -260
  196. package/esm2015/modules/search/search.module.js +0 -46
  197. package/esm2015/modules/shared/sky-lookup-resources.module.js +0 -69
  198. package/esm2015/modules/shared/sky-lookup-string-utils.js +0 -8
  199. package/esm2015/polyfills.js +0 -30
  200. package/esm2015/public-api.js +0 -29
  201. package/modules/autocomplete/autocomplete.module.d.ts +0 -14
  202. package/modules/lookup/lookup.module.d.ts +0 -21
  203. package/public-api.d.ts +0 -24
@@ -1,571 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import { fromEvent as observableFromEvent, Subject } from 'rxjs';
3
- import { take, takeUntil } from 'rxjs/operators';
4
- import { SkyTokensMessageType, } from '@skyux/indicators';
5
- import { SkyAutocompleteMessageType } from '../autocomplete/types/autocomplete-message-type';
6
- import { SkyAutocompleteInputDirective } from '../autocomplete/autocomplete-input.directive';
7
- import { SkyLookupAutocompleteAdapter } from './lookup-autocomplete-adapter';
8
- import { SkyLookupAdapterService } from './lookup-adapter.service';
9
- import { SkyLookupShowMoreModalComponent } from './lookup-show-more-modal.component';
10
- import { SkyLookupShowMoreNativePickerContext } from './types/lookup-show-more-native-picker-context';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@skyux/core";
13
- import * as i2 from "@angular/forms";
14
- import * as i3 from "./lookup-adapter.service";
15
- import * as i4 from "@skyux/modals";
16
- import * as i5 from "@skyux/i18n";
17
- import * as i6 from "@skyux/forms";
18
- import * as i7 from "@skyux/theme";
19
- import * as i8 from "../autocomplete/autocomplete.component";
20
- import * as i9 from "@skyux/indicators";
21
- import * as i10 from "@angular/common";
22
- import * as i11 from "../autocomplete/autocomplete-input.directive";
23
- export class SkyLookupComponent extends SkyLookupAutocompleteAdapter {
24
- constructor(changeDetector, elementRef, windowRef, ngControl, adapter, modalService, resourcesService, inputBoxHostSvc, themeSvc) {
25
- super();
26
- this.changeDetector = changeDetector;
27
- this.elementRef = elementRef;
28
- this.windowRef = windowRef;
29
- this.adapter = adapter;
30
- this.modalService = modalService;
31
- this.resourcesService = resourcesService;
32
- this.inputBoxHostSvc = inputBoxHostSvc;
33
- this.themeSvc = themeSvc;
34
- /**
35
- * Indicates whether to disable the lookup field.
36
- */
37
- this.disabled = false;
38
- /**
39
- * Indicates whether to enable users to open a picker where they can view all options.
40
- */
41
- this.enableShowMore = false;
42
- /**
43
- * Indicates whether to display a button that lets users add options to the list.
44
- */
45
- this.showAddButton = false;
46
- /**
47
- * Fires when users select the button to add options to the list.
48
- */
49
- this.addClick = new EventEmitter();
50
- this.autocompleteController = new Subject();
51
- this.isInputFocused = false;
52
- this.tokensController = new Subject();
53
- this.ngUnsubscribe = new Subject();
54
- this.idle = new Subject();
55
- this.markForTokenFocusOnKeyUp = false;
56
- // Angular automatically constructs these methods.
57
- /* istanbul ignore next */
58
- this.onChange = (value) => { };
59
- /* istanbul ignore next */
60
- this.onTouched = () => { };
61
- ngControl.valueAccessor = this;
62
- }
63
- /**
64
- * Specifies a data source for the lookup component to search when users
65
- * enter text. You can specify static data such as an array of objects, or
66
- * you can pull data from a database.
67
- * @default []
68
- */
69
- set data(value) {
70
- this._data = value;
71
- if (this.openNativePicker) {
72
- this.openNativePicker.componentInstance.updateItemData(value);
73
- }
74
- }
75
- get data() {
76
- return this._data;
77
- }
78
- /**
79
- * Specifies whether users can select one option or multiple options.
80
- * @default "mulitple"
81
- */
82
- set selectMode(value) {
83
- let multipleToSingle = value === 'single' && this.selectMode === 'multiple';
84
- this._selectMode = value;
85
- this.updateForSelectMode();
86
- if (multipleToSingle) {
87
- if (this.value && this.value.length > 1) {
88
- // The `setTimeout` is needed to avoid a `ExpressionChangedAfterItHasBeenCheckedError` error in template forms.
89
- setTimeout(() => {
90
- this.writeValue([this.value[0]]);
91
- this.changeDetector.detectChanges();
92
- });
93
- }
94
- }
95
- }
96
- get selectMode() {
97
- return this._selectMode || 'multiple';
98
- }
99
- get tokens() {
100
- return this._tokens;
101
- }
102
- set tokens(value) {
103
- // Collapse the tokens into a single token if the user has selected many options.
104
- if (this.enableShowMore && this.value.length > 5) {
105
- this.resourcesService
106
- .getString('skyux_lookup_tokens_summary', this.value.length.toString())
107
- .pipe(take(1))
108
- .subscribe((label) => {
109
- this._tokens = [
110
- {
111
- value: { [this.descriptorProperty]: label },
112
- },
113
- ];
114
- this.changeDetector.markForCheck();
115
- });
116
- }
117
- else {
118
- this._tokens = value;
119
- this.changeDetector.markForCheck();
120
- }
121
- }
122
- get value() {
123
- return this._value ? this._value : [];
124
- }
125
- set value(newValue) {
126
- this._value = newValue;
127
- if (!this.openNativePicker) {
128
- this.tokens = this.parseTokens(newValue);
129
- }
130
- this.onChange(this._value);
131
- this.onTouched();
132
- }
133
- set autocompleteInputDirective(value) {
134
- this._autocompleteInputDirective = value;
135
- this.updateForSelectMode();
136
- }
137
- get autocompleteInputDirective() {
138
- return this._autocompleteInputDirective;
139
- }
140
- ngOnInit() {
141
- if (this.inputBoxHostSvc) {
142
- this.inputBoxHostSvc.populate({
143
- inputTemplate: this.inputTemplateRef,
144
- buttonsTemplate: this.enableShowMore
145
- ? this.showMoreButtonTemplateRef
146
- : undefined,
147
- iconsInsetTemplate: this.enableShowMore
148
- ? undefined
149
- : this.searchIconTemplateRef,
150
- });
151
- }
152
- /* istanbul ignore else */
153
- if (this.themeSvc) {
154
- // This is required for the autocomplete directive to be set after elements
155
- // are rearranged when switching themes.
156
- this.themeSvc.settingsChange
157
- .pipe(takeUntil(this.ngUnsubscribe))
158
- .subscribe(() => {
159
- this.changeDetector.markForCheck();
160
- });
161
- }
162
- }
163
- ngAfterViewInit() {
164
- if (!this.disabled) {
165
- this.addEventListeners();
166
- }
167
- }
168
- ngOnDestroy() {
169
- this.removeEventListeners();
170
- this.ngUnsubscribe.next();
171
- this.ngUnsubscribe.complete();
172
- this.tokensController.complete();
173
- }
174
- addButtonClicked() {
175
- this.addClick.emit({
176
- itemAdded: (args) => this.onAddButtonComplete(args),
177
- });
178
- }
179
- onAutocompleteSelectionChange(change) {
180
- /* istanbul ignore else */
181
- if (change.selectedItem) {
182
- this.addToSelected(change.selectedItem);
183
- }
184
- else if (this.selectMode === 'single') {
185
- this.writeValue([]);
186
- }
187
- }
188
- onAutocompleteBlur() {
189
- this.onTouched();
190
- }
191
- onTokensChange(change) {
192
- if (!change) {
193
- return;
194
- }
195
- if (this.tokens !== change) {
196
- if (change.length === 0) {
197
- this.focusInput();
198
- }
199
- // NOTE: We do this here instead of just using the `value` setter because we need to use the
200
- // set of tokens returned here for the purposes of setting focus (see `onTokensKeyUp`).
201
- this._value = change.map((token) => {
202
- return token.value;
203
- });
204
- this.tokens = change;
205
- this.sendAutocompleteMessage(SkyAutocompleteMessageType.RepositionDropdown);
206
- this.onChange(this._value);
207
- this.onTouched();
208
- }
209
- }
210
- onTokensFocusIndexOverRange() {
211
- this.windowRef.nativeWindow.setTimeout(() => {
212
- this.focusInput();
213
- });
214
- }
215
- onTokensKeyUp(event) {
216
- /* istanbul ignore else */
217
- if (this.selectMode !== 'single') {
218
- /* tslint:disable-next-line:switch-default */
219
- switch (event.key) {
220
- case 'Backspace':
221
- this.sendTokensMessage(SkyTokensMessageType.RemoveActiveToken);
222
- this.sendTokensMessage(SkyTokensMessageType.FocusPreviousToken);
223
- event.preventDefault();
224
- break;
225
- case 'Del':
226
- case 'Delete':
227
- this.sendTokensMessage(SkyTokensMessageType.RemoveActiveToken);
228
- this.windowRef.nativeWindow.setTimeout(() => {
229
- this.sendTokensMessage(SkyTokensMessageType.FocusActiveToken);
230
- });
231
- event.preventDefault();
232
- break;
233
- }
234
- }
235
- }
236
- writeValue(value) {
237
- this.value = value ? value : [];
238
- this.updateForSelectMode();
239
- }
240
- registerOnChange(fn) {
241
- this.onChange = fn;
242
- }
243
- registerOnTouched(fn) {
244
- this.onTouched = fn;
245
- }
246
- // Allows Angular to disable the input.
247
- setDisabledState(disabled) {
248
- this.removeEventListeners();
249
- if (!disabled) {
250
- this.addEventListeners();
251
- }
252
- this.disabled = disabled;
253
- this.changeDetector.markForCheck();
254
- }
255
- clearSearchText() {
256
- this.autocompleteInputDirective.value = undefined;
257
- this.autocompleteInputDirective.inputTextValue = undefined;
258
- }
259
- // Handles when to focus on the tokens.
260
- // Check for empty search text on keydown, before the escape key is fully pressed.
261
- // (Otherwise, a single character being escaped would register as empty on keyup.)
262
- // If empty on keydown, set a flag so that the appropriate action can be taken on keyup.
263
- inputKeydown(event, value) {
264
- /* Sanity check as this should only be called when in multiple select mode */
265
- /* istanbul ignore else */
266
- if (this.selectMode !== 'single') {
267
- switch (event.key) {
268
- case 'Enter':
269
- event.preventDefault();
270
- break;
271
- case 'ArrowLeft':
272
- case 'Backspace':
273
- case 'Left':
274
- if (value) {
275
- this.markForTokenFocusOnKeyUp = false;
276
- }
277
- else {
278
- this.markForTokenFocusOnKeyUp = true;
279
- }
280
- break;
281
- default:
282
- }
283
- }
284
- }
285
- inputKeyup(event) {
286
- /* Sanity check as this should only be called when in multiple select mode */
287
- /* istanbul ignore else */
288
- if (this.selectMode !== 'single') {
289
- switch (event.key) {
290
- case 'Esc':
291
- case 'Escape':
292
- this.clearSearchText();
293
- event.preventDefault();
294
- break;
295
- case 'ArrowLeft':
296
- case 'Backspace':
297
- case 'Left':
298
- /* istanbul ignore else */
299
- if (this.markForTokenFocusOnKeyUp) {
300
- this.sendTokensMessage(SkyTokensMessageType.FocusLastToken);
301
- event.preventDefault();
302
- }
303
- break;
304
- default:
305
- }
306
- event.stopPropagation();
307
- }
308
- }
309
- onSearchButtonClick() {
310
- /*istanbul ignore next*/
311
- if (this.disabled) {
312
- return;
313
- }
314
- this.sendAutocompleteMessage(SkyAutocompleteMessageType.CloseDropdown);
315
- let isValueInTextBox = false;
316
- if (this.selectMode === 'single') {
317
- isValueInTextBox =
318
- this.autocompleteInputDirective.inputTextValue ===
319
- this.autocompleteInputDirective.value[this.descriptorProperty];
320
- }
321
- this.openPicker(isValueInTextBox ? '' : this.autocompleteInputDirective.inputTextValue);
322
- this.autocompleteInputDirective.restoreInputTextValueToPreviousState();
323
- }
324
- onShowMoreClick(event) {
325
- /* Sanity check */
326
- /* istanbul ignore else*/
327
- if (event) {
328
- this.openPicker(event.inputValue);
329
- }
330
- }
331
- openPicker(initialSearch) {
332
- var _a, _b;
333
- if ((_a = this.showMoreConfig) === null || _a === void 0 ? void 0 : _a.customPicker) {
334
- this.showMoreConfig.customPicker.open({
335
- items: this.data,
336
- initialSearch: initialSearch,
337
- initialValue: this.value,
338
- });
339
- }
340
- else {
341
- let initialValue = this.value;
342
- const modalConfig = ((_b = this.showMoreConfig) === null || _b === void 0 ? void 0 : _b.nativePickerConfig) || {};
343
- if (!modalConfig.itemTemplate) {
344
- modalConfig.itemTemplate = this.searchResultTemplate;
345
- }
346
- let context = {
347
- items: this.data,
348
- descriptorProperty: this.descriptorProperty,
349
- initialSearch: initialSearch,
350
- initialValue: initialValue,
351
- search: this.search,
352
- selectMode: this.selectMode,
353
- showAddButton: this.showAddButton,
354
- userConfig: modalConfig,
355
- };
356
- this.openNativePicker = this.modalService.open(SkyLookupShowMoreModalComponent, {
357
- providers: [
358
- {
359
- provide: SkyLookupShowMoreNativePickerContext,
360
- useValue: context,
361
- },
362
- ],
363
- wrapperClass: this.wrapperClass,
364
- });
365
- this.openNativePicker.componentInstance.addClick.subscribe(() => {
366
- this.addButtonClicked();
367
- });
368
- this.openNativePicker.closed.subscribe((closeArgs) => {
369
- this.openNativePicker = undefined;
370
- if (closeArgs.reason === 'save') {
371
- let selectedItems = [];
372
- this.data.forEach((item, dataIndex) => {
373
- if (closeArgs.data.some((savedItem) => {
374
- return savedItem.index === dataIndex;
375
- })) {
376
- selectedItems.push(item);
377
- }
378
- });
379
- this.writeValue(selectedItems);
380
- }
381
- else {
382
- this.writeValue(initialValue);
383
- }
384
- this.focusInput();
385
- this.changeDetector.markForCheck();
386
- });
387
- }
388
- }
389
- addToSelected(item) {
390
- let selectedItems;
391
- if (this.selectMode === 'single') {
392
- selectedItems = [item];
393
- }
394
- else {
395
- selectedItems = this.value;
396
- // If items have a unique identifier, don't allow the same item to be added twice.
397
- if (!this.idProperty ||
398
- !this.value.some((existingItem) => existingItem[this.idProperty] === item[this.idProperty])) {
399
- selectedItems.push(item);
400
- }
401
- this.clearSearchText();
402
- }
403
- this.writeValue(selectedItems);
404
- }
405
- addEventListeners() {
406
- this.idle = new Subject();
407
- this.focusInputOnHostClick();
408
- }
409
- removeEventListeners() {
410
- this.idle.next();
411
- this.idle.complete();
412
- }
413
- focusInputOnHostClick() {
414
- let hostElement = !this.inputBoxHostSvc
415
- ? this.elementRef.nativeElement
416
- : this.lookupWrapperRef.nativeElement;
417
- const documentObj = this.windowRef.nativeWindow.document;
418
- // Handles focusing the input when the host is clicked.
419
- // The input should NOT be focused if other elements (tokens, etc.)
420
- // are currently focused or being tabbed through.
421
- observableFromEvent(documentObj, 'mousedown')
422
- .pipe(takeUntil(this.idle))
423
- .subscribe((event) => {
424
- hostElement = !this.inputBoxHostSvc
425
- ? this.elementRef.nativeElement
426
- : this.lookupWrapperRef.nativeElement;
427
- this.isInputFocused = hostElement.contains(event.target);
428
- this.changeDetector.markForCheck();
429
- });
430
- observableFromEvent(documentObj, 'focusin')
431
- .pipe(takeUntil(this.idle))
432
- .subscribe((event) => {
433
- hostElement = !this.inputBoxHostSvc
434
- ? this.elementRef.nativeElement
435
- : this.lookupWrapperRef.nativeElement;
436
- this.isInputFocused = hostElement.contains(event.target);
437
- this.changeDetector.markForCheck();
438
- });
439
- observableFromEvent(hostElement, 'mouseup')
440
- .pipe(takeUntil(this.idle))
441
- .subscribe(() => {
442
- const classList = documentObj.activeElement.classList;
443
- if (!classList || !classList.contains('sky-token')) {
444
- this.focusInput();
445
- }
446
- });
447
- }
448
- focusInput() {
449
- this.adapter.focusInput(this.lookupWrapperRef);
450
- }
451
- onAddButtonComplete(args) {
452
- if (args.data) {
453
- this.data = args.data;
454
- }
455
- if (this.data.indexOf(args.item) >= 0) {
456
- if (this.openNativePicker) {
457
- (this.openNativePicker.componentInstance).onItemSelect(true, { value: args.item, selected: false });
458
- }
459
- else {
460
- let newValue = this.value;
461
- if (this.selectMode === 'multiple') {
462
- newValue = this.value.concat(args.item);
463
- }
464
- else {
465
- newValue = [args.item];
466
- }
467
- this.writeValue(newValue);
468
- }
469
- }
470
- }
471
- parseTokens(data) {
472
- return data.map((item) => {
473
- return {
474
- value: item,
475
- };
476
- });
477
- }
478
- sendAutocompleteMessage(type) {
479
- this.autocompleteController.next({ type });
480
- }
481
- sendTokensMessage(type) {
482
- this.tokensController.next({ type });
483
- }
484
- updateForSelectMode() {
485
- if (this.autocompleteInputDirective) {
486
- if (this.selectMode === 'single') {
487
- this.autocompleteInputDirective.value = this.value && this.value[0];
488
- }
489
- else {
490
- this.clearSearchText();
491
- }
492
- }
493
- }
494
- }
495
- SkyLookupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyLookupComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAppWindowRef }, { token: i2.NgControl, optional: true, self: true }, { token: i3.SkyLookupAdapterService }, { token: i4.SkyModalService }, { token: i5.SkyLibResourcesService }, { token: i6.SkyInputBoxHostService, optional: true }, { token: i7.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
496
- SkyLookupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyLookupComponent, selector: "sky-lookup", inputs: { ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", autocompleteAttribute: "autocompleteAttribute", data: "data", disabled: "disabled", enableShowMore: "enableShowMore", placeholderText: "placeholderText", idProperty: "idProperty", showAddButton: "showAddButton", showMoreConfig: "showMoreConfig", selectMode: "selectMode", wrapperClass: "wrapperClass" }, outputs: { addClick: "addClick" }, providers: [SkyLookupAdapterService], viewQueries: [{ propertyName: "autocompleteInputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true, read: SkyAutocompleteInputDirective }, { propertyName: "showMoreButtonTemplateRef", first: true, predicate: ["showMoreButtonTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "inputTemplateRef", first: true, predicate: ["inputTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "lookupWrapperRef", first: true, predicate: ["lookupWrapper"], descendants: true, read: ElementRef }, { propertyName: "searchIconTemplateRef", first: true, predicate: ["searchIconTemplateRef"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!inputBoxHostSvc\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\"></ng-container>\n</ng-container>\n\n<ng-template #inputTemplateRef>\n <div\n class=\"sky-lookup\"\n [ngClass]=\"{\n 'sky-lookup-focused': isInputFocused,\n 'sky-lookup-disabled': disabled,\n 'sky-lookup-single': selectMode === 'single'\n }\"\n #lookupWrapper\n >\n <sky-autocomplete\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [data]=\"data\"\n [debounceTime]=\"debounceTime\"\n [descriptorProperty]=\"descriptorProperty\"\n [enableShowMore]=\"enableShowMore\"\n [messageStream]=\"autocompleteController\"\n [propertiesToSearch]=\"propertiesToSearch\"\n [search]=\"search\"\n [searchFilters]=\"searchFilters\"\n [searchResultsLimit]=\"searchResultsLimit\"\n [searchResultTemplate]=\"searchResultTemplate\"\n [searchTextMinimumCharacters]=\"searchTextMinimumCharacters\"\n [showAddButton]=\"showAddButton\"\n [wrapperClass]=\"wrapperClass\"\n (addClick)=\"addButtonClicked()\"\n (selectionChange)=\"onAutocompleteSelectionChange($event)\"\n (showMoreClick)=\"onShowMoreClick($event)\"\n >\n <div class=\"sky-lookup-search-flex-wrapper\">\n <div\n class=\"sky-lookup-search\"\n [ngClass]=\"{\n 'sky-field-status-active': isInputFocused && !disabled\n }\"\n >\n <sky-tokens\n *ngIf=\"selectMode === 'multiple'\"\n class=\"sky-lookup-tokens\"\n [disabled]=\"disabled\"\n [displayWith]=\"descriptorProperty\"\n [focusable]=\"false\"\n [messageStream]=\"tokensController\"\n [trackWith]=\"idProperty\"\n [tokens]=\"tokens\"\n (keyup)=\"onTokensKeyUp($event)\"\n (tokensChange)=\"onTokensChange($event)\"\n (tokenSelected)=\"enableShowMore ? openPicker(undefined) : undefined\"\n (focusIndexOverRange)=\"onTokensFocusIndexOverRange()\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n (keydown)=\"inputKeydown($event, $event.target.value)\"\n (keyup)=\"inputKeyup($event)\"\n ></textarea>\n </sky-tokens>\n <div\n *ngIf=\"selectMode === 'single'\"\n class=\"sky-lookup-single-control\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n ></textarea>\n </div>\n </div>\n <ng-container *ngIf=\"!inputBoxHostSvc && enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"showMoreButtonTemplateRef\"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!inputBoxHostSvc && !enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"searchIconTemplateRef\"\n ></ng-container>\n </ng-container>\n </div>\n </sky-autocomplete>\n </div>\n</ng-template>\n\n<ng-template #showMoreButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n class=\"sky-btn sky-btn-default\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'sky-btn-disabled': disabled }\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_lookup_search_button_show_more' | skyLibResources\n \"\n (click)=\"onSearchButtonClick()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"search\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n iconType=\"skyux\"\n icon=\"search\"\n ></sky-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #searchIconTemplateRef>\n <div\n class=\"sky-input-group-icon sky-input-box-icon-inset\"\n [ngClass]=\"{ 'sky-lookup-disabled': disabled }\"\n >\n <sky-icon\n *skyThemeIf=\"'default'\"\n icon=\"search\"\n [attr.aria-label]=\"'skyux_lookup_search_icon' | skyLibResources\"\n ></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n iconType=\"skyux\"\n icon=\"search\"\n [attr.aria-label]=\"'skyux_lookup_search_icon' | skyLibResources\"\n ></sky-icon>\n </div>\n</ng-template>\n", styles: [".sky-lookup .sky-lookup-input.sky-form-control{resize:none;border:0;box-sizing:content-box;height:1.428571429em;overflow:hidden;padding:0;background-color:transparent}.sky-lookup .sky-lookup-input.sky-form-control:focus{outline:none;box-shadow:none}.sky-lookup .sky-lookup-search-flex-wrapper{display:flex}.sky-lookup.sky-lookup-disabled .sky-lookup-search{background-color:#cdcfd2}.sky-lookup sky-tokens.sky-lookup-tokens:focus{outline:none}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-5px;margin-bottom:-5px}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-top:5px;padding-bottom:5px;padding-left:10px;flex-basis:100px}.sky-lookup .sky-lookup-single-control{display:inline-flex;padding-left:7px;width:100%}.sky-lookup-search{cursor:text;background-color:#fff;line-height:1.428571429em;padding:6px 12px 6px 3px;flex-grow:1}.sky-lookup-search:not(.sky-field-status-active){border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2}.sky-lookup-disabled .sky-lookup-search{cursor:default}.sky-lookup-focused .sky-tokens-content{flex-basis:100px}.sky-lookup-single sky-tokens.sky-lookup-tokens sky-token{display:none}sky-lookup.ng-invalid.ng-touched .sky-lookup-search{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044;outline:none}sky-input-box .sky-lookup{width:100%}sky-input-box .sky-lookup .sky-lookup-search{border:none;padding-bottom:5px;width:100%}:host-context(.sky-theme-modern) sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}.sky-theme-modern sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}.sky-theme-modern sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}\n"], components: [{ type: i8.SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: ["ariaLabelledBy", "data", "debounceTime", "descriptorProperty", "enableShowMore", "messageStream", "wrapperClass", "propertiesToSearch", "search", "searchResultTemplate", "searchTextMinimumCharacters", "searchFilters", "searchResultsLimit", "showAddButton", "noResultsFoundText"], outputs: ["addClick", "showMoreClick", "selectionChange"] }, { type: i9.λ13, selector: "sky-tokens", inputs: ["disabled", "dismissible", "displayWith", "trackWith", "focusable", "tokens", "messageStream"], outputs: ["focusIndexOverRange", "focusIndexUnderRange", "tokenSelected", "tokensChange"] }, { type: i9.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.SkyAutocompleteInputDirective, selector: "input[skyAutocomplete], textarea[skyAutocomplete]", inputs: ["autocompleteAttribute", "disabled"] }, { type: i7.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }], pipes: { "skyLibResources": i5.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
497
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyLookupComponent, decorators: [{
498
- type: Component,
499
- args: [{
500
- selector: 'sky-lookup',
501
- templateUrl: './lookup.component.html',
502
- styleUrls: ['./lookup.component.scss'],
503
- providers: [SkyLookupAdapterService],
504
- encapsulation: ViewEncapsulation.None,
505
- changeDetection: ChangeDetectionStrategy.OnPush,
506
- }]
507
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAppWindowRef }, { type: i2.NgControl, decorators: [{
508
- type: Self
509
- }, {
510
- type: Optional
511
- }] }, { type: i3.SkyLookupAdapterService }, { type: i4.SkyModalService }, { type: i5.SkyLibResourcesService }, { type: i6.SkyInputBoxHostService, decorators: [{
512
- type: Optional
513
- }] }, { type: i7.SkyThemeService, decorators: [{
514
- type: Optional
515
- }] }]; }, propDecorators: { ariaLabel: [{
516
- type: Input
517
- }], ariaLabelledBy: [{
518
- type: Input
519
- }], autocompleteAttribute: [{
520
- type: Input
521
- }], data: [{
522
- type: Input
523
- }], disabled: [{
524
- type: Input
525
- }], enableShowMore: [{
526
- type: Input
527
- }], placeholderText: [{
528
- type: Input
529
- }], idProperty: [{
530
- type: Input
531
- }], showAddButton: [{
532
- type: Input
533
- }], showMoreConfig: [{
534
- type: Input
535
- }], selectMode: [{
536
- type: Input
537
- }], wrapperClass: [{
538
- type: Input
539
- }], addClick: [{
540
- type: Output
541
- }], autocompleteInputDirective: [{
542
- type: ViewChild,
543
- args: [SkyAutocompleteInputDirective, {
544
- read: SkyAutocompleteInputDirective,
545
- static: false,
546
- }]
547
- }], showMoreButtonTemplateRef: [{
548
- type: ViewChild,
549
- args: ['showMoreButtonTemplateRef', {
550
- read: TemplateRef,
551
- static: true,
552
- }]
553
- }], inputTemplateRef: [{
554
- type: ViewChild,
555
- args: ['inputTemplateRef', {
556
- read: TemplateRef,
557
- static: true,
558
- }]
559
- }], lookupWrapperRef: [{
560
- type: ViewChild,
561
- args: ['lookupWrapper', {
562
- read: ElementRef,
563
- }]
564
- }], searchIconTemplateRef: [{
565
- type: ViewChild,
566
- args: ['searchIconTemplateRef', {
567
- read: TemplateRef,
568
- static: true,
569
- }]
570
- }] } });
571
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xvb2t1cC9zcmMvbW9kdWxlcy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xvb2t1cC9zcmMvbW9kdWxlcy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRakQsT0FBTyxFQUdMLG9CQUFvQixHQUNyQixNQUFNLG1CQUFtQixDQUFDO0FBUTNCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBTTdGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRTdGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRW5FLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBVXJGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBVXRHLE1BQU0sT0FBTyxrQkFDWCxTQUFRLDRCQUE0QjtJQW9OcEMsWUFDVSxjQUFpQyxFQUNqQyxVQUFzQixFQUN0QixT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O3NCQUh2QixTQUFTO3VCQUFDLGVBQWUsRUFBRTt3QkFDMUIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2dCQU9PLHFCQUFxQjtzQkFKNUIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRTt3QkFDbEMsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE1BQU0sRUFBRSxJQUFJO3FCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5QXBwV2luZG93UmVmIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQgeyBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2Zvcm1zJztcblxuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHtcbiAgU2t5VG9rZW4sXG4gIFNreVRva2Vuc01lc3NhZ2UsXG4gIFNreVRva2Vuc01lc3NhZ2VUeXBlLFxufSBmcm9tICdAc2t5dXgvaW5kaWNhdG9ycyc7XG5cbmltcG9ydCB7IFNreU1vZGFsSW5zdGFuY2UsIFNreU1vZGFsU2VydmljZSB9IGZyb20gJ0Bza3l1eC9tb2RhbHMnO1xuXG5pbXBvcnQgeyBTa3lUaGVtZVNlcnZpY2UgfSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlIH0gZnJvbSAnLi4vYXV0b2NvbXBsZXRlL3R5cGVzL2F1dG9jb21wbGV0ZS1tZXNzYWdlJztcblxuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZVR5cGUgfSBmcm9tICcuLi9hdXRvY29tcGxldGUvdHlwZXMvYXV0b2NvbXBsZXRlLW1lc3NhZ2UtdHlwZSc7XG5cbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZSB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtc2VsZWN0aW9uLWNoYW5nZSc7XG5cbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNob3dNb3JlQXJncyB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtc2hvdy1tb3JlLWFyZ3MnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUtaW5wdXQuZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgU2t5TG9va3VwQXV0b2NvbXBsZXRlQWRhcHRlciB9IGZyb20gJy4vbG9va3VwLWF1dG9jb21wbGV0ZS1hZGFwdGVyJztcblxuaW1wb3J0IHsgU2t5TG9va3VwQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2xvb2t1cC1hZGFwdGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTa3lMb29rdXBTaG93TW9yZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9sb29rdXAtc2hvdy1tb3JlLW1vZGFsLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNreUxvb2t1cEFkZENhbGxiYWNrQXJncyB9IGZyb20gJy4vdHlwZXMvbG9va3VwLWFkZC1jbGljay1jYWxsYmFjay1hcmdzJztcblxuaW1wb3J0IHsgU2t5TG9va3VwQWRkQ2xpY2tFdmVudEFyZ3MgfSBmcm9tICcuL3R5cGVzL2xvb2t1cC1hZGQtY2xpY2stZXZlbnQtYXJncyc7XG5cbmltcG9ydCB7IFNreUxvb2t1cFNlbGVjdE1vZGVUeXBlIH0gZnJvbSAnLi90eXBlcy9sb29rdXAtc2VsZWN0LW1vZGUtdHlwZSc7XG5cbmltcG9ydCB7IFNreUxvb2t1cFNob3dNb3JlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9sb29rdXAtc2hvdy1tb3JlLWNvbmZpZyc7XG5cbmltcG9ydCB7IFNreUxvb2t1cFNob3dNb3JlTmF0aXZlUGlja2VyQ29udGV4dCB9IGZyb20gJy4vdHlwZXMvbG9va3VwLXNob3ctbW9yZS1uYXRpdmUtcGlja2VyLWNvbnRleHQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktbG9va3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb2t1cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvb2t1cC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtTa3lMb29rdXBBZGFwdGVyU2VydmljZV0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lMb29rdXBDb21wb25lbnRcbiAgZXh0ZW5kcyBTa3lMb29rdXBBdXRvY29tcGxldGVBZGFwdGVyXG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gQVJJQSBsYWJlbCBmb3IgdGhlIHR5cGVhaGVhZCBzZWFyY2ggaW5wdXRcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIGlucHV0IGluY2x1ZGVzIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxsZWRCeWAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgdHlwZWFoZWFkIHNlYXJjaCBpbnB1dC4gVGhpcyBzZXRzIHRoZSBpbnB1dCdzIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgaW5wdXQgZG9lcyBub3QgaW5jbHVkZSBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbGxlZEJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZm9yIHRoZSBgYXV0b2NvbXBsZXRlYCBhdHRyaWJ1dGUgb24gdGhlIGZvcm0gaW5wdXQuXG4gICAqIEBkZWZhdWx0IFwib2ZmXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvY29tcGxldGVBdHRyaWJ1dGU6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgZGF0YSBzb3VyY2UgZm9yIHRoZSBsb29rdXAgY29tcG9uZW50IHRvIHNlYXJjaCB3aGVuIHVzZXJzXG4gICAqIGVudGVyIHRleHQuIFlvdSBjYW4gc3BlY2lmeSBzdGF0aWMgZGF0YSBzdWNoIGFzIGFuIGFycmF5IG9mIG9iamVjdHMsIG9yXG4gICAqIHlvdSBjYW4gcHVsbCBkYXRhIGZyb20gYSBkYXRhYmFzZS5cbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl9kYXRhID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5vcGVuTmF0aXZlUGlja2VyKSB7XG4gICAgICB0aGlzLm9wZW5OYXRpdmVQaWNrZXIuY29tcG9uZW50SW5zdGFuY2UudXBkYXRlSXRlbURhdGEodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgbG9va3VwIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSB1c2VycyB0byBvcGVuIGEgcGlja2VyIHdoZXJlIHRoZXkgY2FuIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlU2hvd01vcmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHBsYWNlaG9sZGVyIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbG9va3VwIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gb2JqZWN0IHByb3BlcnR5IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgdW5pcXVlIGlkZW50aWZpZXIuXG4gICAqIFNwZWNpZnlpbmcgdGhpcyBwcm9wZXJ0eSBlbmFibGVzIHRva2VuIGFuaW1hdGlvbnMgYW5kIG1vcmUgZWZmaWNpZW50IHJlbmRlcmluZy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpZFByb3BlcnR5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc3BsYXkgYSBidXR0b24gdGhhdCBsZXRzIHVzZXJzIGFkZCBvcHRpb25zIHRvIHRoZSBsaXN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHBpY2tlciB0aGF0IGRpc3BsYXlzIGFsbCBvcHRpb25zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dNb3JlQ29uZmlnOiBTa3lMb29rdXBTaG93TW9yZUNvbmZpZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdXNlcnMgY2FuIHNlbGVjdCBvbmUgb3B0aW9uIG9yIG11bHRpcGxlIG9wdGlvbnMuXG4gICAqIEBkZWZhdWx0IFwibXVsaXRwbGVcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RNb2RlKHZhbHVlOiBTa3lMb29rdXBTZWxlY3RNb2RlVHlwZSkge1xuICAgIGxldCBtdWx0aXBsZVRvU2luZ2xlOiBib29sZWFuID1cbiAgICAgIHZhbHVlID09PSAnc2luZ2xlJyAmJiB0aGlzLnNlbGVjdE1vZGUgPT09ICdtdWx0aXBsZSc7XG5cbiAgICB0aGlzLl9zZWxlY3RNb2RlID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVGb3JTZWxlY3RNb2RlKCk7XG5cbiAgICBpZiAobXVsdGlwbGVUb1NpbmdsZSkge1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFRoZSBgc2V0VGltZW91dGAgaXMgbmVlZGVkIHRvIGF2b2lkIGEgYEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JgIGVycm9yIGluIHRlbXBsYXRlIGZvcm1zLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoW3RoaXMudmFsdWVbMF1dKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RNb2RlKCk6IFNreUxvb2t1cFNlbGVjdE1vZGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSB8fCAnbXVsdGlwbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJDbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgdGhlIGJ1dHRvbiB0byBhZGQgb3B0aW9ucyB0byB0aGUgbGlzdC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYWRkQ2xpY2s6IEV2ZW50RW1pdHRlcjxTa3lMb29rdXBBZGRDbGlja0V2ZW50QXJncz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIGdldCB0b2tlbnMoKTogU2t5VG9rZW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VucztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdG9rZW5zKHZhbHVlOiBTa3lUb2tlbltdKSB7XG4gICAgLy8gQ29sbGFwc2UgdGhlIHRva2VucyBpbnRvIGEgc2luZ2xlIHRva2VuIGlmIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBtYW55IG9wdGlvbnMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU2hvd01vcmUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiA1KSB7XG4gICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2VcbiAgICAgICAgLmdldFN0cmluZygnc2t5dXhfbG9va3VwX3Rva2Vuc19zdW1tYXJ5JywgdGhpcy52YWx1ZS5sZW5ndGgudG9TdHJpbmcoKSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgobGFiZWwpID0+IHtcbiAgICAgICAgICB0aGlzLl90b2tlbnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiB7IFt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV06IGxhYmVsIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Rva2VucyA9IHZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPyB0aGlzLl92YWx1ZSA6IFtdO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLm9wZW5OYXRpdmVQaWNrZXIpIHtcbiAgICAgIHRoaXMudG9rZW5zID0gdGhpcy5wYXJzZVRva2VucyhuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvY29tcGxldGVDb250cm9sbGVyID0gbmV3IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4oKTtcbiAgcHVibGljIGlzSW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gIHB1YmxpYyB0b2tlbnNDb250cm9sbGVyID0gbmV3IFN1YmplY3Q8U2t5VG9rZW5zTWVzc2FnZT4oKTtcblxuICBAVmlld0NoaWxkKFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLCB7XG4gICAgcmVhZDogU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUsXG4gICAgc3RhdGljOiBmYWxzZSxcbiAgfSlcbiAgcHJpdmF0ZSBzZXQgYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUodmFsdWU6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKSB7XG4gICAgdGhpcy5fYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUZvclNlbGVjdE1vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKCk6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmU7XG4gIH1cblxuICBAVmlld0NoaWxkKCdzaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHJpdmF0ZSBzaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0VGVtcGxhdGVSZWYnLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgc3RhdGljOiB0cnVlLFxuICB9KVxuICBwcml2YXRlIGlucHV0VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgnbG9va3VwV3JhcHBlcicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwcml2YXRlIGxvb2t1cFdyYXBwZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoSWNvblRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHJpdmF0ZSBzZWFyY2hJY29uVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBpZGxlID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBtYXJrRm9yVG9rZW5Gb2N1c09uS2V5VXAgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuTmF0aXZlUGlja2VyOiBTa3lNb2RhbEluc3RhbmNlO1xuXG4gIHByaXZhdGUgX2F1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBfZGF0YTogYW55W107XG4gIHByaXZhdGUgX3NlbGVjdE1vZGU6IFNreUxvb2t1cFNlbGVjdE1vZGVUeXBlO1xuICBwcml2YXRlIF90b2tlbnM6IFNreVRva2VuW107XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnlbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFNreUFwcFdpbmRvd1JlZixcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgIHByaXZhdGUgYWRhcHRlcjogU2t5TG9va3VwQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IFNreU1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGlucHV0Qm94SG9zdFN2Yz86IFNreUlucHV0Qm94SG9zdFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHRoZW1lU3ZjPzogU2t5VGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0Qm94SG9zdFN2Yykge1xuICAgICAgdGhpcy5pbnB1dEJveEhvc3RTdmMucG9wdWxhdGUoe1xuICAgICAgICBpbnB1dFRlbXBsYXRlOiB0aGlzLmlucHV0VGVtcGxhdGVSZWYsXG4gICAgICAgIGJ1dHRvbnNUZW1wbGF0ZTogdGhpcy5lbmFibGVTaG93TW9yZVxuICAgICAgICAgID8gdGhpcy5zaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGljb25zSW5zZXRUZW1wbGF0ZTogdGhpcy5lbmFibGVTaG93TW9yZVxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnNlYXJjaEljb25UZW1wbGF0ZVJlZixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudGhlbWVTdmMpIHtcbiAgICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZGlyZWN0aXZlIHRvIGJlIHNldCBhZnRlciBlbGVtZW50c1xuICAgICAgLy8gYXJlIHJlYXJyYW5nZWQgd2hlbiBzd2l0Y2hpbmcgdGhlbWVzLlxuICAgICAgdGhpcy50aGVtZVN2Yy5zZXR0aW5nc0NoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy50b2tlbnNDb250cm9sbGVyLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENsaWNrLmVtaXQoe1xuICAgICAgaXRlbUFkZGVkOiAoYXJnczogU2t5TG9va3VwQWRkQ2FsbGJhY2tBcmdzKSA9PlxuICAgICAgICB0aGlzLm9uQWRkQnV0dG9uQ29tcGxldGUoYXJncyksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25BdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2UoXG4gICAgY2hhbmdlOiBTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2VcbiAgKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2hhbmdlLnNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5hZGRUb1NlbGVjdGVkKGNoYW5nZS5zZWxlY3RlZEl0ZW0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKFtdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25BdXRvY29tcGxldGVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBwdWJsaWMgb25Ub2tlbnNDaGFuZ2UoY2hhbmdlOiBTa3lUb2tlbltdKTogdm9pZCB7XG4gICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b2tlbnMgIT09IGNoYW5nZSkge1xuICAgICAgaWYgKGNoYW5nZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5PVEU6IFdlIGRvIHRoaXMgaGVyZSBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcgdGhlIGB2YWx1ZWAgc2V0dGVyIGJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgdGhlXG4gICAgICAvLyBzZXQgb2YgdG9rZW5zIHJldHVybmVkIGhlcmUgZm9yIHRoZSBwdXJwb3NlcyBvZiBzZXR0aW5nIGZvY3VzIChzZWUgYG9uVG9rZW5zS2V5VXBgKS5cbiAgICAgIHRoaXMuX3ZhbHVlID0gY2hhbmdlLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRva2VucyA9IGNoYW5nZTtcblxuICAgICAgdGhpcy5zZW5kQXV0b2NvbXBsZXRlTWVzc2FnZShcbiAgICAgICAgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZVR5cGUuUmVwb3NpdGlvbkRyb3Bkb3duXG4gICAgICApO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblRva2Vuc0ZvY3VzSW5kZXhPdmVyUmFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25Ub2tlbnNLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzd2l0Y2gtZGVmYXVsdCAqL1xuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgICAgICB0aGlzLnNlbmRUb2tlbnNNZXNzYWdlKFNreVRva2Vuc01lc3NhZ2VUeXBlLlJlbW92ZUFjdGl2ZVRva2VuKTtcbiAgICAgICAgICB0aGlzLnNlbmRUb2tlbnNNZXNzYWdlKFNreVRva2Vuc01lc3NhZ2VUeXBlLkZvY3VzUHJldmlvdXNUb2tlbik7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdEZWwnOlxuICAgICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICAgIHRoaXMuc2VuZFRva2Vuc01lc3NhZ2UoU2t5VG9rZW5zTWVzc2FnZVR5cGUuUmVtb3ZlQWN0aXZlVG9rZW4pO1xuICAgICAgICAgIHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFRva2Vuc01lc3NhZ2UoU2t5VG9rZW5zTWVzc2FnZVR5cGUuRm9jdXNBY3RpdmVUb2tlbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6IFtdO1xuICAgIHRoaXMudXBkYXRlRm9yU2VsZWN0TW9kZSgpO1xuICB9XG5cbiAgLy8gQW5ndWxhciBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdHMgdGhlc2UgbWV0aG9kcy5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcHVibGljIG9uQ2hhbmdlID0gKHZhbHVlOiBhbnlbXSkgPT4ge307XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLy8gQWxsb3dzIEFuZ3VsYXIgdG8gZGlzYWJsZSB0aGUgaW5wdXQuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VhcmNoVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUuaW5wdXRUZXh0VmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBIYW5kbGVzIHdoZW4gdG8gZm9jdXMgb24gdGhlIHRva2Vucy5cbiAgLy8gQ2hlY2sgZm9yIGVtcHR5IHNlYXJjaCB0ZXh0IG9uIGtleWRvd24sIGJlZm9yZSB0aGUgZXNjYXBlIGtleSBpcyBmdWxseSBwcmVzc2VkLlxuICAvLyAoT3RoZXJ3aXNlLCBhIHNpbmdsZSBjaGFyYWN0ZXIgYmVpbmcgZXNjYXBlZCB3b3VsZCByZWdpc3RlciBhcyBlbXB0eSBvbiBrZXl1cC4pXG4gIC8vIElmIGVtcHR5IG9uIGtleWRvd24sIHNldCBhIGZsYWcgc28gdGhhdCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIGNhbiBiZSB0YWtlbiBvbiBrZXl1cC5cbiAgcHVibGljIGlucHV0S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayBhcyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluIG11bHRpcGxlIHNlbGVjdCBtb2RlICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIGNhc2UgJ0xlZnQnOlxuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yVG9rZW5Gb2N1c09uS2V5VXAgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yVG9rZW5Gb2N1c09uS2V5VXAgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5wdXRLZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayBhcyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluIG11bHRpcGxlIHNlbGVjdCBtb2RlICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnRXNjJzpcbiAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoVGV4dCgpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIGNhc2UgJ0xlZnQnOlxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKHRoaXMubWFya0ZvclRva2VuRm9jdXNPbktleVVwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRUb2tlbnNNZXNzYWdlKFNreVRva2Vuc01lc3NhZ2VUeXBlLkZvY3VzTGFzdFRva2VuKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZWFyY2hCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBuZXh0Ki9cbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbmRBdXRvY29tcGxldGVNZXNzYWdlKFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlLkNsb3NlRHJvcGRvd24pO1xuICAgIGxldCBpc1ZhbHVlSW5UZXh0Qm94ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIGlzVmFsdWVJblRleHRCb3ggPVxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLmlucHV0VGV4dFZhbHVlID09PVxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLnZhbHVlW3RoaXMuZGVzY3JpcHRvclByb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5QaWNrZXIoXG4gICAgICBpc1ZhbHVlSW5UZXh0Qm94ID8gJycgOiB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLmlucHV0VGV4dFZhbHVlXG4gICAgKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLnJlc3RvcmVJbnB1dFRleHRWYWx1ZVRvUHJldmlvdXNTdGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uU2hvd01vcmVDbGljayhldmVudDogU2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzKTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UqL1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5vcGVuUGlja2VyKGV2ZW50LmlucHV0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvcGVuUGlja2VyKGluaXRpYWxTZWFyY2g6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dNb3JlQ29uZmlnPy5jdXN0b21QaWNrZXIpIHtcbiAgICAgIHRoaXMuc2hvd01vcmVDb25maWcuY3VzdG9tUGlja2VyLm9wZW4oe1xuICAgICAgICBpdGVtczogdGhpcy5kYXRhLFxuICAgICAgICBpbml0aWFsU2VhcmNoOiBpbml0aWFsU2VhcmNoLFxuICAgICAgICBpbml0aWFsVmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBjb25zdCBtb2RhbENvbmZpZyA9IHRoaXMuc2hvd01vcmVDb25maWc/Lm5hdGl2ZVBpY2tlckNvbmZpZyB8fCB7fTtcbiAgICAgIGlmICghbW9kYWxDb25maWcuaXRlbVRlbXBsYXRlKSB7XG4gICAgICAgIG1vZGFsQ29uZmlnLml0ZW1UZW1wbGF0ZSA9IHRoaXMuc2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb250ZXh0OiBTa3lMb29rdXBTaG93TW9yZU5hdGl2ZVBpY2tlckNvbnRleHQgPSB7XG4gICAgICAgIGl0ZW1zOiB0aGlzLmRhdGEsXG4gICAgICAgIGRlc2NyaXB0b3JQcm9wZXJ0eTogdGhpcy5kZXNjcmlwdG9yUHJvcGVydHksXG4gICAgICAgIGluaXRpYWxTZWFyY2g6IGluaXRpYWxTZWFyY2gsXG4gICAgICAgIGluaXRpYWxWYWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoLFxuICAgICAgICBzZWxlY3RNb2RlOiB0aGlzLnNlbGVjdE1vZGUsXG4gICAgICAgIHNob3dBZGRCdXR0b246IHRoaXMuc2hvd0FkZEJ1dHRvbixcbiAgICAgICAgdXNlckNvbmZpZzogbW9kYWxDb25maWcsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9wZW5OYXRpdmVQaWNrZXIgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFxuICAgICAgICBTa3lMb29rdXBTaG93TW9yZU1vZGFsQ29tcG9uZW50LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByb3ZpZGU6IFNreUxvb2t1cFNob3dNb3JlTmF0aXZlUGlja2VyQ29udGV4dCxcbiAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbnRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuTmF0aXZlUGlja2VyLmNvbXBvbmVudEluc3RhbmNlLmFkZENsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkQnV0dG9uQ2xpY2tlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub3Blbk5hdGl2ZVBpY2tlci5jbG9zZWQuc3Vic2NyaWJlKChjbG9zZUFyZ3MpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuTmF0aXZlUGlja2VyID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2xvc2VBcmdzLnJlYXNvbiA9PT0gJ3NhdmUnKSB7XG4gICAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaCgoaXRlbTogYW55LCBkYXRhSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjbG9zZUFyZ3MuZGF0YS5zb21lKChzYXZlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZEl0ZW0uaW5kZXggPT09IGRhdGFJbmRleDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy53cml0ZVZhbHVlKGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9TZWxlY3RlZChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgc2VsZWN0ZWRJdGVtczogYW55W107XG5cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgc2VsZWN0ZWRJdGVtcyA9IFtpdGVtXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRJdGVtcyA9IHRoaXMudmFsdWU7XG5cbiAgICAgIC8vIElmIGl0ZW1zIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciwgZG9uJ3QgYWxsb3cgdGhlIHNhbWUgaXRlbSB0byBiZSBhZGRlZCB0d2ljZS5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuaWRQcm9wZXJ0eSB8fFxuICAgICAgICAhdGhpcy52YWx1ZS5zb21lKFxuICAgICAgICAgIChleGlzdGluZ0l0ZW0pID0+XG4gICAgICAgICAgICBleGlzdGluZ0l0ZW1bdGhpcy5pZFByb3BlcnR5XSA9PT0gaXRlbVt0aGlzLmlkUHJvcGVydHldXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZVZhbHVlKHNlbGVjdGVkSXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLmlkbGUgPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuZm9jdXNJbnB1dE9uSG9zdENsaWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuaWRsZS5uZXh0KCk7XG4gICAgdGhpcy5pZGxlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSW5wdXRPbkhvc3RDbGljaygpOiB2b2lkIHtcbiAgICBsZXQgaG9zdEVsZW1lbnQgPSAhdGhpcy5pbnB1dEJveEhvc3RTdmNcbiAgICAgID8gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgIDogdGhpcy5sb29rdXBXcmFwcGVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZG9jdW1lbnRPYmogPSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQ7XG5cbiAgICAvLyBIYW5kbGVzIGZvY3VzaW5nIHRoZSBpbnB1dCB3aGVuIHRoZSBob3N0IGlzIGNsaWNrZWQuXG4gICAgLy8gVGhlIGlucHV0IHNob3VsZCBOT1QgYmUgZm9jdXNlZCBpZiBvdGhlciBlbGVtZW50cyAodG9rZW5zLCBldGMuKVxuICAgIC8vIGFyZSBjdXJyZW50bHkgZm9jdXNlZCBvciBiZWluZyB0YWJiZWQgdGhyb3VnaC5cblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQoZG9jdW1lbnRPYmosICdtb3VzZWRvd24nKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuaWRsZSkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBob3N0RWxlbWVudCA9ICF0aGlzLmlucHV0Qm94SG9zdFN2Y1xuICAgICAgICAgID8gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICA6IHRoaXMubG9va3VwV3JhcHBlclJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmlzSW5wdXRGb2N1c2VkID0gaG9zdEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGRvY3VtZW50T2JqLCAnZm9jdXNpbicpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5pZGxlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGhvc3RFbGVtZW50ID0gIXRoaXMuaW5wdXRCb3hIb3N0U3ZjXG4gICAgICAgICAgPyB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgIDogdGhpcy5sb29rdXBXcmFwcGVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNJbnB1dEZvY3VzZWQgPSBob3N0RWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQoaG9zdEVsZW1lbnQsICdtb3VzZXVwJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmlkbGUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IGRvY3VtZW50T2JqLmFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICBpZiAoIWNsYXNzTGlzdCB8fCAhY2xhc3NMaXN0LmNvbnRhaW5zKCdza3ktdG9rZW4nKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXIuZm9jdXNJbnB1dCh0aGlzLmxvb2t1cFdyYXBwZXJSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkFkZEJ1dHRvbkNvbXBsZXRlKGFyZ3M6IFNreUxvb2t1cEFkZENhbGxiYWNrQXJncykge1xuICAgIGlmIChhcmdzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGFyZ3MuZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhLmluZGV4T2YoYXJncy5pdGVtKSA+PSAwKSB7XG4gICAgICBpZiAodGhpcy5vcGVuTmF0aXZlUGlja2VyKSB7XG4gICAgICAgICg8U2t5TG9va3VwU2hvd01vcmVNb2RhbENvbXBvbmVudD4oXG4gICAgICAgICAgdGhpcy5vcGVuTmF0aXZlUGlja2VyLmNvbXBvbmVudEluc3RhbmNlXG4gICAgICAgICkpLm9uSXRlbVNlbGVjdCh0cnVlLCB7IHZhbHVlOiBhcmdzLml0ZW0sIHNlbGVjdGVkOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWUuY29uY2F0KGFyZ3MuaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBbYXJncy5pdGVtXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXRlVmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUb2tlbnMoZGF0YTogYW55W10pOiBTa3lUb2tlbltdIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kQXV0b2NvbXBsZXRlTWVzc2FnZSh0eXBlOiBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29udHJvbGxlci5uZXh0KHsgdHlwZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRva2Vuc01lc3NhZ2UodHlwZTogU2t5VG9rZW5zTWVzc2FnZVR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vuc0NvbnRyb2xsZXIubmV4dCh7IHR5cGUgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZvclNlbGVjdE1vZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUudmFsdWUgPSB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWVbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoVGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbnB1dEJveEhvc3RTdmNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2lucHV0VGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNreS1sb29rdXBcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdza3ktbG9va3VwLWZvY3VzZWQnOiBpc0lucHV0Rm9jdXNlZCxcbiAgICAgICdza3ktbG9va3VwLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAnc2t5LWxvb2t1cC1zaW5nbGUnOiBzZWxlY3RNb2RlID09PSAnc2luZ2xlJ1xuICAgIH1cIlxuICAgICNsb29rdXBXcmFwcGVyXG4gID5cbiAgICA8c2t5LWF1dG9jb21wbGV0ZVxuICAgICAgW2FyaWFMYWJlbGxlZEJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW2RlYm91bmNlVGltZV09XCJkZWJvdW5jZVRpbWVcIlxuICAgICAgW2Rlc2NyaXB0b3JQcm9wZXJ0eV09XCJkZXNjcmlwdG9yUHJvcGVydHlcIlxuICAgICAgW2VuYWJsZVNob3dNb3JlXT1cImVuYWJsZVNob3dNb3JlXCJcbiAgICAgIFttZXNzYWdlU3RyZWFtXT1cImF1dG9jb21wbGV0ZUNvbnRyb2xsZXJcIlxuICAgICAgW3Byb3BlcnRpZXNUb1NlYXJjaF09XCJwcm9wZXJ0aWVzVG9TZWFyY2hcIlxuICAgICAgW3NlYXJjaF09XCJzZWFyY2hcIlxuICAgICAgW3NlYXJjaEZpbHRlcnNdPVwic2VhcmNoRmlsdGVyc1wiXG4gICAgICBbc2VhcmNoUmVzdWx0c0xpbWl0XT1cInNlYXJjaFJlc3VsdHNMaW1pdFwiXG4gICAgICBbc2VhcmNoUmVzdWx0VGVtcGxhdGVdPVwic2VhcmNoUmVzdWx0VGVtcGxhdGVcIlxuICAgICAgW3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVyc109XCJzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnNcIlxuICAgICAgW3Nob3dBZGRCdXR0b25dPVwic2hvd0FkZEJ1dHRvblwiXG4gICAgICBbd3JhcHBlckNsYXNzXT1cIndyYXBwZXJDbGFzc1wiXG4gICAgICAoYWRkQ2xpY2spPVwiYWRkQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25BdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoc2hvd01vcmVDbGljayk9XCJvblNob3dNb3JlQ2xpY2soJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInNreS1sb29rdXAtc2VhcmNoLWZsZXgtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJza3ktbG9va3VwLXNlYXJjaFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3NreS1maWVsZC1zdGF0dXMtYWN0aXZlJzogaXNJbnB1dEZvY3VzZWQgJiYgIWRpc2FibGVkXG4gICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c2t5LXRva2Vuc1xuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RNb2RlID09PSAnbXVsdGlwbGUnXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWxvb2t1cC10b2tlbnNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJkZXNjcmlwdG9yUHJvcGVydHlcIlxuICAgICAgICAgICAgW2ZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbbWVzc2FnZVN0cmVhbV09XCJ0b2tlbnNDb250cm9sbGVyXCJcbiAgICAgICAgICAgIFt0cmFja1dpdGhdPVwiaWRQcm9wZXJ0eVwiXG4gICAgICAgICAgICBbdG9rZW5zXT1cInRva2Vuc1wiXG4gICAgICAgICAgICAoa2V5dXApPVwib25Ub2tlbnNLZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICh0b2tlbnNDaGFuZ2UpPVwib25Ub2tlbnNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAodG9rZW5TZWxlY3RlZCk9XCJlbmFibGVTaG93TW9yZSA/IG9wZW5QaWNrZXIodW5kZWZpbmVkKSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAoZm9jdXNJbmRleE92ZXJSYW5nZSk9XCJvblRva2Vuc0ZvY3VzSW5kZXhPdmVyUmFuZ2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWZvcm0tY29udHJvbCBza3ktbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgcm93cz1cIjFcIlxuICAgICAgICAgICAgICBza3lBdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgd3JhcD1cIm9mZlwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgICAgICAgW2F1dG9jb21wbGV0ZUF0dHJpYnV0ZV09XCJhdXRvY29tcGxldGVBdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkF1dG9jb21wbGV0ZUJsdXIoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5ZG93bigkZXZlbnQsICRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cImlucHV0S2V5dXAoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L3NreS10b2tlbnM+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RNb2RlID09PSAnc2luZ2xlJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1sb29rdXAtc2luZ2xlLWNvbnRyb2xcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBjbGFzcz1cInNreS1mb3JtLWNvbnRyb2wgc2t5LWxvb2t1cC1pbnB1dFwiXG4gICAgICAgICAgICAgIHJvd3M9XCIxXCJcbiAgICAgICAgICAgICAgc2t5QXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgIHdyYXA9XCJvZmZcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyVGV4dFwiXG4gICAgICAgICAgICAgIFthdXRvY29tcGxldGVBdHRyaWJ1dGVdPVwiYXV0b2NvbXBsZXRlQXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25BdXRvY29tcGxldGVCbHVyKClcIlxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlucHV0Qm94SG9zdFN2YyAmJiBlbmFibGVTaG93TW9yZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd01vcmVCdXR0b25UZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbnB1dEJveEhvc3RTdmMgJiYgIWVuYWJsZVNob3dNb3JlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWFyY2hJY29uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NreS1hdXRvY29tcGxldGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmPlxuICA8ZGl2IGNsYXNzPVwic2t5LWlucHV0LWdyb3VwLWJ0blwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHRcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ3NreS1idG4tZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgJ3NreXV4X2xvb2t1cF9zZWFyY2hfYnV0dG9uX3Nob3dfbW9yZScgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgIFwiXG4gICAgICAoY2xpY2spPVwib25TZWFyY2hCdXR0b25DbGljaygpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwic2VhcmNoXCI+PC9za3ktaWNvbj5cbiAgICAgIDxza3ktaWNvblxuICAgICAgICAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCJcbiAgICAgICAgaWNvblR5cGU9XCJza3l1eFwiXG4gICAgICAgIGljb249XCJzZWFyY2hcIlxuICAgICAgPjwvc2t5LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWFyY2hJY29uVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNreS1pbnB1dC1ncm91cC1pY29uIHNreS1pbnB1dC1ib3gtaWNvbi1pbnNldFwiXG4gICAgW25nQ2xhc3NdPVwieyAnc2t5LWxvb2t1cC1kaXNhYmxlZCc6IGRpc2FibGVkIH1cIlxuICA+XG4gICAgPHNreS1pY29uXG4gICAgICAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiXG4gICAgICBpY29uPVwic2VhcmNoXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X2xvb2t1cF9zZWFyY2hfaWNvbicgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgID48L3NreS1pY29uPlxuICAgIDxza3ktaWNvblxuICAgICAgKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiXG4gICAgICBpY29uVHlwZT1cInNreXV4XCJcbiAgICAgIGljb249XCJzZWFyY2hcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2t5dXhfbG9va3VwX3NlYXJjaF9pY29uJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgPjwvc2t5LWljb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==