@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,684 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Input, Optional, Output, TemplateRef, ViewChild, } from '@angular/core';
2
- import { SkyAffixAutoFitContext, } from '@skyux/core';
3
- import { fromEvent as observableFromEvent, Subject } from 'rxjs';
4
- import { debounceTime, takeUntil } from 'rxjs/operators';
5
- import { SkyAutocompleteMessageType } from './types/autocomplete-message-type';
6
- import { SkyAutocompleteAdapterService } from './autocomplete-adapter.service';
7
- import { skyAutocompleteDefaultSearchFunction } from './autocomplete-default-search-function';
8
- import { SkyAutocompleteInputDirective } from './autocomplete-input.directive';
9
- import { normalizeDiacritics } from '../shared/sky-lookup-string-utils';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@skyux/core";
12
- import * as i2 from "./autocomplete-adapter.service";
13
- import * as i3 from "@skyux/forms";
14
- import * as i4 from "@skyux/indicators";
15
- import * as i5 from "@skyux/theme";
16
- import * as i6 from "@angular/common";
17
- import * as i7 from "@skyux/i18n";
18
- let uniqueId = 0;
19
- export class SkyAutocompleteComponent {
20
- constructor(changeDetector, elementRef, affixService, adapterService, overlayService, inputBoxHostSvc) {
21
- this.changeDetector = changeDetector;
22
- this.elementRef = elementRef;
23
- this.affixService = affixService;
24
- this.adapterService = adapterService;
25
- this.overlayService = overlayService;
26
- this.inputBoxHostSvc = inputBoxHostSvc;
27
- /**
28
- * @internal
29
- * Indicates whether to display a button in the dropdown that opens a picker where users can view all options.
30
- */
31
- this.enableShowMore = false;
32
- /**
33
- * @internal
34
- * Indicates whether to display a button that lets users add options to the data source.
35
- */
36
- this.showAddButton = false;
37
- /**
38
- * @internal
39
- * Fires when users select the button to add options to the data source.
40
- */
41
- this.addClick = new EventEmitter();
42
- /**
43
- * @internal
44
- * Fires when users select the button to view all options.
45
- */
46
- this.showMoreClick = new EventEmitter();
47
- this.isOpen = false;
48
- /**
49
- * Index that indicates which descendant of the overlay currently has focus.
50
- */
51
- this.activeElementIndex = -1;
52
- this.inputDirectiveUnsubscribe = new Subject();
53
- this.ngUnsubscribe = new Subject();
54
- /**
55
- * Elements within the autocomplete dropdown that are focusable.
56
- * These are typically the search results and action buttons, but could also be
57
- * elements provided in the consumer's own template.
58
- */
59
- this.overlayFocusableElements = [];
60
- this._selectionChange = new EventEmitter();
61
- const id = ++uniqueId;
62
- this.resultsListId = `sky-autocomplete-list-${id}`;
63
- this.resultsWrapperId = `sky-autocomplete-wrapper-${id}`;
64
- }
65
- /**
66
- * Specifies a static data source for the autocomplete component to search
67
- * when users enter text. For a dynamic data source such as an array that
68
- * changes due to server calls, use the `search` property instead.
69
- */
70
- set data(value) {
71
- this._data = value;
72
- }
73
- get data() {
74
- return this._data || [];
75
- }
76
- /**
77
- * Specifies how many milliseconds to wait before searching while users
78
- * enter text in the autocomplete field.
79
- * @default 0
80
- */
81
- set debounceTime(value) {
82
- this._debounceTime = value;
83
- }
84
- get debounceTime() {
85
- return this._debounceTime || 0;
86
- }
87
- /**
88
- * Specifies an object property to display in the text input after users
89
- * select an item in the dropdown list.
90
- * @default name
91
- */
92
- set descriptorProperty(value) {
93
- this._descriptorProperty = value;
94
- }
95
- get descriptorProperty() {
96
- return this._descriptorProperty || 'name';
97
- }
98
- /**
99
- * Specifies an observable of `SkyAutocompleteMessage` that can close the dropdown.
100
- * @internal
101
- */
102
- set messageStream(value) {
103
- this._messageStream = value;
104
- this.initMessageStream();
105
- }
106
- get messageStream() {
107
- return this._messageStream;
108
- }
109
- /**
110
- * Specifies the object properties to search.
111
- * @default ['name']
112
- */
113
- set propertiesToSearch(value) {
114
- this._propertiesToSearch = value;
115
- }
116
- get propertiesToSearch() {
117
- return this._propertiesToSearch || ['name'];
118
- }
119
- /**
120
- * Specifies a function to dynamically manage the data source when users
121
- * change the text in the autocomplete field. The search function must return
122
- * an array or a promise of an array. The `search` property is particularly
123
- * useful when the data source does not live in the source code.
124
- */
125
- set search(value) {
126
- this._search = value;
127
- }
128
- get search() {
129
- return (this._search ||
130
- skyAutocompleteDefaultSearchFunction({
131
- propertiesToSearch: this.propertiesToSearch,
132
- searchFilters: this.searchFilters,
133
- }));
134
- }
135
- /**
136
- * Specifies a template to format each search result in the dropdown list.
137
- * The autocomplete component injects search result values into the template
138
- * as `item` variables that reference all of the object properties of the search results.
139
- */
140
- set searchResultTemplate(value) {
141
- this._searchResultTemplate = value;
142
- }
143
- get searchResultTemplate() {
144
- return this._searchResultTemplate || this.defaultSearchResultTemplate;
145
- }
146
- /**
147
- * Specifies the minimum number of characters that users must enter before
148
- * the autocomplete component searches the data source and displays search
149
- * results in the dropdown list.
150
- * @default 1
151
- */
152
- set searchTextMinimumCharacters(value) {
153
- this._searchTextMinimumCharacters = value;
154
- }
155
- get searchTextMinimumCharacters() {
156
- return this._searchTextMinimumCharacters > 0
157
- ? this._searchTextMinimumCharacters
158
- : 1;
159
- }
160
- /**
161
- * Specifies the maximum number of search results to display in the dropdown list.
162
- * By default, the component displays all matching results.
163
- */
164
- set searchResultsLimit(value) {
165
- this._searchResultsLimit = value;
166
- }
167
- get searchResultsLimit() {
168
- if (this._searchResultsLimit) {
169
- return this._searchResultsLimit;
170
- }
171
- else {
172
- return this.enableShowMore ? 5 : this._searchResultsLimit;
173
- }
174
- }
175
- /**
176
- * Fires when users select items in the dropdown list.
177
- */
178
- get selectionChange() {
179
- return this._selectionChange;
180
- }
181
- //#endregion
182
- //#region template_properties
183
- get searchResults() {
184
- return this._searchResults || [];
185
- }
186
- set highlightText(value) {
187
- this._highlightText = value;
188
- }
189
- get highlightText() {
190
- return this._highlightText || [];
191
- }
192
- get showActionsArea() {
193
- return this.showAddButton || this.enableShowMore;
194
- }
195
- set inputDirective(directive) {
196
- if (this._inputDirective !== directive) {
197
- if (!directive) {
198
- throw Error([
199
- 'The SkyAutocompleteComponent requires a ContentChild input or',
200
- 'textarea bound with the SkyAutocomplete directive. For example:',
201
- '`<input type="text" skyAutocomplete>`.',
202
- ].join(' '));
203
- }
204
- // Unsubscribe from old subscriptions on any previous input directive
205
- this.inputDirectiveUnsubscribe.next();
206
- this._inputDirective = directive;
207
- this._inputDirective.displayWith = this.descriptorProperty;
208
- this._inputDirective.textChanges
209
- .pipe(takeUntil(this.inputDirectiveUnsubscribe), debounceTime(this.debounceTime))
210
- .subscribe((change) => {
211
- this.searchTextChanged(change.value);
212
- });
213
- this._inputDirective.blur
214
- .pipe(takeUntil(this.inputDirectiveUnsubscribe))
215
- .subscribe(() => {
216
- this.inputDirective.onTouched();
217
- });
218
- this._inputDirective.focus
219
- .pipe(takeUntil(this.inputDirectiveUnsubscribe))
220
- .subscribe(() => {
221
- if (this.showActionsArea) {
222
- this.openDropdown();
223
- }
224
- });
225
- }
226
- }
227
- get inputDirective() {
228
- return this._inputDirective;
229
- }
230
- set resultsRef(value) {
231
- if (value) {
232
- this._resultsRef = value;
233
- this.destroyAffixer();
234
- this.createAffixer();
235
- }
236
- }
237
- get resultsRef() {
238
- return this._resultsRef;
239
- }
240
- ngAfterContentInit() {
241
- if (!this.inputDirective) {
242
- throw Error([
243
- 'The SkyAutocompleteComponent requires a ContentChild input or',
244
- 'textarea bound with the SkyAutocomplete directive. For example:',
245
- '`<input type="text" skyAutocomplete>`.',
246
- ].join(' '));
247
- }
248
- }
249
- ngAfterViewInit() {
250
- this.addInputEventListeners();
251
- }
252
- ngOnDestroy() {
253
- this.inputDirectiveUnsubscribe.next();
254
- this.inputDirectiveUnsubscribe.complete();
255
- this.ngUnsubscribe.next();
256
- this.ngUnsubscribe.complete();
257
- this.destroyAffixer();
258
- this.destroyOverlay();
259
- }
260
- addButtonClicked() {
261
- this.addClick.emit();
262
- this.inputDirective.restoreInputTextValueToPreviousState();
263
- this.closeDropdown();
264
- }
265
- handleKeydown(event) {
266
- /* Sanity check */
267
- /* istanbul ignore else */
268
- if (event.key) {
269
- const key = event.key.toLowerCase();
270
- const activeElement = this.getActiveElement();
271
- const activeElementId = activeElement === null || activeElement === void 0 ? void 0 : activeElement.id;
272
- const targetIsSearchResult = this.searchResults.find((r) => r.elementId === activeElementId);
273
- /* tslint:disable-next-line:switch-default */
274
- switch (key) {
275
- case 'enter':
276
- if (targetIsSearchResult) {
277
- this.selectSearchResultById(activeElementId);
278
- if (!this.showActionsArea) {
279
- this.closeDropdown();
280
- }
281
- else {
282
- this.resetSearch();
283
- }
284
- }
285
- else {
286
- if (activeElement) {
287
- activeElement.click();
288
- }
289
- }
290
- event.preventDefault();
291
- event.stopPropagation();
292
- break;
293
- case 'tab':
294
- if (targetIsSearchResult) {
295
- this.selectSearchResultById(activeElementId);
296
- }
297
- else {
298
- this.inputDirective.restoreInputTextValueToPreviousState();
299
- }
300
- this.closeDropdown();
301
- break;
302
- case 'escape':
303
- this.closeDropdown();
304
- break;
305
- case 'arrowdown':
306
- case 'down':
307
- this.removeFocusedClass();
308
- if (this.activeElementIndex ===
309
- this.overlayFocusableElements.length - 1 ||
310
- this.activeElementIndex === -1) {
311
- this.activeElementIndex = 0;
312
- }
313
- else {
314
- this.activeElementIndex = this.activeElementIndex + 1;
315
- }
316
- this.addFocusedClass();
317
- this.changeDetector.markForCheck();
318
- event.preventDefault();
319
- event.stopPropagation();
320
- break;
321
- case 'arrowup':
322
- case 'up':
323
- this.removeFocusedClass();
324
- if (this.activeElementIndex <= 0) {
325
- this.activeElementIndex = this.overlayFocusableElements.length - 1;
326
- }
327
- else {
328
- this.activeElementIndex = this.activeElementIndex - 1;
329
- }
330
- this.addFocusedClass();
331
- this.changeDetector.markForCheck();
332
- event.preventDefault();
333
- event.stopPropagation();
334
- break;
335
- }
336
- }
337
- }
338
- moreButtonClicked() {
339
- this.showMoreClick.emit({ inputValue: this.searchText });
340
- this.inputDirective.restoreInputTextValueToPreviousState();
341
- this.closeDropdown();
342
- }
343
- onResultMouseDown(id, event) {
344
- this.selectSearchResultById(id);
345
- if (!this.showActionsArea) {
346
- this.closeDropdown();
347
- }
348
- else {
349
- this.resetSearch();
350
- }
351
- event.preventDefault();
352
- event.stopPropagation();
353
- }
354
- onResultMouseMove(id) {
355
- if (id !== this.activeElementIndex) {
356
- this.removeFocusedClass();
357
- this.activeElementIndex = id;
358
- this.addFocusedClass();
359
- this.changeDetector.markForCheck();
360
- }
361
- }
362
- isElementFocused(ref) {
363
- return ref === this.overlayFocusableElements[this.activeElementIndex];
364
- }
365
- searchTextChanged(searchText) {
366
- const isEmpty = !searchText || !searchText.trim() || searchText.match(/^\s+$/);
367
- if (isEmpty) {
368
- // Emit selectionChange if value has been cleared.
369
- if (this.inputDirective.value) {
370
- this.inputDirective.value = undefined;
371
- this.selectionChange.emit({
372
- selectedItem: undefined,
373
- });
374
- }
375
- if (!this.showActionsArea) {
376
- this.closeDropdown();
377
- }
378
- else {
379
- this.resetSearch();
380
- }
381
- return;
382
- }
383
- const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;
384
- const isDifferent = searchText !== this.searchText;
385
- this.searchText = searchText.trim();
386
- if (isLongEnough && isDifferent) {
387
- this.performSearch().then((results) => {
388
- this._searchResults = results.map((r, i) => {
389
- const result = {
390
- elementId: `${this.resultsListId}-item-${i}`,
391
- data: r,
392
- };
393
- return result;
394
- });
395
- this.highlightText = this.getHighlightText(this.searchText);
396
- this.removeFocusedClass();
397
- this.removeActiveDescendant();
398
- if (this.searchResults.length > 0) {
399
- this.activeElementIndex = 0;
400
- }
401
- else {
402
- this.activeElementIndex = -1;
403
- }
404
- this.changeDetector.markForCheck();
405
- if (this.isOpen) {
406
- // Let the results populate in the DOM before recalculating placement.
407
- setTimeout(() => {
408
- this.affixer.reaffix();
409
- this.changeDetector.detectChanges();
410
- this.initOverlayFocusableElements();
411
- });
412
- }
413
- else {
414
- this.openDropdown();
415
- this.changeDetector.markForCheck();
416
- }
417
- });
418
- }
419
- }
420
- /**
421
- * Returns the text to highlight based on exact matches, case-insensitive matches, and matches for corresponding diacritical characters (a will match à).
422
- */
423
- getHighlightText(searchText) {
424
- const normalizedSearchText = normalizeDiacritics(this.searchText).toLocaleUpperCase();
425
- let matchesToHighlight = [];
426
- for (let i = 0, n = this._searchResults.length; i < n; i++) {
427
- const value = this._searchResults[i].data[this.descriptorProperty]
428
- .toString()
429
- .toLocaleUpperCase();
430
- const normalizedDataValue = normalizeDiacritics(value);
431
- let regexMatch;
432
- const regex = new RegExp(normalizedSearchText, 'g');
433
- while ((regexMatch = regex.exec(normalizedDataValue)) !== null) {
434
- /**
435
- * Use the regex index to pull out the location of the match from the original string.
436
- * This ensures we capture diacritical and non-diacritical character matches.
437
- */
438
- const matchedString = value.slice(regexMatch.index, regexMatch.index + searchText.length);
439
- matchesToHighlight = matchesToHighlight.concat(matchedString);
440
- }
441
- }
442
- // Remove any duplicates from the array.
443
- return [...new Set(matchesToHighlight)];
444
- }
445
- performSearch() {
446
- const result = this.search(this.searchText, this.data);
447
- if (result instanceof Array) {
448
- return Promise.resolve(result);
449
- }
450
- return result;
451
- }
452
- selectSearchResultById(id) {
453
- const result = this.searchResults.find((r) => r.elementId === id).data;
454
- /* Sanity check */
455
- /* istanbul ignore else */
456
- if (result) {
457
- this.searchText = result[this.descriptorProperty];
458
- this.inputDirective.value = result;
459
- this.selectionChange.emit({
460
- selectedItem: result,
461
- });
462
- }
463
- }
464
- openDropdown() {
465
- if (!this.overlay) {
466
- const overlay = this.overlayService.create({
467
- enableClose: false,
468
- enablePointerEvents: true,
469
- wrapperClass: this.wrapperClass,
470
- });
471
- overlay.attachTemplate(this.resultsTemplateRef);
472
- this.overlay = overlay;
473
- this.isOpen = true;
474
- this.changeDetector.markForCheck();
475
- this.initOverlayFocusableElements();
476
- overlay.backdropClick
477
- .pipe(takeUntil(this.ngUnsubscribe))
478
- .subscribe(() => {
479
- /* Sanity check as you should not be able to active the directive from the backdrop */
480
- /* istanbul ignore else */
481
- if (document.activeElement !== this.inputDirective.inputElement) {
482
- this.inputDirective.restoreInputTextValueToPreviousState();
483
- this.closeDropdown();
484
- }
485
- });
486
- }
487
- }
488
- closeDropdown() {
489
- this.resetSearch();
490
- this.isOpen = false;
491
- this.destroyOverlay();
492
- this.removeActiveDescendant();
493
- this.changeDetector.markForCheck();
494
- }
495
- setActiveDescendant() {
496
- const activeElement = this.overlayFocusableElements[this.activeElementIndex];
497
- /* Sanity check */
498
- /* istanbul ignore else */
499
- if (activeElement) {
500
- this.inputDirective.setActiveDescendant(activeElement.id);
501
- }
502
- }
503
- removeActiveDescendant() {
504
- /* tslint:disable-next-line:no-null-keyword */
505
- this.inputDirective.setActiveDescendant(null);
506
- }
507
- resetSearch() {
508
- this._searchResults = [];
509
- this.searchText = '';
510
- this._highlightText = [];
511
- this.activeElementIndex = -1;
512
- this.removeActiveDescendant();
513
- this.initOverlayFocusableElements();
514
- this.changeDetector.markForCheck();
515
- }
516
- addInputEventListeners() {
517
- const element = this.elementRef.nativeElement;
518
- observableFromEvent(element, 'keydown')
519
- .pipe(takeUntil(this.ngUnsubscribe))
520
- .subscribe((event) => {
521
- this.handleKeydown(event);
522
- });
523
- observableFromEvent(window, 'resize')
524
- .pipe(takeUntil(this.ngUnsubscribe))
525
- .subscribe(() => {
526
- /* istanbul ignore else */
527
- if (this.isOpen) {
528
- this.adapterService.setDropdownWidth(this.elementRef, this.resultsRef, !!this.inputBoxHostSvc);
529
- }
530
- });
531
- }
532
- destroyOverlay() {
533
- if (this.overlay) {
534
- this.overlayService.close(this.overlay);
535
- this.overlay = undefined;
536
- }
537
- }
538
- createAffixer() {
539
- /* Sanity check */
540
- /* istanbul ignore else */
541
- if (!this.affixer) {
542
- const affixer = this.affixService.createAffixer(this.resultsRef);
543
- this.adapterService.setDropdownWidth(this.elementRef, this.resultsRef, !!this.inputBoxHostSvc);
544
- affixer.affixTo(this.elementRef.nativeElement, {
545
- autoFitContext: SkyAffixAutoFitContext.Viewport,
546
- enableAutoFit: true,
547
- isSticky: true,
548
- placement: 'below',
549
- horizontalAlignment: 'left',
550
- });
551
- this.affixer = affixer;
552
- }
553
- }
554
- destroyAffixer() {
555
- if (this.affixer) {
556
- this.affixer.destroy();
557
- this.affixer = undefined;
558
- }
559
- }
560
- initMessageStream() {
561
- /* istanbul ignore if */
562
- if (this.messageStreamSub) {
563
- this.messageStreamSub.unsubscribe();
564
- }
565
- if (this.messageStream) {
566
- this.messageStreamSub = this.messageStream
567
- .pipe(takeUntil(this.ngUnsubscribe))
568
- .subscribe((message) => {
569
- /* tslint:disable-next-line:switch-default */
570
- switch (message.type) {
571
- case SkyAutocompleteMessageType.CloseDropdown:
572
- this.closeDropdown();
573
- break;
574
- case SkyAutocompleteMessageType.RepositionDropdown:
575
- // Settimeout waits for changes in DOM (e.g., tokens being removed)
576
- setTimeout(() => {
577
- /* istanbul ignore else */
578
- if (this.affixer) {
579
- this.affixer.reaffix();
580
- }
581
- });
582
- break;
583
- }
584
- });
585
- }
586
- }
587
- initOverlayFocusableElements() {
588
- // Wait for dropdown elements to render.
589
- setTimeout(() => {
590
- if (this.overlay) {
591
- this.overlayFocusableElements =
592
- this.adapterService.getOverlayFocusableElements(this.overlay);
593
- this.overlayFocusableElements.forEach((el) => {
594
- this.adapterService.setTabIndex(el, -1);
595
- });
596
- this.addFocusedClass();
597
- }
598
- });
599
- }
600
- getActiveElement() {
601
- return this.overlayFocusableElements[this.activeElementIndex];
602
- }
603
- removeFocusedClass() {
604
- if (this.activeElementIndex > -1) {
605
- this.adapterService.removeCSSClass(this.overlayFocusableElements[this.activeElementIndex], 'sky-autocomplete-descendant-focus');
606
- }
607
- }
608
- addFocusedClass() {
609
- if (this.activeElementIndex > -1) {
610
- this.adapterService.addCSSClass(this.overlayFocusableElements[this.activeElementIndex], 'sky-autocomplete-descendant-focus');
611
- this.setActiveDescendant();
612
- }
613
- }
614
- }
615
- SkyAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyAutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAffixService }, { token: i2.SkyAutocompleteAdapterService }, { token: i1.SkyOverlayService }, { token: i3.SkyInputBoxHostService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
616
- SkyAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: { ariaLabelledBy: "ariaLabelledBy", data: "data", debounceTime: "debounceTime", descriptorProperty: "descriptorProperty", enableShowMore: "enableShowMore", messageStream: "messageStream", wrapperClass: "wrapperClass", propertiesToSearch: "propertiesToSearch", search: "search", searchResultTemplate: "searchResultTemplate", searchTextMinimumCharacters: "searchTextMinimumCharacters", searchFilters: "searchFilters", searchResultsLimit: "searchResultsLimit", showAddButton: "showAddButton", noResultsFoundText: "noResultsFoundText" }, outputs: { addClick: "addClick", showMoreClick: "showMoreClick", selectionChange: "selectionChange" }, providers: [SkyAutocompleteAdapterService], queries: [{ propertyName: "inputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true }], viewQueries: [{ propertyName: "defaultSearchResultTemplate", first: true, predicate: ["defaultSearchResultTemplate"], descendants: true, read: TemplateRef }, { propertyName: "resultsTemplateRef", first: true, predicate: ["resultsTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "resultsRef", first: true, predicate: ["resultsRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen && searchText\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content> </ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"!searchResultsLimit || i < searchResultsLimit\"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"\n sky-autocomplete-action\n sky-autocomplete-action-more\n sky-btn\n sky-btn-link\n \"\n type=\"button\"\n (click)=\"moreButtonClicked()\"\n >\n <ng-container *ngIf=\"!searchText\">\n Show all {{ data.length }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n Show matches ({{ searchResults.length }})\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"\n sky-autocomplete-action\n sky-autocomplete-action-add\n sky-btn\n sky-btn-link\n \"\n tabindex=\"0\"\n type=\"button\"\n skyId\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (click)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"], components: [{ type: i4.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i5.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.λ11, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { type: i5.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }], pipes: { "skyLibResources": i7.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
617
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyAutocompleteComponent, decorators: [{
618
- type: Component,
619
- args: [{
620
- selector: 'sky-autocomplete',
621
- templateUrl: './autocomplete.component.html',
622
- styleUrls: ['./autocomplete.component.scss'],
623
- providers: [SkyAutocompleteAdapterService],
624
- changeDetection: ChangeDetectionStrategy.OnPush,
625
- }]
626
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAffixService }, { type: i2.SkyAutocompleteAdapterService }, { type: i1.SkyOverlayService }, { type: i3.SkyInputBoxHostService, decorators: [{
627
- type: Optional
628
- }] }]; }, propDecorators: { ariaLabelledBy: [{
629
- type: Input
630
- }], data: [{
631
- type: Input
632
- }], debounceTime: [{
633
- type: Input
634
- }], descriptorProperty: [{
635
- type: Input
636
- }], enableShowMore: [{
637
- type: Input
638
- }], messageStream: [{
639
- type: Input
640
- }], wrapperClass: [{
641
- type: Input
642
- }], propertiesToSearch: [{
643
- type: Input
644
- }], search: [{
645
- type: Input
646
- }], searchResultTemplate: [{
647
- type: Input
648
- }], searchTextMinimumCharacters: [{
649
- type: Input
650
- }], searchFilters: [{
651
- type: Input
652
- }], searchResultsLimit: [{
653
- type: Input
654
- }], showAddButton: [{
655
- type: Input
656
- }], noResultsFoundText: [{
657
- type: Input
658
- }], addClick: [{
659
- type: Output
660
- }], showMoreClick: [{
661
- type: Output
662
- }], selectionChange: [{
663
- type: Output
664
- }], defaultSearchResultTemplate: [{
665
- type: ViewChild,
666
- args: ['defaultSearchResultTemplate', {
667
- read: TemplateRef,
668
- static: false,
669
- }]
670
- }], inputDirective: [{
671
- type: ContentChild,
672
- args: [SkyAutocompleteInputDirective]
673
- }], resultsTemplateRef: [{
674
- type: ViewChild,
675
- args: ['resultsTemplateRef', {
676
- read: TemplateRef,
677
- }]
678
- }], resultsRef: [{
679
- type: ViewChild,
680
- args: ['resultsRef', {
681
- read: ElementRef,
682
- }]
683
- }] } });
684
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xvb2t1cC9zcmMvbW9kdWxlcy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xvb2t1cC9zcmMvbW9kdWxlcy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLHNCQUFzQixHQUt2QixNQUFNLGFBQWEsQ0FBQztBQUlyQixPQUFPLEVBQUUsU0FBUyxJQUFJLG1CQUFtQixFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQVUvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU5RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7O0FBVXhFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQVNqQixNQUFNLE9BQU8sd0JBQXdCO0lBZ1duQyxZQUNVLGNBQWlDLEVBQ2pDLFVBQXNCLEVBQ3RCLFlBQTZCLEVBQzdCLGNB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SztnQkFnQkssMkJBQTJCO3NCQURyQyxLQUFLO2dCQW1CQyxhQUFhO3NCQURuQixLQUFLO2dCQVFLLGtCQUFrQjtzQkFENUIsS0FBSztnQkFrQkMsYUFBYTtzQkFEbkIsS0FBSztnQkFRQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBUUMsUUFBUTtzQkFEZCxNQUFNO2dCQVFBLGFBQWE7c0JBRG5CLE1BQU07Z0JBT0ksZUFBZTtzQkFEekIsTUFBTTtnQkF1Q0MsMkJBQTJCO3NCQUpsQyxTQUFTO3VCQUFDLDZCQUE2QixFQUFFO3dCQUN4QyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLEtBQUs7cUJBQ2Q7Z0JBSVcsY0FBYztzQkFEekIsWUFBWTt1QkFBQyw2QkFBNkI7Z0JBb0RuQyxrQkFBa0I7c0JBSHpCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUU7d0JBQy9CLElBQUksRUFBRSxXQUFXO3FCQUNsQjtnQkFNVyxVQUFVO3NCQUhyQixTQUFTO3VCQUFDLFlBQVksRUFBRTt3QkFDdkIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgU2t5QWZmaXhBdXRvRml0Q29udGV4dCxcbiAgU2t5QWZmaXhlcixcbiAgU2t5QWZmaXhTZXJ2aWNlLFxuICBTa3lPdmVybGF5SW5zdGFuY2UsXG4gIFNreU92ZXJsYXlTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7IFNreUlucHV0Qm94SG9zdFNlcnZpY2UgfSBmcm9tICdAc2t5dXgvZm9ybXMnO1xuXG5pbXBvcnQgeyBmcm9tRXZlbnQgYXMgb2JzZXJ2YWJsZUZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZSc7XG5cbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZS10eXBlJztcblxuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtZnVuY3Rpb24nO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbkZpbHRlciB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1mdW5jdGlvbi1maWx0ZXInO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWxlY3Rpb24tY2hhbmdlJztcblxuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2hvdy1tb3JlLWFyZ3MnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWFkYXB0ZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IHNreUF1dG9jb21wbGV0ZURlZmF1bHRTZWFyY2hGdW5jdGlvbiB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWRlZmF1bHQtc2VhcmNoLWZ1bmN0aW9uJztcblxuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbm9ybWFsaXplRGlhY3JpdGljcyB9IGZyb20gJy4uL3NoYXJlZC9za3ktbG9va3VwLXN0cmluZy11dGlscyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHQge1xuICBlbGVtZW50SWQ6IHN0cmluZztcbiAgZGF0YTogYW55O1xufVxuXG5sZXQgdW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lBdXRvY29tcGxldGVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXRcbntcbiAgLy8jcmVnaW9uIHB1YmxpY19hcGlcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgYXV0b2NvbXBsZXRlIHRleHQgaW5wdXQuIFRoaXMgc2V0cyB0aGUgaW5wdXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBzdGF0aWMgZGF0YSBzb3VyY2UgZm9yIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IHRvIHNlYXJjaFxuICAgKiB3aGVuIHVzZXJzIGVudGVyIHRleHQuIEZvciBhIGR5bmFtaWMgZGF0YSBzb3VyY2Ugc3VjaCBhcyBhbiBhcnJheSB0aGF0XG4gICAqIGNoYW5nZXMgZHVlIHRvIHNlcnZlciBjYWxscywgdXNlIHRoZSBgc2VhcmNoYCBwcm9wZXJ0eSBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzZWFyY2hpbmcgd2hpbGUgdXNlcnNcbiAgICogZW50ZXIgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlIGZpZWxkLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRlYm91bmNlVGltZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGVib3VuY2VUaW1lID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlYm91bmNlVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZVRpbWUgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gb2JqZWN0IHByb3BlcnR5IHRvIGRpc3BsYXkgaW4gdGhlIHRleHQgaW5wdXQgYWZ0ZXIgdXNlcnNcbiAgICogc2VsZWN0IGFuIGl0ZW0gaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIEBkZWZhdWx0IG5hbWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRvclByb3BlcnR5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdG9yUHJvcGVydHkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRvclByb3BlcnR5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0b3JQcm9wZXJ0eSB8fCAnbmFtZSc7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc3BsYXkgYSBidXR0b24gaW4gdGhlIGRyb3Bkb3duIHRoYXQgb3BlbnMgYSBwaWNrZXIgd2hlcmUgdXNlcnMgY2FuIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlU2hvd01vcmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIG9ic2VydmFibGUgb2YgYFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VgIHRoYXQgY2FuIGNsb3NlIHRoZSBkcm9wZG93bi5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1lc3NhZ2VTdHJlYW0odmFsdWU6IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4pIHtcbiAgICB0aGlzLl9tZXNzYWdlU3RyZWFtID0gdmFsdWU7XG4gICAgdGhpcy5pbml0TWVzc2FnZVN0cmVhbSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJDbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvYmplY3QgcHJvcGVydGllcyB0byBzZWFyY2guXG4gICAqIEBkZWZhdWx0IFsnbmFtZSddXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHByb3BlcnRpZXNUb1NlYXJjaCh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9wcm9wZXJ0aWVzVG9TZWFyY2ggPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJvcGVydGllc1RvU2VhcmNoKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllc1RvU2VhcmNoIHx8IFsnbmFtZSddO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IG1hbmFnZSB0aGUgZGF0YSBzb3VyY2Ugd2hlbiB1c2Vyc1xuICAgKiBjaGFuZ2UgdGhlIHRleHQgaW4gdGhlIGF1dG9jb21wbGV0ZSBmaWVsZC4gVGhlIHNlYXJjaCBmdW5jdGlvbiBtdXN0IHJldHVyblxuICAgKiBhbiBhcnJheSBvciBhIHByb21pc2Ugb2YgYW4gYXJyYXkuIFRoZSBgc2VhcmNoYCBwcm9wZXJ0eSBpcyBwYXJ0aWN1bGFybHlcbiAgICogdXNlZnVsIHdoZW4gdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IGxpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2godmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fc2VhcmNoID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaCgpOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3NlYXJjaCB8fFxuICAgICAgc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uKHtcbiAgICAgICAgcHJvcGVydGllc1RvU2VhcmNoOiB0aGlzLnByb3BlcnRpZXNUb1NlYXJjaCxcbiAgICAgICAgc2VhcmNoRmlsdGVyczogdGhpcy5zZWFyY2hGaWx0ZXJzLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHRlbXBsYXRlIHRvIGZvcm1hdCBlYWNoIHNlYXJjaCByZXN1bHQgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIFRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IGluamVjdHMgc2VhcmNoIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgdGVtcGxhdGVcbiAgICogYXMgYGl0ZW1gIHZhcmlhYmxlcyB0aGF0IHJlZmVyZW5jZSBhbGwgb2YgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIG9mIHRoZSBzZWFyY2ggcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoUmVzdWx0VGVtcGxhdGUodmFsdWU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICB0aGlzLl9zZWFyY2hSZXN1bHRUZW1wbGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoUmVzdWx0VGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdXNlcnMgbXVzdCBlbnRlciBiZWZvcmVcbiAgICogdGhlIGF1dG9jb21wbGV0ZSBjb21wb25lbnQgc2VhcmNoZXMgdGhlIGRhdGEgc291cmNlIGFuZCBkaXNwbGF5cyBzZWFyY2hcbiAgICogcmVzdWx0cyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzID4gMFxuICAgICAgPyB0aGlzLl9zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnNcbiAgICAgIDogMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGNhbGwgYWdhaW5zdCBlYWNoIHNlYXJjaCByZXN1bHQgaW4gb3JkZXJcbiAgICogdG8gZmlsdGVyIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHNlYXJjaCBmdW5jdGlvbi4gV2hlblxuICAgKiB1c2luZyB0aGUgYHNlYXJjaGAgcHJvcGVydHkgdG8gc3BlY2lmeSBhIGN1c3RvbSBzZWFyY2ggZnVuY3Rpb24sIHlvdSBtdXN0XG4gICAqIG1hbnVhbGx5IGFwcGx5IGZpbHRlcnMgaW5zaWRlIHRoYXQgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBgdHJ1ZWBcbiAgICogb3IgYGZhbHNlYCBmb3IgZWFjaCByZXN1bHQgdG8gaW5kaWNhdGUgd2hldGhlciB0byBkaXNwbGF5IGl0IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlYXJjaEZpbHRlcnM6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VhcmNoIHJlc3VsdHMgdG8gZGlzcGxheSBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGNvbXBvbmVudCBkaXNwbGF5cyBhbGwgbWF0Y2hpbmcgcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoUmVzdWx0c0xpbWl0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZWFyY2hSZXN1bHRzTGltaXQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoUmVzdWx0c0xpbWl0KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NlYXJjaFJlc3VsdHNMaW1pdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFJlc3VsdHNMaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlU2hvd01vcmUgPyA1IDogdGhpcy5fc2VhcmNoUmVzdWx0c0xpbWl0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGJ1dHRvbiB0aGF0IGxldHMgdXNlcnMgYWRkIG9wdGlvbnMgdG8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBzZWFyY2ggcmVzdWx0cyBhcmUgZm91bmQuXG4gICAqIEBkZWZhdWx0IE5vIG1hdGNoZXMgZm91bmRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBub1Jlc3VsdHNGb3VuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBidXR0b24gdG8gYWRkIG9wdGlvbnMgdG8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhZGRDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgdGhlIGJ1dHRvbiB0byB2aWV3IGFsbCBvcHRpb25zLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzaG93TW9yZUNsaWNrOiBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGdldCBzZWxlY3Rpb25DaGFuZ2UoKTogRXZlbnRFbWl0dGVyPFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25DaGFuZ2U7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gdGVtcGxhdGVfcHJvcGVydGllc1xuXG4gIHB1YmxpYyBnZXQgc2VhcmNoUmVzdWx0cygpOiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaFJlc3VsdHMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgc2V0IGhpZ2hsaWdodFRleHQodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faGlnaGxpZ2h0VGV4dCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWdobGlnaHRUZXh0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0VGV4dCB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgcmVzdWx0c0xpc3RJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyByZXN1bHRzV3JhcHBlcklkOiBzdHJpbmc7XG5cbiAgcHVibGljIHNlYXJjaFRleHQ6IHN0cmluZztcblxuICBwdWJsaWMgZ2V0IHNob3dBY3Rpb25zQXJlYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWRkQnV0dG9uIHx8IHRoaXMuZW5hYmxlU2hvd01vcmU7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICBAVmlld0NoaWxkKCdkZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGUnLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgc3RhdGljOiBmYWxzZSxcbiAgfSlcbiAgcHJpdmF0ZSBkZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSlcbiAgcHJpdmF0ZSBzZXQgaW5wdXREaXJlY3RpdmUoZGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSkge1xuICAgIGlmICh0aGlzLl9pbnB1dERpcmVjdGl2ZSAhPT0gZGlyZWN0aXZlKSB7XG4gICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBbXG4gICAgICAgICAgICAnVGhlIFNreUF1dG9jb21wbGV0ZUNvbXBvbmVudCByZXF1aXJlcyBhIENvbnRlbnRDaGlsZCBpbnB1dCBvcicsXG4gICAgICAgICAgICAndGV4dGFyZWEgYm91bmQgd2l0aCB0aGUgU2t5QXV0b2NvbXBsZXRlIGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGU6JyxcbiAgICAgICAgICAgICdgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2t5QXV0b2NvbXBsZXRlPmAuJyxcbiAgICAgICAgICBdLmpvaW4oJyAnKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIG9sZCBzdWJzY3JpcHRpb25zIG9uIGFueSBwcmV2aW91cyBpbnB1dCBkaXJlY3RpdmVcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5uZXh0KCk7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuXG4gICAgICB0aGlzLl9pbnB1dERpcmVjdGl2ZS5kaXNwbGF5V2l0aCA9IHRoaXMuZGVzY3JpcHRvclByb3BlcnR5O1xuXG4gICAgICB0aGlzLl9pbnB1dERpcmVjdGl2ZS50ZXh0Q2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5pbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlKSxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0Q2hhbmdlZChjaGFuZ2UudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5faW5wdXREaXJlY3RpdmUuYmx1clxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5pbnB1dERpcmVjdGl2ZVVuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5vblRvdWNoZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlLmZvY3VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBpbnB1dERpcmVjdGl2ZSgpOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGlyZWN0aXZlO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1RlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBwcml2YXRlIHJlc3VsdHNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAVmlld0NoaWxkKCdyZXN1bHRzUmVmJywge1xuICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gIH0pXG4gIHByaXZhdGUgc2V0IHJlc3VsdHNSZWYodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdHNSZWYgPSB2YWx1ZTtcbiAgICAgIHRoaXMuZGVzdHJveUFmZml4ZXIoKTtcbiAgICAgIHRoaXMuY3JlYXRlQWZmaXhlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJlc3VsdHNSZWYoKTogRWxlbWVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHNSZWY7XG4gIH1cblxuICAvKipcbiAgICogSW5kZXggdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZGVzY2VuZGFudCBvZiB0aGUgb3ZlcmxheSBjdXJyZW50bHkgaGFzIGZvY3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVFbGVtZW50SW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgYWZmaXhlcjogU2t5QWZmaXhlcjtcblxuICBwcml2YXRlIGlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgbWVzc2FnZVN0cmVhbVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBvdmVybGF5OiBTa3lPdmVybGF5SW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIEVsZW1lbnRzIHdpdGhpbiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duIHRoYXQgYXJlIGZvY3VzYWJsZS5cbiAgICogVGhlc2UgYXJlIHR5cGljYWxseSB0aGUgc2VhcmNoIHJlc3VsdHMgYW5kIGFjdGlvbiBidXR0b25zLCBidXQgY291bGQgYWxzbyBiZVxuICAgKiBlbGVtZW50cyBwcm92aWRlZCBpbiB0aGUgY29uc3VtZXIncyBvd24gdGVtcGxhdGUuXG4gICAqL1xuICBwcml2YXRlIG92ZXJsYXlGb2N1c2FibGVFbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2RhdGE6IGFueVtdO1xuICBwcml2YXRlIF9kZWJvdW5jZVRpbWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGVzY3JpcHRvclByb3BlcnR5OiBzdHJpbmc7XG4gIHByaXZhdGUgX2hpZ2hsaWdodFRleHQ6IHN0cmluZ1tdO1xuICBwcml2YXRlIF9pbnB1dERpcmVjdGl2ZTogU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmU7XG4gIHByaXZhdGUgX21lc3NhZ2VTdHJlYW06IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT47XG4gIHByaXZhdGUgX3Byb3BlcnRpZXNUb1NlYXJjaDogc3RyaW5nW107XG4gIHByaXZhdGUgX3Jlc3VsdHNSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgX3NlYXJjaDogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb247XG4gIHByaXZhdGUgX3NlYXJjaFJlc3VsdHM6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdO1xuICBwcml2YXRlIF9zZWFyY2hSZXN1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgcHJpdmF0ZSBfc2VhcmNoUmVzdWx0c0xpbWl0OiBudW1iZXI7XG4gIHByaXZhdGUgX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVyczogbnVtYmVyO1xuICBwcml2YXRlIF9zZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBhZmZpeFNlcnZpY2U6IFNreUFmZml4U2VydmljZSxcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGlucHV0Qm94SG9zdFN2Yz86IFNreUlucHV0Qm94SG9zdFNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgaWQgPSArK3VuaXF1ZUlkO1xuICAgIHRoaXMucmVzdWx0c0xpc3RJZCA9IGBza3ktYXV0b2NvbXBsZXRlLWxpc3QtJHtpZH1gO1xuICAgIHRoaXMucmVzdWx0c1dyYXBwZXJJZCA9IGBza3ktYXV0b2NvbXBsZXRlLXdyYXBwZXItJHtpZH1gO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgJ1RoZSBTa3lBdXRvY29tcGxldGVDb21wb25lbnQgcmVxdWlyZXMgYSBDb250ZW50Q2hpbGQgaW5wdXQgb3InLFxuICAgICAgICAgICd0ZXh0YXJlYSBib3VuZCB3aXRoIHRoZSBTa3lBdXRvY29tcGxldGUgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZTonLFxuICAgICAgICAgICdgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2t5QXV0b2NvbXBsZXRlPmAuJyxcbiAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZElucHV0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95QWZmaXhlcigpO1xuICAgIHRoaXMuZGVzdHJveU92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2xpY2suZW1pdCgpO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGV2ZW50LmtleSkge1xuICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50SWQgPSBhY3RpdmVFbGVtZW50Py5pZDtcbiAgICAgIGNvbnN0IHRhcmdldElzU2VhcmNoUmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoXG4gICAgICAgIChyKSA9PiByLmVsZW1lbnRJZCA9PT0gYWN0aXZlRWxlbWVudElkXG4gICAgICApO1xuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3dpdGNoLWRlZmF1bHQgKi9cbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ2VudGVyJzpcbiAgICAgICAgICBpZiAodGFyZ2V0SXNTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChhY3RpdmVFbGVtZW50SWQpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FjdGlvbnNBcmVhKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldFNlYXJjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgIGlmICh0YXJnZXRJc1NlYXJjaFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGFjdGl2ZUVsZW1lbnRJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXNjYXBlJzpcbiAgICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICB0aGlzLnJlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID09PVxuICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxIHx8XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA9PT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgdGhpcy5yZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA9IHRoaXMuYWN0aXZlRWxlbWVudEluZGV4IC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vcmVCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vcmVDbGljay5lbWl0KHsgaW5wdXRWYWx1ZTogdGhpcy5zZWFyY2hUZXh0IH0pO1xuICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXN1bHRNb3VzZURvd24oaWQ6IHN0cmluZywgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoaWQpO1xuXG4gICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzZXRTZWFyY2goKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzdWx0TW91c2VNb3ZlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaWQgIT09IHRoaXMuYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICB0aGlzLnJlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSBpZDtcbiAgICAgIHRoaXMuYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0VsZW1lbnRGb2N1c2VkKHJlZjogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVmID09PSB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICBwcml2YXRlIHNlYXJjaFRleHRDaGFuZ2VkKHNlYXJjaFRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGlzRW1wdHkgPVxuICAgICAgIXNlYXJjaFRleHQgfHwgIXNlYXJjaFRleHQudHJpbSgpIHx8IHNlYXJjaFRleHQubWF0Y2goL15cXHMrJC8pO1xuXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIC8vIEVtaXQgc2VsZWN0aW9uQ2hhbmdlIGlmIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQuXG4gICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvbmdFbm91Z2ggPSBzZWFyY2hUZXh0Lmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycztcbiAgICBjb25zdCBpc0RpZmZlcmVudCA9IHNlYXJjaFRleHQgIT09IHRoaXMuc2VhcmNoVGV4dDtcblxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHNlYXJjaFRleHQudHJpbSgpO1xuXG4gICAgaWYgKGlzTG9uZ0Vub3VnaCAmJiBpc0RpZmZlcmVudCkge1xuICAgICAgdGhpcy5wZXJmb3JtU2VhcmNoKCkudGhlbigocmVzdWx0czogYW55W10pID0+IHtcbiAgICAgICAgdGhpcy5fc2VhcmNoUmVzdWx0cyA9IHJlc3VsdHMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0OiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHQgPSB7XG4gICAgICAgICAgICBlbGVtZW50SWQ6IGAke3RoaXMucmVzdWx0c0xpc3RJZH0taXRlbS0ke2l9YCxcbiAgICAgICAgICAgIGRhdGE6IHIsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhpZ2hsaWdodFRleHQgPSB0aGlzLmdldEhpZ2hsaWdodFRleHQodGhpcy5zZWFyY2hUZXh0KTtcblxuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50SW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgIC8vIExldCB0aGUgcmVzdWx0cyBwb3B1bGF0ZSBpbiB0aGUgRE9NIGJlZm9yZSByZWNhbGN1bGF0aW5nIHBsYWNlbWVudC5cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWZmaXhlci5yZWFmZml4KCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdE92ZXJsYXlGb2N1c2FibGVFbGVtZW50cygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgdG8gaGlnaGxpZ2h0IGJhc2VkIG9uIGV4YWN0IG1hdGNoZXMsIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hlcywgYW5kIG1hdGNoZXMgZm9yIGNvcnJlc3BvbmRpbmcgZGlhY3JpdGljYWwgY2hhcmFjdGVycyAoYSB3aWxsIG1hdGNoIMOgKS5cbiAgICovXG4gIHByaXZhdGUgZ2V0SGlnaGxpZ2h0VGV4dChzZWFyY2hUZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaFRleHQgPSBub3JtYWxpemVEaWFjcml0aWNzKFxuICAgICAgdGhpcy5zZWFyY2hUZXh0XG4gICAgKS50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuXG4gICAgbGV0IG1hdGNoZXNUb0hpZ2hsaWdodDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuX3NlYXJjaFJlc3VsdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3NlYXJjaFJlc3VsdHNbaV0uZGF0YVt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV1cbiAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgLnRvTG9jYWxlVXBwZXJDYXNlKCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGFWYWx1ZSA9IG5vcm1hbGl6ZURpYWNyaXRpY3ModmFsdWUpO1xuXG4gICAgICBsZXQgcmVnZXhNYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKG5vcm1hbGl6ZWRTZWFyY2hUZXh0LCAnZycpO1xuICAgICAgd2hpbGUgKChyZWdleE1hdGNoID0gcmVnZXguZXhlYyhub3JtYWxpemVkRGF0YVZhbHVlKSkgIT09IG51bGwpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgcmVnZXggaW5kZXggdG8gcHVsbCBvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaCBmcm9tIHRoZSBvcmlnaW5hbCBzdHJpbmcuXG4gICAgICAgICAqIFRoaXMgZW5zdXJlcyB3ZSBjYXB0dXJlIGRpYWNyaXRpY2FsIGFuZCBub24tZGlhY3JpdGljYWwgY2hhcmFjdGVyIG1hdGNoZXMuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gdmFsdWUuc2xpY2UoXG4gICAgICAgICAgcmVnZXhNYXRjaC5pbmRleCxcbiAgICAgICAgICByZWdleE1hdGNoLmluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgICAgbWF0Y2hlc1RvSGlnaGxpZ2h0ID0gbWF0Y2hlc1RvSGlnaGxpZ2h0LmNvbmNhdChtYXRjaGVkU3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgYXJyYXkuXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KG1hdGNoZXNUb0hpZ2hsaWdodCldO1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtU2VhcmNoKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2godGhpcy5zZWFyY2hUZXh0LCB0aGlzLmRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoKHIpID0+IHIuZWxlbWVudElkID09PSBpZCkuZGF0YTtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHJlc3VsdFt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV07XG4gICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gcmVzdWx0O1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNlbGVjdGVkSXRlbTogcmVzdWx0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXkpIHtcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgIH0pO1xuXG4gICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMucmVzdWx0c1RlbXBsYXRlUmVmKTtcblxuICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLmluaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcblxuICAgICAgb3ZlcmxheS5iYWNrZHJvcENsaWNrXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvKiBTYW5pdHkgY2hlY2sgYXMgeW91IHNob3VsZCBub3QgYmUgYWJsZSB0byBhY3RpdmUgdGhlIGRpcmVjdGl2ZSBmcm9tIHRoZSBiYWNrZHJvcCAqL1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuaW5wdXREaXJlY3RpdmUuaW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnJlc3RvcmVJbnB1dFRleHRWYWx1ZVRvUHJldmlvdXNTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFNlYXJjaCgpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5kZXN0cm95T3ZlcmxheSgpO1xuICAgIHRoaXMucmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZURlc2NlbmRhbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9XG4gICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF07XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5zZXRBY3RpdmVEZXNjZW5kYW50KGFjdGl2ZUVsZW1lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpOiB2b2lkIHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbnVsbC1rZXl3b3JkICovXG4gICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5zZXRBY3RpdmVEZXNjZW5kYW50KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWFyY2hSZXN1bHRzID0gW107XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5faGlnaGxpZ2h0VGV4dCA9IFtdO1xuICAgIHRoaXMuYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgdGhpcy5yZW1vdmVBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgdGhpcy5pbml0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSW5wdXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVLZXlkb3duKGV2ZW50KTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXREcm9wZG93bldpZHRoKFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLFxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzUmVmLFxuICAgICAgICAgICAgISF0aGlzLmlucHV0Qm94SG9zdFN2Y1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95T3ZlcmxheSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlKHRoaXMub3ZlcmxheSk7XG4gICAgICB0aGlzLm92ZXJsYXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBZmZpeGVyKCk6IHZvaWQge1xuICAgIC8qIFNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCF0aGlzLmFmZml4ZXIpIHtcbiAgICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKHRoaXMucmVzdWx0c1JlZik7XG5cbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RHJvcGRvd25XaWR0aChcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLFxuICAgICAgICB0aGlzLnJlc3VsdHNSZWYsXG4gICAgICAgICEhdGhpcy5pbnB1dEJveEhvc3RTdmNcbiAgICAgICk7XG5cbiAgICAgIGFmZml4ZXIuYWZmaXhUbyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgZW5hYmxlQXV0b0ZpdDogdHJ1ZSxcbiAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgIHBsYWNlbWVudDogJ2JlbG93JyxcbiAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWZmaXhlciA9IGFmZml4ZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95QWZmaXhlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZmZpeGVyKSB7XG4gICAgICB0aGlzLmFmZml4ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5hZmZpeGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdE1lc3NhZ2VTdHJlYW0oKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHRoaXMubWVzc2FnZVN0cmVhbVN1Yikge1xuICAgICAgdGhpcy5tZXNzYWdlU3RyZWFtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVzc2FnZVN0cmVhbSkge1xuICAgICAgdGhpcy5tZXNzYWdlU3RyZWFtU3ViID0gdGhpcy5tZXNzYWdlU3RyZWFtXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lBdXRvY29tcGxldGVNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0ICovXG4gICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZVR5cGUuQ2xvc2VEcm9wZG93bjpcbiAgICAgICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5SZXBvc2l0aW9uRHJvcGRvd246XG4gICAgICAgICAgICAgIC8vIFNldHRpbWVvdXQgd2FpdHMgZm9yIGNoYW5nZXMgaW4gRE9NIChlLmcuLCB0b2tlbnMgYmVpbmcgcmVtb3ZlZClcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hZmZpeGVyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFmZml4ZXIucmVhZmZpeCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgIC8vIFdhaXQgZm9yIGRyb3Bkb3duIGVsZW1lbnRzIHRvIHJlbmRlci5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMgPVxuICAgICAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZ2V0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKHRoaXMub3ZlcmxheSk7XG4gICAgICAgIHRoaXMub3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRUYWJJbmRleChlbCwgLTEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuYWN0aXZlRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnJlbW92ZUNTU0NsYXNzKFxuICAgICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF0sXG4gICAgICAgICdza3ktYXV0b2NvbXBsZXRlLWRlc2NlbmRhbnQtZm9jdXMnXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmFkZENTU0NsYXNzKFxuICAgICAgICB0aGlzLm92ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLmFjdGl2ZUVsZW1lbnRJbmRleF0sXG4gICAgICAgICdza3ktYXV0b2NvbXBsZXRlLWRlc2NlbmRhbnQtZm9jdXMnXG4gICAgICApO1xuICAgICAgdGhpcy5zZXRBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXG4gIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlXCJcbiAgcm9sZT1cImNvbWJvYm94XCJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4gJiYgc2VhcmNoVGV4dFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFthdHRyLmFyaWEtb3duc109XCJpc09wZW4gPyByZXN1bHRzTGlzdElkIDogbnVsbFwiXG4gIFthdHRyLmlkXT1cInJlc3VsdHNXcmFwcGVySWRcIlxuPlxuICA8bmctY29udGVudD4gPC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcmVzdWx0c1RlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLXJlc3VsdHMtY29udGFpbmVyXCJcbiAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAnc2t5LXNoYWRvdyc6ICdkZWZhdWx0JyxcbiAgICAgICdza3ktZWxldmF0aW9uLTQnOiAnbW9kZXJuJ1xuICAgIH1cIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiXG4gICAgI3Jlc3VsdHNSZWZcbiAgPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2VhcmNoVGV4dCAmJiAoIXNob3dBY3Rpb25zQXJlYSB8fCBzZWFyY2hSZXN1bHRzLmxlbmd0aCA+IDApXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzXCJcbiAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgICBbYXR0ci5pZF09XCJyZXN1bHRzTGlzdElkXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZXN1bHQgb2Ygc2VhcmNoUmVzdWx0czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhc2VhcmNoUmVzdWx0c0xpbWl0IHx8IGkgPCBzZWFyY2hSZXN1bHRzTGltaXRcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRcIlxuICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0VsZW1lbnRGb2N1c2VkKHNlYXJjaFJlc3VsdEVsKVwiXG4gICAgICAgICAgW2F0dHIuaWRdPVwicmVzdWx0LmVsZW1lbnRJZFwiXG4gICAgICAgICAgW3NreUhpZ2hsaWdodF09XCJoaWdobGlnaHRUZXh0XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzdWx0TW91c2VEb3duKHJlc3VsdC5lbGVtZW50SWQsICRldmVudClcIlxuICAgICAgICAgIChtb3VzZW1vdmUpPVwib25SZXN1bHRNb3VzZU1vdmUoaSlcIlxuICAgICAgICAgICNzZWFyY2hSZXN1bHRFbFxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgaXRlbTogcmVzdWx0LmRhdGEgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwic2VhcmNoUmVzdWx0cy5sZW5ndGggPT09IDBcIlxuICAgICAgICBjbGFzcz1cInNreS1kZWVtcGhhc2l6ZWQgc2t5LXBhZGRpbmctc3F1aXNoLWRlZmF1bHRcIlxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgIG5vUmVzdWx0c0ZvdW5kVGV4dCB8fFxuICAgICAgICAgICAgKCdza3l1eF9hdXRvY29tcGxldGVfbm9fcmVzdWx0cycgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICAgIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0FjdGlvbnNBcmVhXCIgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLWFjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJlbmFibGVTaG93TW9yZSAmJiAoIXNlYXJjaFRleHQgfHwgc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKVwiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb25cbiAgICAgICAgICBza3ktYXV0b2NvbXBsZXRlLWFjdGlvbi1tb3JlXG4gICAgICAgICAgc2t5LWJ0blxuICAgICAgICAgIHNreS1idG4tbGlua1xuICAgICAgICBcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm1vcmVCdXR0b25DbGlja2VkKClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlYXJjaFRleHRcIj5cbiAgICAgICAgICBTaG93IGFsbCB7eyBkYXRhLmxlbmd0aCB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaFRleHRcIj5cbiAgICAgICAgICBTaG93IG1hdGNoZXMgKHt7IHNlYXJjaFJlc3VsdHMubGVuZ3RoIH19KVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQgJiYgc2VhcmNoUmVzdWx0cy5sZW5ndGggPT09IDBcIlxuICAgICAgICBjbGFzcz1cInNreS1mb250LWRlZW1waGFzaXplZCBza3ktYXV0b2NvbXBsZXRlLWFjdGlvbnMtbm8tcmVzdWx0c1wiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgbm9SZXN1bHRzRm91bmRUZXh0IHx8XG4gICAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dBZGRCdXR0b25cIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHNreS1hdXRvY29tcGxldGUtYWN0aW9uXG4gICAgICAgICAgc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tYWRkXG4gICAgICAgICAgc2t5LWJ0blxuICAgICAgICAgIHNreS1idG4tbGlua1xuICAgICAgICBcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgc2t5SWRcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiaXNFbGVtZW50Rm9jdXNlZChhZGRCdXR0b25FbClcIlxuICAgICAgICAoY2xpY2spPVwiYWRkQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgI2FkZEJ1dHRvbkVsXG4gICAgICA+XG4gICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cImFkZFwiIGljb25UeXBlPVwic2t5dXhcIj48L3NreS1pY29uPlxuICAgICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwicGx1cy1jaXJjbGVcIj48L3NreS1pY29uPlxuICAgICAgICB7eyAnc2t5dXhfYXV0b2NvbXBsZXRlX2FkZCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiAjZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlPlxuICB7eyBpdGVtW2Rlc2NyaXB0b3JQcm9wZXJ0eV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=