@smart-webcomponents-angular/combobox 19.0.8 → 25.0.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.
- package/combobox/smart.combobox.d.ts +99 -92
- package/combobox/smart.element.d.ts +6 -2
- package/esm2020/combobox/smart.combobox.mjs +130 -95
- package/esm2020/combobox/smart.element.mjs +16 -3
- package/esm2020/combobox/smart.listitem.mjs +3 -2
- package/esm2020/combobox/smart.listitemsgroup.mjs +3 -2
- package/fesm2015/smart-webcomponents-angular-combobox.mjs +147 -98
- package/fesm2015/smart-webcomponents-angular-combobox.mjs.map +1 -1
- package/fesm2020/smart-webcomponents-angular-combobox.mjs +147 -98
- package/fesm2020/smart-webcomponents-angular-combobox.mjs.map +1 -1
- package/index.d.ts +5986 -5196
- package/package.json +20 -17
- package/source/modules/smart.combobox.js +2 -2
- package/source/smart.button.js +3 -3
- package/source/smart.checkbox.js +3 -3
- package/source/smart.combobox.js +3 -3
- package/source/smart.dropdownlist.js +3 -3
- package/source/smart.element.js +3 -3
- package/source/smart.listbox.js +3 -3
- package/source/smart.radiobutton.js +3 -3
- package/source/smart.scrollbar.js +2 -2
- package/styles/font/smart-icons.eot +0 -0
- package/styles/font/smart-icons.svg +14 -0
- package/styles/font/smart-icons.ttf +0 -0
- package/styles/font/smart-icons.woff +0 -0
- package/styles/font/smart-icons.woff2 +0 -0
- package/styles/smart.base.css +2 -2
- package/styles/smart.combobox.css +1 -1
- package/styles/smart.common.css +1 -1
|
@@ -22,7 +22,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
22
22
|
* The registered callback function called when a blur event occurs on the form elements.
|
|
23
23
|
*/
|
|
24
24
|
this._onTouched = () => { };
|
|
25
|
-
/** @description This event is triggered
|
|
25
|
+
/** @description This event is triggered whenever the user changes the current selection, such as highlighting different text or selecting a new item in a list. It allows you to detect and respond to updates in the selected content or options within the interface.
|
|
26
26
|
* @param event. The custom event. Custom event was created with: event.detail( addedItems, disabled, index, label, removedItems, selected, value)
|
|
27
27
|
* addedItems - An array of List items that have been selected.
|
|
28
28
|
* disabled - A flag indicating whether or not the item that caused the change event is disabled.
|
|
@@ -33,13 +33,13 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
33
33
|
* value - The value of the List item that triggered the event.
|
|
34
34
|
*/
|
|
35
35
|
this.onChange = new EventEmitter();
|
|
36
|
-
/** @description This event is triggered when the drop
|
|
36
|
+
/** @description This event is triggered when the drop-down list is closed, either by the user selecting an option or by clicking outside the menu. It occurs after the drop-down menu is no longer visible, allowing you to perform actions in response to the menu's closure.
|
|
37
37
|
* @param event. The custom event. */
|
|
38
38
|
this.onClose = new EventEmitter();
|
|
39
|
-
/** @description This event is triggered
|
|
39
|
+
/** @description This event is triggered right before the dropdown list is about to close, providing an opportunity to intervene. By calling event.preventDefault() within the event handler, you can cancel the closing operation, allowing you to perform validation, display a confirmation dialog, or execute custom logic before the dropdown is closed.
|
|
40
40
|
* @param event. The custom event. */
|
|
41
41
|
this.onClosing = new EventEmitter();
|
|
42
|
-
/** @description This event is triggered
|
|
42
|
+
/** @description This event is triggered whenever a user clicks on a specific item, allowing you to execute custom actions in response to the user's selection. The event provides context about the clicked item, enabling you to access its properties or perform related updates within your application.
|
|
43
43
|
* @param event. The custom event. Custom event was created with: event.detail( disabled, index, label, selected, value)
|
|
44
44
|
* disabled - Indicates whether the List item that was clicked is disabled or not.
|
|
45
45
|
* index - Indicates the index of the List item that was clicked.
|
|
@@ -48,29 +48,29 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
48
48
|
* value - The value of the List item that was clicked.
|
|
49
49
|
*/
|
|
50
50
|
this.onItemClick = new EventEmitter();
|
|
51
|
-
/** @description This event is triggered when the
|
|
51
|
+
/** @description This event is triggered whenever the dropdown list becomes visible to the user, such as when the user clicks or interacts with the control to expand and display the list of available options. Use this event to execute custom logic when the dropdown menu is opened.
|
|
52
52
|
* @param event. The custom event. */
|
|
53
53
|
this.onOpen = new EventEmitter();
|
|
54
|
-
/** @description This event is triggered
|
|
54
|
+
/** @description This event is triggered immediately before the dropdown list is displayed to the user. Within the event handler, you can prevent the dropdown from opening by calling event.preventDefault(). This allows you to implement custom logic to conditionally allow or block the opening of the dropdown, such as validating conditions or managing user permissions before the list is shown.
|
|
55
55
|
* @param event. The custom event. */
|
|
56
56
|
this.onOpening = new EventEmitter();
|
|
57
|
-
/** @description This event is triggered when user
|
|
57
|
+
/** @description This event is triggered when the user initiates the resizing action on the dropdown component, such as clicking and dragging a resize handle. It allows developers to detect the exact moment when a resize operation on the dropdown begins.
|
|
58
58
|
* @param event. The custom event. Custom event was created with: event.detail( position)
|
|
59
59
|
* position - An object containing the current left and top positions of the drop down.
|
|
60
60
|
*/
|
|
61
61
|
this.onResizeStart = new EventEmitter();
|
|
62
|
-
/** @description This event is triggered
|
|
62
|
+
/** @description This event is triggered after the user has completed resizing the dropdown menu, signaling that the resizing action has ended and the new dimensions have been set.
|
|
63
63
|
* @param event. The custom event. Custom event was created with: event.detail( position)
|
|
64
64
|
* position - An object containing the current left and top positions of the drop down.
|
|
65
65
|
*/
|
|
66
66
|
this.onResizeEnd = new EventEmitter();
|
|
67
|
-
/** @description This event is triggered when user scrolls to the
|
|
67
|
+
/** @description This event is triggered when the user scrolls to the bottom of the dropdown list, indicating that all available options have been displayed. It can be used to detect when additional data should be loaded or when no further options remain in the dropdown.
|
|
68
68
|
* @param event. The custom event. */
|
|
69
69
|
this.onScrollBottomReached = new EventEmitter();
|
|
70
|
-
/** @description This event is triggered when user scrolls to the
|
|
70
|
+
/** @description This event is triggered when the user scrolls to the very beginning (top) of the dropdown list, indicating that no more items are available above the current view.
|
|
71
71
|
* @param event. The custom event. */
|
|
72
72
|
this.onScrollTopReached = new EventEmitter();
|
|
73
|
-
/** @description This event is triggered when a token item(pill)
|
|
73
|
+
/** @description This event is triggered when a token item (also known as a 'pill') is clicked by the user. By handling this event, developers have the opportunity to intercept the default action that would normally occur when the token is clicked—such as opening a dropdown or performing another related operation. To prevent the default behavior from executing, call event.preventDefault() within your event handler function."
|
|
74
74
|
* @param event. The custom event. */
|
|
75
75
|
this.onTokenClick = new EventEmitter();
|
|
76
76
|
this._initialChange = true;
|
|
@@ -86,455 +86,462 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
86
86
|
}
|
|
87
87
|
return this.nativeElement;
|
|
88
88
|
}
|
|
89
|
-
/** @description
|
|
89
|
+
/** @description This property is applicable only when dropDownOpenMode is set to 'auto'. It specifies the amount of time (in milliseconds) the dropdown will remain open after the pointer leaves the element, before it automatically closes. If the pointer is not hovering over the dropdown or its trigger element, the dropdown will close after this delay. */
|
|
90
90
|
get autoCloseDelay() {
|
|
91
91
|
return this.nativeElement ? this.nativeElement.autoCloseDelay : undefined;
|
|
92
92
|
}
|
|
93
93
|
set autoCloseDelay(value) {
|
|
94
94
|
this.nativeElement ? this.nativeElement.autoCloseDelay = value : undefined;
|
|
95
95
|
}
|
|
96
|
-
/** @description
|
|
96
|
+
/** @description Specifies the autocomplete mode for the input field. The selected mode defines how the component filters and displays items from the dataSource, showing only those entries that match the user's input according to the chosen matching strategy. This setting directly impacts the suggestions presented to the user as they type. */
|
|
97
97
|
get autoComplete() {
|
|
98
98
|
return this.nativeElement ? this.nativeElement.autoComplete : undefined;
|
|
99
99
|
}
|
|
100
100
|
set autoComplete(value) {
|
|
101
101
|
this.nativeElement ? this.nativeElement.autoComplete = value : undefined;
|
|
102
102
|
}
|
|
103
|
-
/** @description
|
|
103
|
+
/** @description Specifies the amount of time, in milliseconds, to wait after the user input before displaying the dropdown list of autocomplete suggestions. This delay helps control how quickly the suggestions appear, allowing for smoother user experience and reducing unnecessary searches as the user types. */
|
|
104
104
|
get autoCompleteDelay() {
|
|
105
105
|
return this.nativeElement ? this.nativeElement.autoCompleteDelay : undefined;
|
|
106
106
|
}
|
|
107
107
|
set autoCompleteDelay(value) {
|
|
108
108
|
this.nativeElement ? this.nativeElement.autoCompleteDelay = value : undefined;
|
|
109
109
|
}
|
|
110
|
-
/** @description
|
|
110
|
+
/** @description Enables users to specify one or more custom key names that will trigger the opening of the popup when pressed. This allows for flexible keyboard shortcuts tailored to user preferences or application requirements. */
|
|
111
111
|
get autoOpenShortcutKey() {
|
|
112
112
|
return this.nativeElement ? this.nativeElement.autoOpenShortcutKey : undefined;
|
|
113
113
|
}
|
|
114
114
|
set autoOpenShortcutKey(value) {
|
|
115
115
|
this.nativeElement ? this.nativeElement.autoOpenShortcutKey = value : undefined;
|
|
116
116
|
}
|
|
117
|
-
/** @description
|
|
117
|
+
/** @description Specifies the source of data to populate the ComboBox. The dataSource can be provided in several formats:- An array of strings or numbers, where each item becomes a selectable option in the ComboBox.- An array of objects, where each object represents a list item and its properties define the displayed information and associated value (e.g., label for display text, value for the underlying value, and optionally group to categorize items).- A callback function that returns an array of items in either of the above formats, enabling dynamic or asynchronous data loading.This flexible dataSource configuration allows the ComboBox to support simple lists, categorized lists, or dynamically retrieved data. */
|
|
118
118
|
get dataSource() {
|
|
119
119
|
return this.nativeElement ? this.nativeElement.dataSource : undefined;
|
|
120
120
|
}
|
|
121
121
|
set dataSource(value) {
|
|
122
122
|
this.nativeElement ? this.nativeElement.dataSource = value : undefined;
|
|
123
123
|
}
|
|
124
|
-
/** @description
|
|
124
|
+
/** @description Controls whether the combo box is active or inactive. When enabled, users can interact with the combo box to select or enter a value. When disabled, the combo box is non-interactive and appears grayed out, preventing any user input or selection. */
|
|
125
125
|
get disabled() {
|
|
126
126
|
return this.nativeElement ? this.nativeElement.disabled : undefined;
|
|
127
127
|
}
|
|
128
128
|
set disabled(value) {
|
|
129
129
|
this.nativeElement ? this.nativeElement.disabled = value : undefined;
|
|
130
130
|
}
|
|
131
|
-
/** @description
|
|
131
|
+
/** @description Specifies whether a visual indicator (such as a loading spinner or progress bar) will be displayed while filtering data locally or when retrieving items from a remote source. This helps inform users that a filtering operation or data fetch is in progress. */
|
|
132
132
|
get displayLoadingIndicator() {
|
|
133
133
|
return this.nativeElement ? this.nativeElement.displayLoadingIndicator : undefined;
|
|
134
134
|
}
|
|
135
135
|
set displayLoadingIndicator(value) {
|
|
136
136
|
this.nativeElement ? this.nativeElement.displayLoadingIndicator = value : undefined;
|
|
137
137
|
}
|
|
138
|
-
/** @description Sets or
|
|
138
|
+
/** @description Sets or retrieves the displayMember property. The displayMember property defines the specific field name within each data object in the collection provided by the 'dataSource' property. This field's value is used for displaying items in the UI component, allowing you to control which attribute of your data objects is shown to the user. */
|
|
139
139
|
get displayMember() {
|
|
140
140
|
return this.nativeElement ? this.nativeElement.displayMember : undefined;
|
|
141
141
|
}
|
|
142
142
|
set displayMember(value) {
|
|
143
143
|
this.nativeElement ? this.nativeElement.displayMember = value : undefined;
|
|
144
144
|
}
|
|
145
|
-
/** @description
|
|
145
|
+
/** @description Specifies the parent container for the dropdown element. The dropDownAppendTo property accepts a CSS selector string, an element's ID, the string value 'body', or a direct reference to an HTML element. By default, the dropdown is appended to its original parent in the DOM. However, if one of the containing elements has CSS properties (such as overflow: hidden) that restrict the dropdown's visibility, you can set this property—commonly to 'body'—to append the dropdown directly to the <body> element and ensure it displays properly.Possible values:- A CSS selector string (e.g., '.container' or '#mainDiv')- The string 'body'- A direct reference to an existing HTML element- An element's ID (as a string)- null (to reset and move the dropdown back to its original parent)This property improves compatibility in layouts with restricted overflow by allowing the dropdown to be rendered in a container of your choosing. Resetting dropDownAppendTo to null restores the dropdown to its initial placement within the DOM. */
|
|
146
146
|
get dropDownAppendTo() {
|
|
147
147
|
return this.nativeElement ? this.nativeElement.dropDownAppendTo : undefined;
|
|
148
148
|
}
|
|
149
149
|
set dropDownAppendTo(value) {
|
|
150
150
|
this.nativeElement ? this.nativeElement.dropDownAppendTo = value : undefined;
|
|
151
151
|
}
|
|
152
|
-
/** @description
|
|
152
|
+
/** @description Specifies the location of the dropdown button relative to its associated input field or container. Possible positions may include "left," "right," "top," or "bottom," allowing developers to control where the dropdown button appears in the user interface. */
|
|
153
153
|
get dropDownButtonPosition() {
|
|
154
154
|
return this.nativeElement ? this.nativeElement.dropDownButtonPosition : undefined;
|
|
155
155
|
}
|
|
156
156
|
set dropDownButtonPosition(value) {
|
|
157
157
|
this.nativeElement ? this.nativeElement.dropDownButtonPosition = value : undefined;
|
|
158
158
|
}
|
|
159
|
-
/** @description
|
|
159
|
+
/** @description Specifies the height of the dropdown menu. By default, this property is set to an empty string, which means the dropdown’s height will be determined by the corresponding CSS variable. If a specific value is provided, it will override the CSS variable and set the dropdown height explicitly. */
|
|
160
160
|
get dropDownHeight() {
|
|
161
161
|
return this.nativeElement ? this.nativeElement.dropDownHeight : undefined;
|
|
162
162
|
}
|
|
163
163
|
set dropDownHeight(value) {
|
|
164
164
|
this.nativeElement ? this.nativeElement.dropDownHeight = value : undefined;
|
|
165
165
|
}
|
|
166
|
-
/** @description
|
|
166
|
+
/** @description Specifies the maximum height of the dropdown menu. By default, this value is set to an empty string, which means the dropdown's max-height will be controlled by a CSS variable instead of an explicit value. If you provide a specific value (e.g., "300px" or "50vh"), it will override the default CSS variable and directly set the maximum height of the dropdown. */
|
|
167
167
|
get dropDownMaxHeight() {
|
|
168
168
|
return this.nativeElement ? this.nativeElement.dropDownMaxHeight : undefined;
|
|
169
169
|
}
|
|
170
170
|
set dropDownMaxHeight(value) {
|
|
171
171
|
this.nativeElement ? this.nativeElement.dropDownMaxHeight = value : undefined;
|
|
172
172
|
}
|
|
173
|
-
/** @description
|
|
173
|
+
/** @description Defines the maximum width of the dropdown menu. By default, this value is set to an empty string, which means the dropdown's maximum width will be determined by a corresponding CSS variable. If a specific value is provided (e.g., "300px" or "50%"), it will override the CSS variable and directly set the maximum width of the dropdown. */
|
|
174
174
|
get dropDownMaxWidth() {
|
|
175
175
|
return this.nativeElement ? this.nativeElement.dropDownMaxWidth : undefined;
|
|
176
176
|
}
|
|
177
177
|
set dropDownMaxWidth(value) {
|
|
178
178
|
this.nativeElement ? this.nativeElement.dropDownMaxWidth = value : undefined;
|
|
179
179
|
}
|
|
180
|
-
/** @description
|
|
180
|
+
/** @description Defines the minimum height of the dropdown component. By default, this property is set to an empty string, which means the dropdown's minimum height is determined by a corresponding CSS variable. If a specific value is provided for this property, it will override the CSS variable and explicitly set the dropdown's minimum height. */
|
|
181
181
|
get dropDownMinHeight() {
|
|
182
182
|
return this.nativeElement ? this.nativeElement.dropDownMinHeight : undefined;
|
|
183
183
|
}
|
|
184
184
|
set dropDownMinHeight(value) {
|
|
185
185
|
this.nativeElement ? this.nativeElement.dropDownMinHeight = value : undefined;
|
|
186
186
|
}
|
|
187
|
-
/** @description
|
|
187
|
+
/** @description Specifies the minimum width of the dropdown component. By default, this property is set to an empty string (""). When left unset, the dropdown’s minimum width is determined by a CSS variable, allowing for flexible styling through external stylesheets. To override the CSS value, assign a specific width value (e.g., "200px" or "10rem") to this property. */
|
|
188
188
|
get dropDownMinWidth() {
|
|
189
189
|
return this.nativeElement ? this.nativeElement.dropDownMinWidth : undefined;
|
|
190
190
|
}
|
|
191
191
|
set dropDownMinWidth(value) {
|
|
192
192
|
this.nativeElement ? this.nativeElement.dropDownMinWidth = value : undefined;
|
|
193
193
|
}
|
|
194
|
-
/** @description
|
|
194
|
+
/** @description Specifies the direction or animation in which the dropdown menu will appear when activated, such as opening upwards, downwards, or with a specific transition effect. */
|
|
195
195
|
get dropDownOpenMode() {
|
|
196
196
|
return this.nativeElement ? this.nativeElement.dropDownOpenMode : undefined;
|
|
197
197
|
}
|
|
198
198
|
set dropDownOpenMode(value) {
|
|
199
199
|
this.nativeElement ? this.nativeElement.dropDownOpenMode = value : undefined;
|
|
200
200
|
}
|
|
201
|
-
/** @description If this property is enabled,
|
|
201
|
+
/** @description If this property is enabled, opening the element's dropdown will insert a transparent overlay between the dropdown and the rest of the document. This overlay covers the entire viewport except for the dropdown itself, capturing all click events outside the dropdown. As a result, any clicks outside the popup will interact with the overlay instead of other elements on the page, allowing you to reliably detect and handle outside clicks (such as to close the dropdown) without unintentionally triggering other DOM elements. */
|
|
202
202
|
get dropDownOverlay() {
|
|
203
203
|
return this.nativeElement ? this.nativeElement.dropDownOverlay : undefined;
|
|
204
204
|
}
|
|
205
205
|
set dropDownOverlay(value) {
|
|
206
206
|
this.nativeElement ? this.nativeElement.dropDownOverlay = value : undefined;
|
|
207
207
|
}
|
|
208
|
-
/** @description
|
|
208
|
+
/** @description Specifies the text or content to be shown in the dropdown as a placeholder when the dropdown contains no selectable items. This placeholder provides guidance or context to the user, indicating that there are currently no available options. */
|
|
209
209
|
get dropDownPlaceholder() {
|
|
210
210
|
return this.nativeElement ? this.nativeElement.dropDownPlaceholder : undefined;
|
|
211
211
|
}
|
|
212
212
|
set dropDownPlaceholder(value) {
|
|
213
213
|
this.nativeElement ? this.nativeElement.dropDownPlaceholder = value : undefined;
|
|
214
214
|
}
|
|
215
|
-
/** @description
|
|
215
|
+
/** @description Specifies the placement of the dropdown menu relative to its trigger element when opened (e.g., above, below, left, or right). This setting controls where the dropdown appears on the screen in relation to the element that activates it. */
|
|
216
216
|
get dropDownPosition() {
|
|
217
217
|
return this.nativeElement ? this.nativeElement.dropDownPosition : undefined;
|
|
218
218
|
}
|
|
219
219
|
set dropDownPosition(value) {
|
|
220
220
|
this.nativeElement ? this.nativeElement.dropDownPosition = value : undefined;
|
|
221
221
|
}
|
|
222
|
-
/** @description
|
|
222
|
+
/** @description Specifies the width of the dropdown menu. By default, this property is set to an empty string, allowing the dropdown's width to be determined by the associated CSS variable (typically via custom properties or theme settings). If a value is provided, it overrides the CSS variable and directly sets the dropdown's width. */
|
|
223
223
|
get dropDownWidth() {
|
|
224
224
|
return this.nativeElement ? this.nativeElement.dropDownWidth : undefined;
|
|
225
225
|
}
|
|
226
226
|
set dropDownWidth(value) {
|
|
227
227
|
this.nativeElement ? this.nativeElement.dropDownWidth = value : undefined;
|
|
228
228
|
}
|
|
229
|
-
/** @description
|
|
229
|
+
/** @description Specifies how the element should respond when the Escape key is pressed by the user. This property allows you to define actions such as closing a modal, dismissing a dialog, or triggering a custom event when the Escape key is detected while the element is focused or active. */
|
|
230
230
|
get escKeyMode() {
|
|
231
231
|
return this.nativeElement ? this.nativeElement.escKeyMode : undefined;
|
|
232
232
|
}
|
|
233
233
|
set escKeyMode(value) {
|
|
234
234
|
this.nativeElement ? this.nativeElement.escKeyMode = value : undefined;
|
|
235
235
|
}
|
|
236
|
-
/** @description
|
|
236
|
+
/** @description Specifies whether the filtering feature is active. When set to true, users can apply filters to narrow down displayed data; when false, filtering options are disabled and all data is shown without restriction. */
|
|
237
237
|
get filterable() {
|
|
238
238
|
return this.nativeElement ? this.nativeElement.filterable : undefined;
|
|
239
239
|
}
|
|
240
240
|
set filterable(value) {
|
|
241
241
|
this.nativeElement ? this.nativeElement.filterable = value : undefined;
|
|
242
242
|
}
|
|
243
|
-
/** @description
|
|
243
|
+
/** @description Specifies the placeholder text displayed inside the dropdown list’s filter input field, guiding users on what to enter when searching or filtering options. */
|
|
244
244
|
get filterInputPlaceholder() {
|
|
245
245
|
return this.nativeElement ? this.nativeElement.filterInputPlaceholder : undefined;
|
|
246
246
|
}
|
|
247
247
|
set filterInputPlaceholder(value) {
|
|
248
248
|
this.nativeElement ? this.nativeElement.filterInputPlaceholder = value : undefined;
|
|
249
249
|
}
|
|
250
|
-
/** @description
|
|
250
|
+
/** @description Specifies the filtering behavior for the Combo Box, controlling how user input is matched against the available options (e.g., contains, starts with, or exact match). This property determines which options are displayed in the dropdown list as the user types. */
|
|
251
251
|
get filterMode() {
|
|
252
252
|
return this.nativeElement ? this.nativeElement.filterMode : undefined;
|
|
253
253
|
}
|
|
254
254
|
set filterMode(value) {
|
|
255
255
|
this.nativeElement ? this.nativeElement.filterMode = value : undefined;
|
|
256
256
|
}
|
|
257
|
-
/** @description
|
|
257
|
+
/** @description When enabled, this option automatically groups the items based on the first letter of each item's value or label. Note: This grouping feature is only available if the dataSource does not already include predefined groups. If the dataSource is already grouped, this setting will have no effect. */
|
|
258
258
|
get grouped() {
|
|
259
259
|
return this.nativeElement ? this.nativeElement.grouped : undefined;
|
|
260
260
|
}
|
|
261
261
|
set grouped(value) {
|
|
262
262
|
this.nativeElement ? this.nativeElement.grouped = value : undefined;
|
|
263
263
|
}
|
|
264
|
-
/** @description
|
|
264
|
+
/** @description Specifies which attribute of the dataSource object should be used to group items in the ListBox. By default, if this property (groupMember) is not set, the ListBox will use the 'group' property from each dataSource item to organize groups. This property is particularly useful when loading data from a JSON file, allowing you to designate a specific property from your data objects to determine the grouping of items—especially if your JSON structure uses a different property name for grouping. */
|
|
265
265
|
get groupMember() {
|
|
266
266
|
return this.nativeElement ? this.nativeElement.groupMember : undefined;
|
|
267
267
|
}
|
|
268
268
|
set groupMember(value) {
|
|
269
269
|
this.nativeElement ? this.nativeElement.groupMember = value : undefined;
|
|
270
270
|
}
|
|
271
|
-
/** @description
|
|
271
|
+
/** @description Displays supplementary helper text beneath the element. This hint is visible exclusively when the element is in focus, providing contextual guidance to users as they interact with the field. */
|
|
272
272
|
get hint() {
|
|
273
273
|
return this.nativeElement ? this.nativeElement.hint : undefined;
|
|
274
274
|
}
|
|
275
275
|
set hint(value) {
|
|
276
276
|
this.nativeElement ? this.nativeElement.hint = value : undefined;
|
|
277
277
|
}
|
|
278
|
-
/** @description
|
|
278
|
+
/** @description Controls whether the horizontal scroll bar is displayed within the dropdown menu when the content exceeds the available width. */
|
|
279
279
|
get horizontalScrollBarVisibility() {
|
|
280
280
|
return this.nativeElement ? this.nativeElement.horizontalScrollBarVisibility : undefined;
|
|
281
281
|
}
|
|
282
282
|
set horizontalScrollBarVisibility(value) {
|
|
283
283
|
this.nativeElement ? this.nativeElement.horizontalScrollBarVisibility = value : undefined;
|
|
284
284
|
}
|
|
285
|
-
/** @description Represents the property name of a List item
|
|
285
|
+
/** @description Represents the property name of a List item whose value will be displayed in the input field when a ListItem is selected. This allows developers to control which property of each item is shown in the input, such as displaying the item's value instead of its label. By default, the label property is used for display. This option is useful when you want to customize the displayed content, for example, to show a unique identifier or value rather than the descriptive label. */
|
|
286
286
|
get inputMember() {
|
|
287
287
|
return this.nativeElement ? this.nativeElement.inputMember : undefined;
|
|
288
288
|
}
|
|
289
289
|
set inputMember(value) {
|
|
290
290
|
this.nativeElement ? this.nativeElement.inputMember = value : undefined;
|
|
291
291
|
}
|
|
292
|
-
/** @description
|
|
292
|
+
/** @description Specifies the expected type of information for the input field and informs the browser about the nature of the data to be entered. This guidance allows user agents (such as browsers and password managers) to determine if they can provide automated assistance—like autofilling relevant values—when the element is used in a form. The value assigned to this property directly maps to the standard HTML autocomplete attribute. Common values include 'on' (enable autocomplete), 'off' (disable autocomplete), 'name' (full name), 'organization' (company or organization), 'email', 'street-address', and many others, as specified by the HTML standard. Using an appropriate value improves user experience, enhances accessibility, and helps maintain privacy and security standards within web forms. */
|
|
293
293
|
get inputPurpose() {
|
|
294
294
|
return this.nativeElement ? this.nativeElement.inputPurpose : undefined;
|
|
295
295
|
}
|
|
296
296
|
set inputPurpose(value) {
|
|
297
297
|
this.nativeElement ? this.nativeElement.inputPurpose = value : undefined;
|
|
298
298
|
}
|
|
299
|
-
/** @description IncrementalSearchDelay property
|
|
299
|
+
/** @description The 'IncrementalSearchDelay' property defines the duration, in milliseconds, to wait after the user stops typing before clearing the previous search query. This timer begins as soon as the user finishes typing. During this delay period, no new search query will be initiated. Only after the specified delay has elapsed will the current search input be cleared, allowing a new search query to be started. This helps to optimize performance and user experience by preventing unnecessary or premature queries while the user is still entering their search terms. */
|
|
300
300
|
get incrementalSearchDelay() {
|
|
301
301
|
return this.nativeElement ? this.nativeElement.incrementalSearchDelay : undefined;
|
|
302
302
|
}
|
|
303
303
|
set incrementalSearchDelay(value) {
|
|
304
304
|
this.nativeElement ? this.nativeElement.incrementalSearchDelay = value : undefined;
|
|
305
305
|
}
|
|
306
|
-
/** @description
|
|
306
|
+
/** @description Configures or retrieves the current mode of incremental search. By default, incremental search is enabled, allowing users to type while the dropdown is focused to quickly filter and highlight matching options. Modifying this setting controls how user input is processed for searching within the dropdown list. */
|
|
307
307
|
get incrementalSearchMode() {
|
|
308
308
|
return this.nativeElement ? this.nativeElement.incrementalSearchMode : undefined;
|
|
309
309
|
}
|
|
310
310
|
set incrementalSearchMode(value) {
|
|
311
311
|
this.nativeElement ? this.nativeElement.incrementalSearchMode = value : undefined;
|
|
312
312
|
}
|
|
313
|
-
/** @description
|
|
313
|
+
/** @description Specifies the height (in pixels) for each list item when rendering the list. This property is only applicable when list virtualization is enabled, as it helps optimize rendering performance by allowing the component to calculate and render only the visible items. */
|
|
314
314
|
get itemHeight() {
|
|
315
315
|
return this.nativeElement ? this.nativeElement.itemHeight : undefined;
|
|
316
316
|
}
|
|
317
317
|
set itemHeight(value) {
|
|
318
318
|
this.nativeElement ? this.nativeElement.itemHeight = value : undefined;
|
|
319
319
|
}
|
|
320
|
-
/** @description
|
|
320
|
+
/** @description Specifies the algorithm used to calculate the width of each item. This setting determines how the width of an item is measured, such as using the item's intrinsic content size, a fixed value, or a percentage of the container. Adjust this parameter to control how item widths are determined within the layout. */
|
|
321
321
|
get itemMeasureMode() {
|
|
322
322
|
return this.nativeElement ? this.nativeElement.itemMeasureMode : undefined;
|
|
323
323
|
}
|
|
324
324
|
set itemMeasureMode(value) {
|
|
325
325
|
this.nativeElement ? this.nativeElement.itemMeasureMode = value : undefined;
|
|
326
326
|
}
|
|
327
|
-
/** @description A getter that returns an array
|
|
327
|
+
/** @description A getter method that retrieves and returns an array containing all list ('') elements currently present within the dropdown menu. This allows you to easily access and manipulate every item displayed in the dropdown. */
|
|
328
328
|
get items() {
|
|
329
329
|
return this.nativeElement ? this.nativeElement.items : undefined;
|
|
330
330
|
}
|
|
331
331
|
set items(value) {
|
|
332
332
|
this.nativeElement ? this.nativeElement.items = value : undefined;
|
|
333
333
|
}
|
|
334
|
-
/** @description The itemTemplate property is a string that
|
|
334
|
+
/** @description The itemTemplate property is a string that specifies the ID of an HTMLTemplateElement present in the DOM. This template is used to define and customize the structure and content of individual list items, allowing developers to control how each item appears when rendered in the list. */
|
|
335
335
|
get itemTemplate() {
|
|
336
336
|
return this.nativeElement ? this.nativeElement.itemTemplate : undefined;
|
|
337
337
|
}
|
|
338
338
|
set itemTemplate(value) {
|
|
339
339
|
this.nativeElement ? this.nativeElement.itemTemplate = value : undefined;
|
|
340
340
|
}
|
|
341
|
-
/** @description
|
|
341
|
+
/** @description Displays a small text label positioned above the element, typically used to provide context, instructions, or additional information to users. */
|
|
342
342
|
get label() {
|
|
343
343
|
return this.nativeElement ? this.nativeElement.label : undefined;
|
|
344
344
|
}
|
|
345
345
|
set label(value) {
|
|
346
346
|
this.nativeElement ? this.nativeElement.label = value : undefined;
|
|
347
347
|
}
|
|
348
|
-
/** @description
|
|
348
|
+
/** @description Specifies the text that appears alongside the loading indicator when the loader is visible and positioned at the top or bottom of the component. This text provides users with contextual information or status updates during loading. */
|
|
349
349
|
get loadingIndicatorPlaceholder() {
|
|
350
350
|
return this.nativeElement ? this.nativeElement.loadingIndicatorPlaceholder : undefined;
|
|
351
351
|
}
|
|
352
352
|
set loadingIndicatorPlaceholder(value) {
|
|
353
353
|
this.nativeElement ? this.nativeElement.loadingIndicatorPlaceholder = value : undefined;
|
|
354
354
|
}
|
|
355
|
-
/** @description
|
|
355
|
+
/** @description Specifies the exact location on the user interface where the loading indicator will be displayed, such as at the top, center, or bottom of the screen or component. */
|
|
356
356
|
get loadingIndicatorPosition() {
|
|
357
357
|
return this.nativeElement ? this.nativeElement.loadingIndicatorPosition : undefined;
|
|
358
358
|
}
|
|
359
359
|
set loadingIndicatorPosition(value) {
|
|
360
360
|
this.nativeElement ? this.nativeElement.loadingIndicatorPosition = value : undefined;
|
|
361
361
|
}
|
|
362
|
-
/** @description Sets or
|
|
362
|
+
/** @description Sets or retrieves the unlockKey, a unique value required to grant access to the product’s premium features or activate its full functionality. */
|
|
363
|
+
get unlockKey() {
|
|
364
|
+
return this.nativeElement ? this.nativeElement.unlockKey : undefined;
|
|
365
|
+
}
|
|
366
|
+
set unlockKey(value) {
|
|
367
|
+
this.nativeElement ? this.nativeElement.unlockKey = value : undefined;
|
|
368
|
+
}
|
|
369
|
+
/** @description Specifies or retrieves the current language setting for the component. This property determines which language is used when displaying content from the messages property, allowing for localization and internationalization of displayed messages. Set this property to a supported language code (e.g., "en", "fr") to load the corresponding translations from the messages object. */
|
|
363
370
|
get locale() {
|
|
364
371
|
return this.nativeElement ? this.nativeElement.locale : undefined;
|
|
365
372
|
}
|
|
366
373
|
set locale(value) {
|
|
367
374
|
this.nativeElement ? this.nativeElement.locale = value : undefined;
|
|
368
375
|
}
|
|
369
|
-
/** @description
|
|
376
|
+
/** @description A callback function that allows you to customize the formatting of messages returned by the Localization Module. Use this callback to modify message text, apply dynamic values, or implement custom formatting logic before the localized messages are delivered to your application. */
|
|
370
377
|
get localizeFormatFunction() {
|
|
371
378
|
return this.nativeElement ? this.nativeElement.localizeFormatFunction : undefined;
|
|
372
379
|
}
|
|
373
380
|
set localizeFormatFunction(value) {
|
|
374
381
|
this.nativeElement ? this.nativeElement.localizeFormatFunction = value : undefined;
|
|
375
382
|
}
|
|
376
|
-
/** @description
|
|
383
|
+
/** @description Specifies or retrieves an object containing localized string values used within the widget’s user interface. This property enables the customization and translation of UI text for different languages or regions. It is intended to be used together with the locale property, allowing you to easily provide or update localized strings according to the selected locale. */
|
|
377
384
|
get messages() {
|
|
378
385
|
return this.nativeElement ? this.nativeElement.messages : undefined;
|
|
379
386
|
}
|
|
380
387
|
set messages(value) {
|
|
381
388
|
this.nativeElement ? this.nativeElement.messages = value : undefined;
|
|
382
389
|
}
|
|
383
|
-
/** @description
|
|
390
|
+
/** @description Specifies the minimum number of characters a user must enter in the input field before the autocomplete feature is activated and suggestions are displayed. */
|
|
384
391
|
get minLength() {
|
|
385
392
|
return this.nativeElement ? this.nativeElement.minLength : undefined;
|
|
386
393
|
}
|
|
387
394
|
set minLength(value) {
|
|
388
395
|
this.nativeElement ? this.nativeElement.minLength = value : undefined;
|
|
389
396
|
}
|
|
390
|
-
/** @description
|
|
397
|
+
/** @description Specifies the maximum number of characters that can be entered into the input field. Any additional characters beyond this limit will not be accepted. This helps enforce data validation and consistency for user input. */
|
|
391
398
|
get maxLength() {
|
|
392
399
|
return this.nativeElement ? this.nativeElement.maxLength : undefined;
|
|
393
400
|
}
|
|
394
401
|
set maxLength(value) {
|
|
395
402
|
this.nativeElement ? this.nativeElement.maxLength = value : undefined;
|
|
396
403
|
}
|
|
397
|
-
/** @description Sets or
|
|
404
|
+
/** @description Sets or retrieves the value of the element's name attribute. The name attribute uniquely identifies form elements when submitting HTML forms, allowing the form data to be organized and accessed by name on the server side. This attribute is essential for grouping form controls and accurately transmitting user input during form submission. */
|
|
398
405
|
get name() {
|
|
399
406
|
return this.nativeElement ? this.nativeElement.name : undefined;
|
|
400
407
|
}
|
|
401
408
|
set name(value) {
|
|
402
409
|
this.nativeElement ? this.nativeElement.name = value : undefined;
|
|
403
410
|
}
|
|
404
|
-
/** @description
|
|
411
|
+
/** @description Specifies whether the popup is currently visible (open) or hidden (closed) in the user interface. */
|
|
405
412
|
get opened() {
|
|
406
413
|
return this.nativeElement ? this.nativeElement.opened : undefined;
|
|
407
414
|
}
|
|
408
415
|
set opened(value) {
|
|
409
416
|
this.nativeElement ? this.nativeElement.opened = value : undefined;
|
|
410
417
|
}
|
|
411
|
-
/** @description
|
|
418
|
+
/** @description Specifies the placeholder text that appears inside the input field when it is empty, providing guidance or example content to the user. */
|
|
412
419
|
get placeholder() {
|
|
413
420
|
return this.nativeElement ? this.nativeElement.placeholder : undefined;
|
|
414
421
|
}
|
|
415
422
|
set placeholder(value) {
|
|
416
423
|
this.nativeElement ? this.nativeElement.placeholder = value : undefined;
|
|
417
424
|
}
|
|
418
|
-
/** @description
|
|
425
|
+
/** @description Prevents any user interactions with the element, including clicking, tapping, selecting, hovering, or focusing. While this is enabled, the element will not respond to mouse, keyboard, or touch events, effectively making it non-interactive for users. */
|
|
419
426
|
get readonly() {
|
|
420
427
|
return this.nativeElement ? this.nativeElement.readonly : undefined;
|
|
421
428
|
}
|
|
422
429
|
set readonly(value) {
|
|
423
430
|
this.nativeElement ? this.nativeElement.readonly = value : undefined;
|
|
424
431
|
}
|
|
425
|
-
/** @description
|
|
432
|
+
/** @description Specifies or retrieves a value that determines whether the element’s text direction is set to support right-to-left (RTL) languages, such as Arabic or Hebrew. When enabled, the element and its content are aligned according to RTL formatting, ensuring proper display for locales that use right-to-left scripts. */
|
|
426
433
|
get rightToLeft() {
|
|
427
434
|
return this.nativeElement ? this.nativeElement.rightToLeft : undefined;
|
|
428
435
|
}
|
|
429
436
|
set rightToLeft(value) {
|
|
430
437
|
this.nativeElement ? this.nativeElement.rightToLeft = value : undefined;
|
|
431
438
|
}
|
|
432
|
-
/** @description
|
|
439
|
+
/** @description Controls the visibility of the resize indicator located in the bottom-right corner of the dropdown component. When this property is set to true, users will see a handle allowing them to resize the dropdown area. This property should be used together with the resizeMode property to define both the availability and behavior of the resizing feature. */
|
|
433
440
|
get resizeIndicator() {
|
|
434
441
|
return this.nativeElement ? this.nativeElement.resizeIndicator : undefined;
|
|
435
442
|
}
|
|
436
443
|
set resizeIndicator(value) {
|
|
437
444
|
this.nativeElement ? this.nativeElement.resizeIndicator = value : undefined;
|
|
438
445
|
}
|
|
439
|
-
/** @description
|
|
446
|
+
/** @description Specifies whether the drop-down menu is resizable by the user. If resizing is enabled, a resize bar will be displayed along the top or bottom edge of the drop-down, allowing users to click and drag to adjust its height. Disabling this option removes the resize bar and prevents any manual resizing of the drop-down component. */
|
|
440
447
|
get resizeMode() {
|
|
441
448
|
return this.nativeElement ? this.nativeElement.resizeMode : undefined;
|
|
442
449
|
}
|
|
443
450
|
set resizeMode(value) {
|
|
444
451
|
this.nativeElement ? this.nativeElement.resizeMode = value : undefined;
|
|
445
452
|
}
|
|
446
|
-
/** @description
|
|
453
|
+
/** @description Specifies the content or value that will appear within the input field, either as a default value, user-entered data, or dynamically generated content. This setting controls what the user sees and interacts with inside the input element. */
|
|
447
454
|
get selectionDisplayMode() {
|
|
448
455
|
return this.nativeElement ? this.nativeElement.selectionDisplayMode : undefined;
|
|
449
456
|
}
|
|
450
457
|
set selectionDisplayMode(value) {
|
|
451
458
|
this.nativeElement ? this.nativeElement.selectionDisplayMode = value : undefined;
|
|
452
459
|
}
|
|
453
|
-
/** @description Sets or
|
|
460
|
+
/** @description Sets or retrieves the selected indexes. The selected indexes property is an array containing the numeric indexes of the items that are currently selected. Each value in the array corresponds to the position of a selected item within the overall list or collection. Assigning a new array to this property updates the selection state to match the specified indexes; retrieving it returns the current selection as an array of indexes. */
|
|
454
461
|
get selectedIndexes() {
|
|
455
462
|
return this.nativeElement ? this.nativeElement.selectedIndexes : undefined;
|
|
456
463
|
}
|
|
457
464
|
set selectedIndexes(value) {
|
|
458
465
|
this.nativeElement ? this.nativeElement.selectedIndexes = value : undefined;
|
|
459
466
|
}
|
|
460
|
-
/** @description
|
|
467
|
+
/** @description "Sets or retrieves the currently selected indexes. The 'selected' property holds an array of the indices corresponding to the items that are marked as selected. When setting this property, provide an array of indexes to specify which items should be selected. When getting this property, it returns the array of indexes for the currently selected items." */
|
|
461
468
|
get selectedValues() {
|
|
462
469
|
return this.nativeElement ? this.nativeElement.selectedValues : undefined;
|
|
463
470
|
}
|
|
464
471
|
set selectedValues(value) {
|
|
465
472
|
this.nativeElement ? this.nativeElement.selectedValues = value : undefined;
|
|
466
473
|
}
|
|
467
|
-
/** @description
|
|
474
|
+
/** @description Specifies the maximum number of items that a user is allowed to select at one time. If this value is set to 1, only single selection is permitted; higher values allow multiple selections up to the defined limit. */
|
|
468
475
|
get selectionMode() {
|
|
469
476
|
return this.nativeElement ? this.nativeElement.selectionMode : undefined;
|
|
470
477
|
}
|
|
471
478
|
set selectionMode(value) {
|
|
472
479
|
this.nativeElement ? this.nativeElement.selectionMode = value : undefined;
|
|
473
480
|
}
|
|
474
|
-
/** @description
|
|
481
|
+
/** @description Specifies whether the items are arranged in alphabetical order. If set to true, the items will be sorted alphabetically; if false, the original order will be preserved. */
|
|
475
482
|
get sorted() {
|
|
476
483
|
return this.nativeElement ? this.nativeElement.sorted : undefined;
|
|
477
484
|
}
|
|
478
485
|
set sorted(value) {
|
|
479
486
|
this.nativeElement ? this.nativeElement.sorted = value : undefined;
|
|
480
487
|
}
|
|
481
|
-
/** @description
|
|
488
|
+
/** @description Specifies the sorting order for data, allowing you to choose between ascending ("asc") for lowest-to-highest or alphabetical A–Z sorting, and descending ("desc") for highest-to-lowest or Z–A sorting. */
|
|
482
489
|
get sortDirection() {
|
|
483
490
|
return this.nativeElement ? this.nativeElement.sortDirection : undefined;
|
|
484
491
|
}
|
|
485
492
|
set sortDirection(value) {
|
|
486
493
|
this.nativeElement ? this.nativeElement.sortDirection = value : undefined;
|
|
487
494
|
}
|
|
488
|
-
/** @description
|
|
495
|
+
/** @description Specifies the visual theme to be applied to the element. The selected theme controls the element’s appearance, including colors, fonts, and other stylistic properties, ensuring a consistent look and feel across the user interface. */
|
|
489
496
|
get theme() {
|
|
490
497
|
return this.nativeElement ? this.nativeElement.theme : undefined;
|
|
491
498
|
}
|
|
492
499
|
set theme(value) {
|
|
493
500
|
this.nativeElement ? this.nativeElement.theme = value : undefined;
|
|
494
501
|
}
|
|
495
|
-
/** @description
|
|
502
|
+
/** @description Defines the custom content to display within each token when the selectionDisplayMode is set to "tokens". Tokens visually represent selected items in a multi-select interface and are only applicable when multiple selection is enabled. Use this option to customize how each token appears, such as displaying specific text, icons, or additional data for each selected item. */
|
|
496
503
|
get tokenTemplate() {
|
|
497
504
|
return this.nativeElement ? this.nativeElement.tokenTemplate : undefined;
|
|
498
505
|
}
|
|
499
506
|
set tokenTemplate(value) {
|
|
500
507
|
this.nativeElement ? this.nativeElement.tokenTemplate = value : undefined;
|
|
501
508
|
}
|
|
502
|
-
/** @description If
|
|
509
|
+
/** @description If set to true, the element will not be able to receive keyboard or mouse focus, making it inaccessible via tab navigation or programmatic focus methods. */
|
|
503
510
|
get unfocusable() {
|
|
504
511
|
return this.nativeElement ? this.nativeElement.unfocusable : undefined;
|
|
505
512
|
}
|
|
506
513
|
set unfocusable(value) {
|
|
507
514
|
this.nativeElement ? this.nativeElement.unfocusable = value : undefined;
|
|
508
515
|
}
|
|
509
|
-
/** @description
|
|
516
|
+
/** @description Provides functionality to retrieve (get) or assign (set) the current value of the property. When used as a getter, it returns the property's current value. When used as a setter, it updates the property with the specified value. */
|
|
510
517
|
get value() {
|
|
511
518
|
return this.nativeElement ? this.nativeElement.value : undefined;
|
|
512
519
|
}
|
|
513
520
|
set value(value) {
|
|
514
521
|
this.nativeElement ? this.nativeElement.value = value : undefined;
|
|
515
522
|
}
|
|
516
|
-
/** @description
|
|
523
|
+
/** @description Specifies which property of each item object should be used as the value for that item. The value designated by valueMember will be stored in the item's value field. This property functions similarly to groupMember, but is focused on identifying the value rather than the group. valueMember is particularly useful when populating a ListBox from a JSON data source, as it allows you to specify which property of your data objects should serve as the unique value for each item in the ListBox. */
|
|
517
524
|
get valueMember() {
|
|
518
525
|
return this.nativeElement ? this.nativeElement.valueMember : undefined;
|
|
519
526
|
}
|
|
520
527
|
set valueMember(value) {
|
|
521
528
|
this.nativeElement ? this.nativeElement.valueMember = value : undefined;
|
|
522
529
|
}
|
|
523
|
-
/** @description
|
|
530
|
+
/** @description Controls whether the vertical scroll bar is displayed within the content area, allowing users to scroll vertically when the content extends beyond the visible region. */
|
|
524
531
|
get verticalScrollBarVisibility() {
|
|
525
532
|
return this.nativeElement ? this.nativeElement.verticalScrollBarVisibility : undefined;
|
|
526
533
|
}
|
|
527
534
|
set verticalScrollBarVisibility(value) {
|
|
528
535
|
this.nativeElement ? this.nativeElement.verticalScrollBarVisibility = value : undefined;
|
|
529
536
|
}
|
|
530
|
-
/** @description Determines
|
|
537
|
+
/** @description Determines whether virtualization is enabled for the ComboBox. When virtualization is enabled, the ComboBox can efficiently display a very large number of items—such as a million—by only rendering the visible items in the ListBox and dynamically loading items as needed. This significantly improves performance and reduces memory usage, especially with large data sets. */
|
|
531
538
|
get virtualized() {
|
|
532
539
|
return this.nativeElement ? this.nativeElement.virtualized : undefined;
|
|
533
540
|
}
|
|
534
541
|
set virtualized(value) {
|
|
535
542
|
this.nativeElement ? this.nativeElement.virtualized = value : undefined;
|
|
536
543
|
}
|
|
537
|
-
/** @description Appends a ListItem to the end of the list of items
|
|
544
|
+
/** @description Appends a new ListItem element to the end of the existing list of items within the specified container element, thereby updating the list to include the newly added item as its last entry.
|
|
538
545
|
* @param {Node} node. A ListItem element that should be added to the rest of the items as the last item.
|
|
539
546
|
* @returns {Node}
|
|
540
547
|
*/
|
|
@@ -550,7 +557,13 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
550
557
|
const result = await getResultOnRender();
|
|
551
558
|
return result;
|
|
552
559
|
}
|
|
553
|
-
|
|
560
|
+
appendChildSync(node) {
|
|
561
|
+
if (this.nativeElement.isRendered) {
|
|
562
|
+
return this.nativeElement.appendChild(node);
|
|
563
|
+
}
|
|
564
|
+
return null;
|
|
565
|
+
}
|
|
566
|
+
/** @description Creates and appends one or more new items to the collection or list.
|
|
554
567
|
* @param {any} item. Describes the properties of the item that will be inserted. You can also pass an array of items.
|
|
555
568
|
*/
|
|
556
569
|
add(item) {
|
|
@@ -563,7 +576,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
563
576
|
});
|
|
564
577
|
}
|
|
565
578
|
}
|
|
566
|
-
/** @description Removes all items from the
|
|
579
|
+
/** @description Removes all existing items from the dropdown list, resulting in an empty list with no selectable options displayed to the user.
|
|
567
580
|
*/
|
|
568
581
|
clearItems() {
|
|
569
582
|
if (this.nativeElement.isRendered) {
|
|
@@ -575,7 +588,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
575
588
|
});
|
|
576
589
|
}
|
|
577
590
|
}
|
|
578
|
-
/** @description
|
|
591
|
+
/** @description Deselects all currently selected items, ensuring that no items remain selected. This action clears any existing selections and resets the selection state.
|
|
579
592
|
*/
|
|
580
593
|
clearSelection() {
|
|
581
594
|
if (this.nativeElement.isRendered) {
|
|
@@ -587,7 +600,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
587
600
|
});
|
|
588
601
|
}
|
|
589
602
|
}
|
|
590
|
-
/** @description Closes the
|
|
603
|
+
/** @description Closes the currently open drop-down list, hiding all available options from view and returning the component to its collapsed state. This action ensures that the drop-down menu is no longer visible to the user.
|
|
591
604
|
*/
|
|
592
605
|
close() {
|
|
593
606
|
if (this.nativeElement.isRendered) {
|
|
@@ -599,7 +612,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
599
612
|
});
|
|
600
613
|
}
|
|
601
614
|
}
|
|
602
|
-
/** @description
|
|
615
|
+
/** @description Initiates a data binding process, connecting UI components to the underlying data source. This method refreshes the data source, ensuring that any changes made to the data are reflected in the user interface. It can be used to update displayed information after modifying, adding, or deleting data.
|
|
603
616
|
*/
|
|
604
617
|
dataBind() {
|
|
605
618
|
if (this.nativeElement.isRendered) {
|
|
@@ -611,7 +624,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
611
624
|
});
|
|
612
625
|
}
|
|
613
626
|
}
|
|
614
|
-
/** @description
|
|
627
|
+
/** @description Scrolls the target item into view within its container, automatically adjusting the scroll position as needed to make sure the entire item is fully visible to the user.
|
|
615
628
|
* @param {HTMLElement | string} item. A list item or value of the desired item to be visible.
|
|
616
629
|
*/
|
|
617
630
|
ensureVisible(item) {
|
|
@@ -624,7 +637,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
624
637
|
});
|
|
625
638
|
}
|
|
626
639
|
}
|
|
627
|
-
/** @description Returns
|
|
640
|
+
/** @description Returns a specific item instance from the dropDown list, allowing you to access the properties and methods of the selected list item. This can be used to retrieve information about the item, such as its value, label, or index within the dropDown.
|
|
628
641
|
* @param {string} value. The value of an item from the drop down list.
|
|
629
642
|
* @returns {HTMLElement}
|
|
630
643
|
*/
|
|
@@ -640,7 +653,13 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
640
653
|
const result = await getResultOnRender();
|
|
641
654
|
return result;
|
|
642
655
|
}
|
|
643
|
-
|
|
656
|
+
getItemSync(value) {
|
|
657
|
+
if (this.nativeElement.isRendered) {
|
|
658
|
+
return this.nativeElement.getItem(value);
|
|
659
|
+
}
|
|
660
|
+
return null;
|
|
661
|
+
}
|
|
662
|
+
/** @description Inserts a new item into the array at the specified index position, shifting existing elements to the right to accommodate the new item.
|
|
644
663
|
* @param {number} position. The position where the item must be inserted.
|
|
645
664
|
* @param {any} item. Describes the properties of the item that will be inserted. You can also pass an array of items.
|
|
646
665
|
*/
|
|
@@ -654,7 +673,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
654
673
|
});
|
|
655
674
|
}
|
|
656
675
|
}
|
|
657
|
-
/** @description Inserts a new ListItem before
|
|
676
|
+
/** @description Inserts a new ListItem element directly before a specified existing ListItem within the list, preserving the order of the remaining items.
|
|
658
677
|
* @param {Node} node. A ListItem element that should be added before the referenceItem in the list.
|
|
659
678
|
* @param {Node | null} referenceNode. A ListItem element that acts as the reference item before which a new item is about to be inserted. The referenceNode must be in the same list as the node.
|
|
660
679
|
* @returns {Node}
|
|
@@ -671,7 +690,13 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
671
690
|
const result = await getResultOnRender();
|
|
672
691
|
return result;
|
|
673
692
|
}
|
|
674
|
-
|
|
693
|
+
insertBeforeSync(node, referenceNode) {
|
|
694
|
+
if (this.nativeElement.isRendered) {
|
|
695
|
+
return this.nativeElement.insertBefore(node, referenceNode);
|
|
696
|
+
}
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
699
|
+
/** @description Displays and expands the drop-down list, making all available options visible for selection.
|
|
675
700
|
*/
|
|
676
701
|
open() {
|
|
677
702
|
if (this.nativeElement.isRendered) {
|
|
@@ -683,7 +708,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
683
708
|
});
|
|
684
709
|
}
|
|
685
710
|
}
|
|
686
|
-
/** @description Removes
|
|
711
|
+
/** @description Removes the item located at the specified index or position within a collection (such as an array or list). After removal, the collection is updated so that subsequent items shift to fill the gap, ensuring contiguous indexing.
|
|
687
712
|
* @param {number} position. The position of the removed item.
|
|
688
713
|
*/
|
|
689
714
|
removeAt(position) {
|
|
@@ -696,7 +721,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
696
721
|
});
|
|
697
722
|
}
|
|
698
723
|
}
|
|
699
|
-
/** @description Removes a ListItem from the
|
|
724
|
+
/** @description Removes a specified ListItem from the collection of items contained within the given element, updating the list to reflect the deletion.
|
|
700
725
|
* @param {Node} node. A ListItem element that is part of the list of items inside the element.
|
|
701
726
|
* @returns {Node}
|
|
702
727
|
*/
|
|
@@ -712,7 +737,13 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
712
737
|
const result = await getResultOnRender();
|
|
713
738
|
return result;
|
|
714
739
|
}
|
|
715
|
-
|
|
740
|
+
removeChildSync(node) {
|
|
741
|
+
if (this.nativeElement.isRendered) {
|
|
742
|
+
return this.nativeElement.removeChild(node);
|
|
743
|
+
}
|
|
744
|
+
return null;
|
|
745
|
+
}
|
|
746
|
+
/** @description Selects a specified item from the dropdown list, allowing users to choose one option from the available choices. This action updates the dropdown’s current selection and can trigger any associated event handlers or changes in the application’s state.
|
|
716
747
|
* @param {string | HTMLElement} item. A string, representing the value of the item or an HTML Element referencing an item from the list
|
|
717
748
|
*/
|
|
718
749
|
select(item) {
|
|
@@ -725,7 +756,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
725
756
|
});
|
|
726
757
|
}
|
|
727
758
|
}
|
|
728
|
-
/** @description
|
|
759
|
+
/** @description Deselects a specified item from the dropdown list, removing its selected state and reverting the dropdown to reflect that the item is no longer chosen by the user.
|
|
729
760
|
* @param {string | HTMLElement} item. A string, representing the value of the item or an HTML Element referencing an item from the list
|
|
730
761
|
*/
|
|
731
762
|
unselect(item) {
|
|
@@ -738,7 +769,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
738
769
|
});
|
|
739
770
|
}
|
|
740
771
|
}
|
|
741
|
-
/** @description Updates
|
|
772
|
+
/** @description Updates the selected item in the dropDown list with new data or attributes. This action modifies the existing item rather than adding or removing items from the list, ensuring that any changes are reflected immediately in the user interface. Specify the target item and the updated values to complete the operation.
|
|
742
773
|
* @param {number} position. The position where the item must be updated.
|
|
743
774
|
* @param {any} value. The value of the updated item.
|
|
744
775
|
*/
|
|
@@ -760,9 +791,11 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
760
791
|
ngAfterViewInit() {
|
|
761
792
|
const that = this;
|
|
762
793
|
that.onCreate.emit(that.nativeElement);
|
|
763
|
-
Smart
|
|
794
|
+
if (Smart)
|
|
795
|
+
Smart.Render();
|
|
764
796
|
this.nativeElement.classList.add('smart-angular');
|
|
765
|
-
this.nativeElement.whenRendered
|
|
797
|
+
if (this.nativeElement.whenRendered)
|
|
798
|
+
this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });
|
|
766
799
|
this.listen();
|
|
767
800
|
}
|
|
768
801
|
ngOnDestroy() {
|
|
@@ -919,7 +952,7 @@ export class ComboBoxComponent extends BaseElement {
|
|
|
919
952
|
}
|
|
920
953
|
}
|
|
921
954
|
ComboBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ComboBoxComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
922
|
-
ComboBoxComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.6", type: ComboBoxComponent, selector: "smart-combo-box, [smart-combo-box]", inputs: { autoCloseDelay: "autoCloseDelay", autoComplete: "autoComplete", autoCompleteDelay: "autoCompleteDelay", autoOpenShortcutKey: "autoOpenShortcutKey", dataSource: "dataSource", disabled: "disabled", displayLoadingIndicator: "displayLoadingIndicator", displayMember: "displayMember", dropDownAppendTo: "dropDownAppendTo", dropDownButtonPosition: "dropDownButtonPosition", dropDownHeight: "dropDownHeight", dropDownMaxHeight: "dropDownMaxHeight", dropDownMaxWidth: "dropDownMaxWidth", dropDownMinHeight: "dropDownMinHeight", dropDownMinWidth: "dropDownMinWidth", dropDownOpenMode: "dropDownOpenMode", dropDownOverlay: "dropDownOverlay", dropDownPlaceholder: "dropDownPlaceholder", dropDownPosition: "dropDownPosition", dropDownWidth: "dropDownWidth", escKeyMode: "escKeyMode", filterable: "filterable", filterInputPlaceholder: "filterInputPlaceholder", filterMode: "filterMode", grouped: "grouped", groupMember: "groupMember", hint: "hint", horizontalScrollBarVisibility: "horizontalScrollBarVisibility", inputMember: "inputMember", inputPurpose: "inputPurpose", incrementalSearchDelay: "incrementalSearchDelay", incrementalSearchMode: "incrementalSearchMode", itemHeight: "itemHeight", itemMeasureMode: "itemMeasureMode", items: "items", itemTemplate: "itemTemplate", label: "label", loadingIndicatorPlaceholder: "loadingIndicatorPlaceholder", loadingIndicatorPosition: "loadingIndicatorPosition", locale: "locale", localizeFormatFunction: "localizeFormatFunction", messages: "messages", minLength: "minLength", maxLength: "maxLength", name: "name", opened: "opened", placeholder: "placeholder", readonly: "readonly", rightToLeft: "rightToLeft", resizeIndicator: "resizeIndicator", resizeMode: "resizeMode", selectionDisplayMode: "selectionDisplayMode", selectedIndexes: "selectedIndexes", selectedValues: "selectedValues", selectionMode: "selectionMode", sorted: "sorted", sortDirection: "sortDirection", theme: "theme", tokenTemplate: "tokenTemplate", unfocusable: "unfocusable", value: "value", valueMember: "valueMember", verticalScrollBarVisibility: "verticalScrollBarVisibility", virtualized: "virtualized" }, outputs: { onChange: "onChange", onClose: "onClose", onClosing: "onClosing", onItemClick: "onItemClick", onOpen: "onOpen", onOpening: "onOpening", onResizeStart: "onResizeStart", onResizeEnd: "onResizeEnd", onScrollBottomReached: "onScrollBottomReached", onScrollTopReached: "onScrollTopReached", onTokenClick: "onTokenClick" }, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR], exportAs: ["smart-combo-box"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
955
|
+
ComboBoxComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.6", type: ComboBoxComponent, selector: "smart-combo-box, [smart-combo-box]", inputs: { autoCloseDelay: "autoCloseDelay", autoComplete: "autoComplete", autoCompleteDelay: "autoCompleteDelay", autoOpenShortcutKey: "autoOpenShortcutKey", dataSource: "dataSource", disabled: "disabled", displayLoadingIndicator: "displayLoadingIndicator", displayMember: "displayMember", dropDownAppendTo: "dropDownAppendTo", dropDownButtonPosition: "dropDownButtonPosition", dropDownHeight: "dropDownHeight", dropDownMaxHeight: "dropDownMaxHeight", dropDownMaxWidth: "dropDownMaxWidth", dropDownMinHeight: "dropDownMinHeight", dropDownMinWidth: "dropDownMinWidth", dropDownOpenMode: "dropDownOpenMode", dropDownOverlay: "dropDownOverlay", dropDownPlaceholder: "dropDownPlaceholder", dropDownPosition: "dropDownPosition", dropDownWidth: "dropDownWidth", escKeyMode: "escKeyMode", filterable: "filterable", filterInputPlaceholder: "filterInputPlaceholder", filterMode: "filterMode", grouped: "grouped", groupMember: "groupMember", hint: "hint", horizontalScrollBarVisibility: "horizontalScrollBarVisibility", inputMember: "inputMember", inputPurpose: "inputPurpose", incrementalSearchDelay: "incrementalSearchDelay", incrementalSearchMode: "incrementalSearchMode", itemHeight: "itemHeight", itemMeasureMode: "itemMeasureMode", items: "items", itemTemplate: "itemTemplate", label: "label", loadingIndicatorPlaceholder: "loadingIndicatorPlaceholder", loadingIndicatorPosition: "loadingIndicatorPosition", unlockKey: "unlockKey", locale: "locale", localizeFormatFunction: "localizeFormatFunction", messages: "messages", minLength: "minLength", maxLength: "maxLength", name: "name", opened: "opened", placeholder: "placeholder", readonly: "readonly", rightToLeft: "rightToLeft", resizeIndicator: "resizeIndicator", resizeMode: "resizeMode", selectionDisplayMode: "selectionDisplayMode", selectedIndexes: "selectedIndexes", selectedValues: "selectedValues", selectionMode: "selectionMode", sorted: "sorted", sortDirection: "sortDirection", theme: "theme", tokenTemplate: "tokenTemplate", unfocusable: "unfocusable", value: "value", valueMember: "valueMember", verticalScrollBarVisibility: "verticalScrollBarVisibility", virtualized: "virtualized" }, outputs: { onChange: "onChange", onClose: "onClose", onClosing: "onClosing", onItemClick: "onItemClick", onOpen: "onOpen", onOpening: "onOpening", onResizeStart: "onResizeStart", onResizeEnd: "onResizeEnd", onScrollBottomReached: "onScrollBottomReached", onScrollTopReached: "onScrollTopReached", onTokenClick: "onTokenClick" }, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR], exportAs: ["smart-combo-box"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
923
956
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ComboBoxComponent, decorators: [{
|
|
924
957
|
type: Directive,
|
|
925
958
|
args: [{
|
|
@@ -1004,6 +1037,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImpor
|
|
|
1004
1037
|
type: Input
|
|
1005
1038
|
}], loadingIndicatorPosition: [{
|
|
1006
1039
|
type: Input
|
|
1040
|
+
}], unlockKey: [{
|
|
1041
|
+
type: Input
|
|
1007
1042
|
}], locale: [{
|
|
1008
1043
|
type: Input
|
|
1009
1044
|
}], localizeFormatFunction: [{
|
|
@@ -1077,4 +1112,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImpor
|
|
|
1077
1112
|
}], onTokenClick: [{
|
|
1078
1113
|
type: Output
|
|
1079
1114
|
}] } });
|
|
1080
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQuY29tYm9ib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21ib2JveC9zcmMvc21hcnQuY29tYm9ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxVQUFVLEVBQTJCLE1BQU0sRUFBRSxZQUFZLEVBQThCLE1BQU0sZUFBZSxDQUFDO0FBQzNOLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJckQsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUZ6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFVeEMsTUFBTSxtQ0FBbUMsR0FBUTtJQUM3QyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFBO0FBUUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFdBQVc7SUFFakQsWUFBWSxHQUF5QjtRQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFJSixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQWEzQjs7O1VBR0U7UUFDSCxjQUFTLEdBQXlCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMxQzs7O1VBR0U7UUFDSCxlQUFVLEdBQWMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBbWtCdkM7Ozs7Ozs7OztVQVNFO1FBQ1EsYUFBUSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5FOzhDQUNzQztRQUM1QixZQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs7Ozs7OztVQU9FO1FBQ1EsZ0JBQVcsR0FBOEIsSUFBSSxZ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LENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBVTtRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsbUlBQW1JO0lBQ25JLElBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLElBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsNEdBQTRHO0lBQzVHLElBQ0ksSUFBSTtRQUNQLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFD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SSxhQUFhLENBQUMsS0FBVTtRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBYztRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLElBQ0ksS0FBSztRQUNSLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsdVNBQXVTO0lBQ3ZTLElBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6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SztnQkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVVGLFdBQVc7c0JBRGQsS0FBSztnQkFVRixLQUFLO3NCQURSLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVVGLDJCQUEyQjtzQkFEOUIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBa0JJLFFBQVE7c0JBQWpCLE1BQU07Z0JBSUcsT0FBTztzQkFBaEIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNO2dCQVVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsTUFBTTtzQkFBZixNQUFNO2dCQUlHLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUlHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFJRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBSUcsWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbWJvQm94IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGUsIERyb3BEb3duQnV0dG9uUG9zaXRpb24sIERyb3BEb3duT3Blbk1vZGUsIERyb3BEb3duUG9zaXRpb24sIENvbWJvQm94RXNjS2V5TW9kZSwgRmlsdGVyTW9kZSwgSG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHksIFNlYXJjaE1vZGUsIExpc3RJdGVtTWVhc3VyZU1vZGUsIFZlcnRpY2FsQWxpZ25tZW50LCBSZXNpemVNb2RlLCBTZWxlY3Rpb25EaXNwbGF5TW9kZSwgTGlzdFNlbGVjdGlvbk1vZGUsIFZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEaXJlY3RpdmUsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFF1ZXJ5TGlzdCwgQ29udGVudENoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudCwgU21hcnQgfSBmcm9tICcuL3NtYXJ0LmVsZW1lbnQnO1xuZXhwb3J0IHsgQXV0b0NvbXBsZXRlLCBEcm9wRG93bkJ1dHRvblBvc2l0aW9uLCBEcm9wRG93bk9wZW5Nb2RlLCBEcm9wRG93blBvc2l0aW9uLCBDb21ib0JveEVzY0tleU1vZGUsIEZpbHRlck1vZGUsIEhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5LCBTZWFyY2hNb2RlLCBMaXN0SXRlbU1lYXN1cmVNb2RlLCBWZXJ0aWNhbEFsaWdubWVudCwgUmVzaXplTW9kZSwgU2VsZWN0aW9uRGlzcGxheU1vZGUsIExpc3RTZWxlY3Rpb25Nb2RlLCBWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHksIEVsZW1lbnRSZW5kZXJNb2RlfSBmcm9tICcuLy4uL2luZGV4JztcbmV4cG9ydCB7IFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcbmV4cG9ydCB7IENvbWJvQm94IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuXG5pbXBvcnQgeyBMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vc21hcnQubGlzdGl0ZW0nO1xuXG5pbXBvcnQgeyBMaXN0SXRlbXNHcm91cENvbXBvbmVudCB9IGZyb20gJy4vc21hcnQubGlzdGl0ZW1zZ3JvdXAnO1xuXG5jb25zdCBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvQm94Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxufVxuXG5ARGlyZWN0aXZlKHtcblx0ZXhwb3J0QXM6ICdzbWFydC1jb21iby1ib3gnLFx0c2VsZWN0b3I6ICdzbWFydC1jb21iby1ib3gsIFtzbWFydC1jb21iby1ib3hdJyxcblx0cHJvdmlkZXJzOiBbQ1VTVE9NX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG5cbn0pXG5cbmV4cG9ydCBjbGFzcyBDb21ib0JveENvbXBvbmVudCBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG5cdGNvbnN0cnVjdG9yKHJlZjogRWxlbWVudFJlZjxDb21ib0JveD4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIENvbWJvQm94O1xuXHR9XG5cblx0cHJpdmF0ZSBldmVudEhhbmRsZXJzOiBhbnlbXSA9IFtdO1xuXG5cdHB1YmxpYyBkZWNsYXJlIG5hdGl2ZUVsZW1lbnQ6IENvbWJvQm94O1xuXHQvKiogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGNvbXBvbmVudCBvbiBkZW1hbmQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9wdGlvbmFsIG9iamVjdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSBiaW5kZWQgb25lcy5cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVDb21wb25lbnQocHJvcGVydGllcyA9IHt9KTogYW55IHtcbiAgICBcdHRoaXMubmF0aXZlRWxlbWVudCA9IDxDb21ib0JveD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFydC1jb21iby1ib3gnKTtcblx0XHRmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgeyBcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudDtcblx0fVxuICAgICAgICAvKipcbiAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMgb24gdGhlIGZvcm0gZWxlbWVudHMuXG4gICAgICAgICovXG4gICAgICAgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBmb3JtIGVsZW1lbnRzLlxuICAgICAgICAqL1xuICAgICAgIF9vblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xuXG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVc2VkIG9ubHkgd2hlbiBkcm9wRG93bk9wZW5Nb2RlIGlzIHNldCB0byAnYXV0bycuIERldGVybWluZXMgdGhlIGRlbGF5IGJlZm9yZSB0aGUgb3BlbmVkIGRyb3AgZG93biBjbG9zZXMgaWYgdGhlIHBvaW50ZXIgaXMgbm90IG92ZXIgdGhlIGVsZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ2xvc2VEZWxheSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0Nsb3NlRGVsYXkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGF1dG9DbG9zZURlbGF5KHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0Nsb3NlRGVsYXkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgYXV0b2NvbXBsZXRlIG1vZGUuIEF1dG8gY29tcGxldGUgbW9kZXMgZmlsdGVyIHRoZSBpdGVtcyBmcm9tIHRoZSBkYXRhU291cmNlIGFuZCBzaG93IG9ubHkgdGhvc2UgdGhhdCBtYXRjaCB0aGUgaW5wdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ29tcGxldGUoKTogQXV0b0NvbXBsZXRlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9Db21wbGV0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NvbXBsZXRlKHZhbHVlOiBBdXRvQ29tcGxldGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0NvbXBsZXRlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGRlbGF5IGJlZm9yZSB0aGUgZHJvcCBkb3duIG9wZW5zIHRvIHNob3cgdGhlIG1hdGNoZXMgZnJvbSB0aGUgYXV0byBjb21wbGV0ZSBvcGVyYXRpb24uIFRoZSBkZWxheSBpcyBtZWFzdXJlZCBpbiBtaWxpc2Vjb25kcy4gKi9cblx0QElucHV0KClcblx0Z2V0IGF1dG9Db21wbGV0ZURlbGF5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ29tcGxldGVEZWxheSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NvbXBsZXRlRGVsYXkodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ29tcGxldGVEZWxheSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBbGxvd3MgdGhlIHVzZXIgdG8gZGVmaW5lIGEgY3VzdG9tIGtleSBuYW1lICggb3IgbXVsdGlwbGUga2V5IG5hbWVzKSB0byBvcGVuIHRoYXQgcG9wdXAgd2l0aC4gKi9cblx0QElucHV0KClcblx0Z2V0IGF1dG9PcGVuU2hvcnRjdXRLZXkoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b09wZW5TaG9ydGN1dEtleSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b09wZW5TaG9ydGN1dEtleSh2YWx1ZTogc3RyaW5nW10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b09wZW5TaG9ydGN1dEtleSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBkYXRhIHNvdXJjZSB0aGF0IHdpbGwgYmUgbG9hZGVkIHRvIHRoZSBDb21ib0JveC4gVGhlIGRhdGFTb3VyY2UgY2FuIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MvbnVtYmVycyBvciBvYmplY3RzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHJlcHJlc2VudCB0aGUgcHJvcGVydGllcyBvZiBhIExpc3QgSXRlbS4gRm9yIGV4YW1wbGUgbGFiZWwsIHZhbHVlLCBncm91cC4gSXQgY2FuIGFsc28gYmUgYSBjYWxsYmFjayB0aGF0IHJldHVybnMgYW4gQXJyYXkgb2YgaXRlbXMgYXMgcHJldmlvdXNseSBkZXNjcmliZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkYXRhU291cmNlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kYXRhU291cmNlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkYXRhU291cmNlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YVNvdXJjZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBjb21ibyBib3guICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gaW5kaWNhdG9yIHdpbGwgYXBwZWFyIGR1cmluZyBmaWx0ZXJpbmcgYW5kIHJlbW90ZSBpdGVtIGxvYWRpbmcuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNwbGF5TG9hZGluZ0luZGljYXRvcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNwbGF5TG9hZGluZ0luZGljYXRvcih2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNwbGF5TG9hZGluZ0luZGljYXRvciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIGRpc3BsYXlNZW1iZXIuIFRoZSBkaXNwbGF5TWVtYmVyIHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIGRpc3BsYXkuIFRoZSBuYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGUgY29sbGVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlICdkYXRhU291cmNlJyBwcm9wZXJ0eS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc3BsYXlNZW1iZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc3BsYXlNZW1iZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc3BsYXlNZW1iZXIodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNwbGF5TWVtYmVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGRyb3AgZG93biBwYXJlbnQuIFRoZSBleHBlY3RlZCB2YWx1ZSBpcyBDU1MgU2VsZWN0b3IsIElEIG9yICdib2R5Jy4gVGhlIGRyb3AgZG93biBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBib2R5IG9mIHRoZSBlbGVtZW50IGFuZCBjb250aW51ZSB0byB3b3JrIGluIGFub3RoZXIgY29udGFpbmVyLiBUaGlzIGlzIHVzZWZ1bGwgd2hlbiBvbmUgb2YgdGhlIHBhcmVudHMgb2YgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBvdmVyZmxvd2luZywgYnkgc2V0dGluZ3MgdGhpcyBwcm9wZXJ0eSB0byAnYm9keScgdGhlIGRyb3AgZG93biB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gYW5kIHRoZSBwb3B1cCB3aWxsIG9wZW4vY2xvc2UgYXMgdXN1YWwuIGRyb3BEb3duQXBwZW5kVG8gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgaWQgb2YgYW4gSFRNTCBlbGVtZW50IG9uIHRoZSBwYWdlIG9yIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGF0IGVsZW1lbnQuIFJlc2V0aW5nIGl0IGJhY2sgdG8gbnVsbCB3aWxsIHRha2UgdGhlIGRyb3AgZG93biBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgcGxhY2UuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bkFwcGVuZFRvKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bkFwcGVuZFRvIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkcm9wRG93bkFwcGVuZFRvKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25BcHBlbmRUbyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJvcCBkb3duIGJ1dHRvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duQnV0dG9uUG9zaXRpb24oKTogRHJvcERvd25CdXR0b25Qb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bkJ1dHRvblBvc2l0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkcm9wRG93bkJ1dHRvblBvc2l0aW9uKHZhbHVlOiBEcm9wRG93bkJ1dHRvblBvc2l0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duQnV0dG9uUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBkcm9wIGRvd24uIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLiBJbiB0aGlzIGNhc2UgdGhlIGhlaWdodCBvZiB0aGUgZHJvcCBkb3duIGlzIGNvbnRyb2xsZWQgYnkgYSBDU1MgdmFyaWFibGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bkhlaWdodCgpOiBzdHJpbmcgfCBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25IZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duSGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25IZWlnaHQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbWF4aW11bSBIZWlnaHQgb2YgdGhlIGRyb3AgZG93bi4gQnkgZGVmYXVsdCBpdCdzIHNldCB0byBhbiBlbXB0eSBzdHJpbmcuIEluIHRoaXMgY2FzZSB0aGUgbWF4SGVpZ2h0IG9mIHRoZSBkcm9wIGRvd24gaXMgY29udHJvbGxlZCBieSBhIENTUyB2YXJpYWJsZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duTWF4SGVpZ2h0KCk6IHN0cmluZyB8IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1heEhlaWdodCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25NYXhIZWlnaHQodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1heEhlaWdodCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIFdpZHRoIG9mIHRoZSBkcm9wIGRvd24uIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLiBJbiB0aGlzIGNhc2UgdGhlIG1heFdpZHRoIG9mIHRoZSBkcm9wIGRvd24gaXMgY29udHJvbGxlZCBieSBhIENTUyB2YXJpYWJsZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duTWF4V2lkdGgoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duTWF4V2lkdGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duTWF4V2lkdGgodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1heFdpZHRoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1pbmltdW0gSGVpZ2h0IG9mIHRoZSBkcm9wIGRvd24uIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLiBJbiB0aGlzIGNhc2UgdGhlIG1pbkhlaWdodCBvZiB0aGUgZHJvcCBkb3duIGlzIGNvbnRyb2xsZWQgYnkgYSBDU1MgdmFyaWFibGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bk1pbkhlaWdodCgpOiBzdHJpbmcgfCBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25NaW5IZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duTWluSGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25NaW5IZWlnaHQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbWluaW11bSBXaWR0aCBvZiB0aGUgZHJvcCBkb3duLiBCeSBkZWZhdWx0IGl0J3Mgc2V0IHRvIGFuIGVtcHR5IHN0cmluZy4gSW4gdGhpcyBjYXNlIHRoZSBtaW5XaWR0aCBvZiB0aGUgZHJvcCBkb3duIGlzIGNvbnRyb2xsZWQgYnkgYSBDU1MgdmFyaWFibGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bk1pbldpZHRoKCk6IHN0cmluZyB8IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1pbldpZHRoIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkcm9wRG93bk1pbldpZHRoKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25NaW5XaWR0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGhvdyB0aGUgZHJvcCBkb3duIGlzIGdvaW5nIHRvIG9wZW4uICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bk9wZW5Nb2RlKCk6IERyb3BEb3duT3Blbk1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25PcGVuTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25PcGVuTW9kZSh2YWx1ZTogRHJvcERvd25PcGVuTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk9wZW5Nb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgd2hlbiB0aGUgZWxlbWVudCdzIGRyb3Bkb3duIGlzIG9wZW5lZCwgYSB0cmFuc3BhcmVudCBvdmVybGF5IGlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0aGUgZHJvcGRvd24gYW5kIHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudC4gVGhlIHB1cnBvc2Ugb2YgdGhlIG92ZXJsYXkgaXMgdG8gbWFrZSBzdXJlIHRoYXQgY2xpY2tpbmcgYW55d2hlcmUgb3V0c2lkZSB0aGUgcG9wdXAgd2lsbCB3aWxsIHRhcmdldCB0aGUgb3ZlcmxheSBhbmQgbm90IHRoZSBET00uICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bk92ZXJsYXkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk92ZXJsYXkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duT3ZlcmxheSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk92ZXJsYXkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcGxhY2Vob2xkZXIgZm9yIHRoZSBkcm9wIGRvd24sIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyBpdGVtcyBpbiBpdC4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duUGxhY2Vob2xkZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duUGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93blBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcm9wIGRvd24gd2hlbiBvcGVuZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93blBvc2l0aW9uKCk6IERyb3BEb3duUG9zaXRpb24gfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25Qb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25Qb3NpdGlvbih2YWx1ZTogRHJvcERvd25Qb3NpdGlvbiB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93blBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkcm9wIGRvd24uIEJ5IGRlZmF1bHQgaXQncyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLiBJbiB0aGlzIGNhc2UgdGhlIHdpZHRoIG9mIHRoZSBkcm9wIGRvd24gaXMgY29udHJvbGxlZCBieSBhIENTUyB2YXJpYWJsZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duV2lkdGgoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duV2lkdGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duV2lkdGgodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bldpZHRoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBlbGVtZW50IHdoZW4gRXNjYXBlIGtleSBpcyBwcmVzc2VkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZXNjS2V5TW9kZSgpOiBDb21ib0JveEVzY0tleU1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZXNjS2V5TW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZXNjS2V5TW9kZSh2YWx1ZTogQ29tYm9Cb3hFc2NLZXlNb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmVzY0tleU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGV0aGVyIGZpbHRlcmluZyBpcyBlbmFibGVkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZmlsdGVyYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZpbHRlcmFibGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZpbHRlcmFibGUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlsdGVyYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGRyb3AgZG93biBsaXN0IGZpbHRlciBpbnB1dCBmaWVsZC4gKi9cblx0QElucHV0KClcblx0Z2V0IGZpbHRlcklucHV0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZpbHRlcklucHV0UGxhY2Vob2xkZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZpbHRlcklucHV0UGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5maWx0ZXJJbnB1dFBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGZpbHRlcmluZyBtb2RlIG9mIHRoZSBDb21ibyBib3guICovXG5cdEBJbnB1dCgpXG5cdGdldCBmaWx0ZXJNb2RlKCk6IEZpbHRlck1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlsdGVyTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZmlsdGVyTW9kZSh2YWx1ZTogRmlsdGVyTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5maWx0ZXJNb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIElmIGVuYWJsZWQsIHRoZSBpdGVtcyB3aWxsIGJlIGdyb3VwZWQgYnkgdGhlaXIgZmlyc3QgbGV0dGVyLiBDYW4ndCBiZSBhcHBsaWVkIGlmIHRoZSBkYXRhU291cmNlIGFscmVhZHkgY29udGFpbnMgZ3JvdXBzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZ3JvdXBlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lmdyb3VwZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGdyb3VwZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZ3JvdXBlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHdoaWNoIGF0dHJpYnV0ZSBmcm9tIHRoZSBkYXRhU291cmNlIG9iamVjdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGdyb3VwIG1lbWJlciBmb3IgdGhlIGl0ZW1zLiBJZiBub3Qgc2V0LCBieSBkZWZhdWx0ICdncm91cCcgcHJvcGVydHkgaXMgdXNlZCBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0LiBncm91cE1lbWJlciBpcyBlc3BlY2lhbGx5IHVzZWZ1bGwgd2hlbiBsb2FkaW5nIHRoZSBkYXRhIGZyb20gYSBKU09OIGZpbGUgYXMgYSBkYXRhU291cmNlIGZvciB0aGUgTGlzdEJveCBhbmQgdGhlcmUncyBhIHNwZWNpZmljIHByb3BlcnR5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ3JvdXAgdGhlIGl0ZW1zLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZ3JvdXBNZW1iZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lmdyb3VwTWVtYmVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBncm91cE1lbWJlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lmdyb3VwTWVtYmVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgYWRkaXRpb25hbCBoZWxwZXIgdGV4dCBiZWxvdyB0aGUgZWxlbWVudC4gVGhlIGhpbnQgaXMgdmlzaWJsZSBvbmx5IHdoZW4gdGhlIGVsZW1lbnQgaXMgZm9jdXNlZC4gKi9cblx0QElucHV0KClcblx0Z2V0IGhpbnQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhpbnQodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oaW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGhvcml6b250YWwgU2Nyb2xsIGJhciBpbnNpZGUgdGhlIGRyb3AgZG93bi4gKi9cblx0QElucHV0KClcblx0Z2V0IGhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5KCk6IEhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5IHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lmhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBob3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eSh2YWx1ZTogSG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHkgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgcHJvcGVydHkgbmFtZSBvZiBhIExpc3QgaXRlbS4gRGV0ZXJtaW5lcyB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHdoZW4gYSBMaXN0SXRlbSBpcyBzZWxlY3RlZC4gVXNlZnVsbCBpbiBjYXNlcyB3aGVyZSB0aGUgdXNlciB3YW50cyB0byBkaXNwbGF5IGZvciBleGFtcGxlIHRoZSB2YWx1ZSBvZiBhbiBpdGVtIGluc3RlYWQgb2YgaXQncyBsYWJlbC4gQnkgZGVmYXVsdCB0aGUgbGFiZWwgaXMgZGlzcGxheWVkIGluIHRoZSBpbnB1dC4gKi9cblx0QElucHV0KClcblx0Z2V0IGlucHV0TWVtYmVyKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbnB1dE1lbWJlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW5wdXRNZW1iZXIodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbnB1dE1lbWJlciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBwdXJwb3NlIG9mIHRoZSBpbnB1dCBhbmQgd2hhdCwgaWYgYW55LCBwZXJtaXNzaW9uIHRoZSB1c2VyIGFnZW50IGhhcyB0byBwcm92aWRlIGF1dG9tYXRlZCBhc3Npc3RhbmNlIGluIGZpbGxpbmcgb3V0IHRoZSBlbGVtZW50J3MgaW5wdXQgd2hlbiBpbiBhIGZvcm0sIGFzIHdlbGwgYXMgZ3VpZGFuY2UgdG8gdGhlIGJyb3dzZXIgYXMgdG8gdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24gZXhwZWN0ZWQgaW4gdGhlIGVsZW1lbnQuIFRoaXMgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIHN0YW5kYXJkIEhUTUwgYXV0b2NvbXBsZXRlIGF0dHJpYnV0ZSBhbmQgY2FuIGJlIHNldCB0byB2YWx1ZXMgc3VjaCBhcyAnb24nLCAnbmFtZScsICdvcmdhbml6YXRpb24nLCAnc3RyZWV0LWFkZHJlc3MnLCBldGMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbnB1dFB1cnBvc2UoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmlucHV0UHVycG9zZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW5wdXRQdXJwb3NlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5wdXRQdXJwb3NlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluY3JlbWVudGFsU2VhcmNoRGVsYXkgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSB0aW1lLWludGVydmFsIGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgcHJldmlvdXMgc2VhcmNoIHF1ZXJ5IGlzIGNsZWFyZWQuIFRoZSB0aW1lciBzdGFydHMgd2hlbiB0aGUgdXNlciBzdG9wcyB0eXBpbmcuIEEgbmV3IHF1ZXJ5IGNhbiBiZSBzdGFydGVkIG9ubHkgd2hlbiB0aGUgZGVsYXkgaGFzIHBhc3NlZC4gKi9cblx0QElucHV0KClcblx0Z2V0IGluY3JlbWVudGFsU2VhcmNoRGVsYXkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmluY3JlbWVudGFsU2VhcmNoRGVsYXkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGluY3JlbWVudGFsU2VhcmNoRGVsYXkodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmNyZW1lbnRhbFNlYXJjaERlbGF5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3QgZ2V0cyB0aGUgbW9kZSBvZiB0aGUgaW5jcmVtZW50YWwgc2VhcmNoIG1vZGUuIEluY3JlbWVudGFsIHNlYXJjaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIFR5cGluZyB3aGlsZSB0aGUgZHJvcCBkb3duIGlzIGZvY3VzZWQgc3RhcnRzIHRoZSBpbmNyZW1lbnRhbCBzZWFyY2guICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbmNyZW1lbnRhbFNlYXJjaE1vZGUoKTogU2VhcmNoTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmNyZW1lbnRhbFNlYXJjaE1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGluY3JlbWVudGFsU2VhcmNoTW9kZSh2YWx1ZTogU2VhcmNoTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmNyZW1lbnRhbFNlYXJjaE1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaGVpZ2h0IGZvciBhbGwgbGlzdCBpdGVtcy4gVXNlZCBvbmx5IHdoZW4gdmlydHVhbGl6YXRpb24gaXMgZW5hYmxlZC4gKi9cblx0QElucHV0KClcblx0Z2V0IGl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1IZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGl0ZW1IZWlnaHQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtSGVpZ2h0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGl0ZW0gd2lkdGggbWVhc3VyaW5nIGFsZ29yaXRobS4gKi9cblx0QElucHV0KClcblx0Z2V0IGl0ZW1NZWFzdXJlTW9kZSgpOiBMaXN0SXRlbU1lYXN1cmVNb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1NZWFzdXJlTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaXRlbU1lYXN1cmVNb2RlKHZhbHVlOiBMaXN0SXRlbU1lYXN1cmVNb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1NZWFzdXJlTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBIGdldHRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIExpc3QgaXRlbXMgaW5zaWRlIHRoZSBkcm9wIGRvd24uICovXG5cdEBJbnB1dCgpXG5cdGdldCBpdGVtcygpOiB7bGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZ31bXSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtcyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaXRlbXModmFsdWU6IHtsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfVtdKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1zID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoZSBpdGVtVGVtcGxhdGUgcHJvcGVydHkgaXMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBpZCBvZiBhbiBIVE1MVGVtcGxhdGVFbGVtZW50IGluIHRoZSBET00uICBJdCdzIHVzZWQgdG8gc2V0IGEgY3VzdG9taXplIHRoZSBjb250ZW50IG9mIHRoZSBsaXN0IGl0ZW1zLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaXRlbVRlbXBsYXRlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtVGVtcGxhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGl0ZW1UZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1UZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIGEgbGl0dGxlIHRleHQgbGFiZWwgYWJvdmUgdGhlIGVsZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsYWJlbCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG5leHQgdG8gdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gdGhlIGxvYWRlciBpcyB2aXNpYmxlIGFuZCBpdCdzIHBvc2l0aW9uIGlzIHRvcCBvciBib3R0b20uICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2FkaW5nSW5kaWNhdG9yUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvYWRpbmdJbmRpY2F0b3JQbGFjZWhvbGRlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9hZGluZ0luZGljYXRvclBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9hZGluZ0luZGljYXRvclBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2FkaW5nIGluZGljYXRvci4gKi9cblx0QElucHV0KClcblx0Z2V0IGxvYWRpbmdJbmRpY2F0b3JQb3NpdGlvbigpOiBWZXJ0aWNhbEFsaWdubWVudCB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2FkaW5nSW5kaWNhdG9yUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvYWRpbmdJbmRpY2F0b3JQb3NpdGlvbih2YWx1ZTogVmVydGljYWxBbGlnbm1lbnQgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9hZGluZ0luZGljYXRvclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgbGFuZ3VhZ2UuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJvcGVydHkgbWVzc2FnZXMuICAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDYWxsYmFjayB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoZSBMb2NhbGl6YXRpb24gTW9kdWxlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9jYWxpemVGb3JtYXRGdW5jdGlvbigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxpemVGb3JtYXRGdW5jdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9jYWxpemVGb3JtYXRGdW5jdGlvbih2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsaXplRm9ybWF0RnVuY3Rpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIGFuIG9iamVjdCBzcGVjaWZ5aW5nIHN0cmluZ3MgdXNlZCBpbiB0aGUgd2lkZ2V0IHRoYXQgY2FuIGJlIGxvY2FsaXplZC4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcm9wZXJ0eSBsb2NhbGUuICAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWVzc2FnZXMoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1lc3NhZ2VzIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtZXNzYWdlcyh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1lc3NhZ2VzID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW5zaWRlIHRoZSBpbnB1dCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBhdXRvY29tcGxldGUgZnVuY3Rpb25hbGl0eSAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWluTGVuZ3RoKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1pbkxlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbkxlbmd0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgaW5wdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4TGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4TGVuZ3RoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgbmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBlbGVtZW50LiBOYW1lIGlzIHVzZWQgd2hlbiBzdWJtaXRpbmcgSFRNTCBmb3Jtcy4gKi9cblx0QElucHV0KClcblx0Z2V0IG5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm5hbWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5uYW1lID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgcG9wdXAgaXMgb3BlbmVkIG9yIGNsb3NlZCAqL1xuXHRASW5wdXQoKVxuXHRnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBvcGVuZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGlucHV0J3MgcGxhY2Vob2xkZXIuICovXG5cdEBJbnB1dCgpXG5cdGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGlzYWJsZXMgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBlbGVtZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZWFkb25seSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWxpZ25lZCB0byBzdXBwb3J0IGxvY2FsZXMgdXNpbmcgcmlnaHQtdG8tbGVmdCBmb250cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJpZ2h0VG9MZWZ0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmlnaHRUb0xlZnQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJpZ2h0VG9MZWZ0KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgcmVzaXplIGluZGljYXRvciBpbiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiB0aGUgZHJvcCBkb3duIGlzIHZpc2libGUgb3Igbm90LiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCByZXNpemVNb2RlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmVzaXplSW5kaWNhdG9yKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzaXplSW5kaWNhdG9yIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXNpemVJbmRpY2F0b3IodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzaXplSW5kaWNhdG9yID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgZHJvcERvd24gY2FuIGJlIHJlc2l6ZWQgb3Igbm90LiBXaGVuIHJlc2l6aW5nIGlzIGVuYWJsZWQsIGEgcmVzaXplIGJhciBhcHBlYXJzIG9uIHRoZSB0b3AvYm90dG9tIHNpZGUgb2YgdGhlIGRyb3AgZG93bi4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlc2l6ZU1vZGUoKTogUmVzaXplTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXNpemVNb2RlKHZhbHVlOiBSZXNpemVNb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBpbnB1dC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvbkRpc3BsYXlNb2RlKCk6IFNlbGVjdGlvbkRpc3BsYXlNb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkRpc3BsYXlNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25EaXNwbGF5TW9kZSh2YWx1ZTogU2VsZWN0aW9uRGlzcGxheU1vZGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRGlzcGxheU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBzZWxlY3RlZCBpbmRleGVzLiBTZWxlY3RlZCBpbmRleGVzIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdGhlIGluZGV4ZXMgb2YgdGhlIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0ZWRJbmRleGVzKCk6IG51bWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkSW5kZXhlcyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRJbmRleGVzKHZhbHVlOiBudW1iZXJbXSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4ZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIGVsZWN0ZWQgaW5kZXhlcy4gU2VsZWN0ZWQgdmFsdWVzIHJlcHJlc2VudHMgdGhlIHZhbHVlcyBvZiB0aGUgaXRlbXMgdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzZWxlY3RlZFZhbHVlcygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlcyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRWYWx1ZXModmFsdWU6IHN0cmluZ1tdKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkVmFsdWVzID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0aW9uTW9kZSgpOiBMaXN0U2VsZWN0aW9uTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBMaXN0U2VsZWN0aW9uTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgaXRlbXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBvciBub3QgKi9cblx0QElucHV0KClcblx0Z2V0IHNvcnRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNvcnRlZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc29ydGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNvcnRlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHNvcnRpbmcgZGlyZWN0aW9uIC0gYXNjZW5kaW5nKGFzYykgb3IgZGVzY2VuZGluZyhkZXNjKSAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc29ydERpcmVjdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc29ydERpcmVjdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc29ydERpcmVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNvcnREaXJlY3Rpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdGhlbWUgZm9yIHRoZSBlbGVtZW50LiBUaGVtZXMgZGVmaW5lIHRoZSBsb29rIG9mIHRoZSBlbGVtZW50cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRoZW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGhlbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIGEgY3VzdG9tIGNvbnRlbnQgZm9yIHRoZSB0b2tlbnMgd2hlbiBzZWxlY3Rpb25EaXNwbGF5TW9kZSBpcyBzZXQgdG8gJ3Rva2VucycuIFRva2VucyBhcmUgdXNlZCBvbmx5IGZvciBtdWx0aXBsZSBzZWxlY3Rpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCB0b2tlblRlbXBsYXRlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50b2tlblRlbXBsYXRlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0b2tlblRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudG9rZW5UZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJZiBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGZvY3VzZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmZvY3VzYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVuZm9jdXNhYmxlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB1bmZvY3VzYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIHZhbHVlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHZhbHVlIG1lbWJlciBvZiBhbiBpdGVtLiBTdG9yZWQgYXMgdmFsdWUgaW4gdGhlIGl0ZW0gb2JqZWN0LiBTaW1pbGFyIHRvIGdyb3VwTWVtYmVyLCB2YWx1ZU1lbWJlciBpcyBlc3BlY2lhbGx5IHVzZWZ1bGwgd2hlbiB1c2luZyBkYXRhIGZyb20gYSBKU09OIGZpbGUgYXMgYSBkYXRhU291cmNlIGZvciB0aGUgTGlzdEJveCBhbmQgdGhlcmUncyBhIHNwZWNpZmljIHByb3BlcnR5IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSB2YWx1ZSB0aGUgaXRlbXMuICovXG5cdEBJbnB1dCgpXG5cdGdldCB2YWx1ZU1lbWJlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWVNZW1iZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHZhbHVlTWVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWVNZW1iZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdmVydGljYWwgc2Nyb2xsIGJhci4gKi9cblx0QElucHV0KClcblx0Z2V0IHZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSgpOiBWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2ZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkodmFsdWU6IFZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC52ZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3ZWF0aGVyIG9yIG5vdCBWaXJ0dWFsaXphdGlvbiBpcyB1c2VkIGZvciB0aGUgQ29tYm8gYm94LiBWaXJ0dWFsaXphdGlvbiBhbGxvd3MgYSBodWdlIGFtb3VudCBvZiBpdGVtcyB0byBiZSBsb2FkZWQgdG8gdGhlIExpc3QgYm94IHdoaWxlIHByZXNlcnZpbmcgdGhlIHBlcmZvcm1hbmNlLiBGb3IgZXhhbXBsZSBhIG1pbGlvbiBpdGVtcyBjYW4gYmUgbG9hZGVkIHRvIHRoZSBsaXN0IGJveC4gKi9cblx0QElucHV0KClcblx0Z2V0IHZpcnR1YWxpemVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmlydHVhbGl6ZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHZpcnR1YWxpemVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZpcnR1YWxpemVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdGFkZGVkSXRlbXMsIFx0ZGlzYWJsZWQsIFx0aW5kZXgsIFx0bGFiZWwsIFx0cmVtb3ZlZEl0ZW1zLCBcdHNlbGVjdGVkLCBcdHZhbHVlKVxuXHQqICAgYWRkZWRJdGVtcyAtIEFuIGFycmF5IG9mIExpc3QgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQuXG5cdCogICBkaXNhYmxlZCAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIHRoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgZXZlbnQgaXMgZGlzYWJsZWQuXG5cdCogICBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgTGlzdCBpdGVtIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cblx0KiAgIGxhYmVsIC0gVGhlIGxhYmVsIG9mIHRoZSBMaXN0IGl0ZW0gdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuXHQqICAgcmVtb3ZlZEl0ZW1zIC0gQW4gYXJyYXkgb2YgTGlzdCBpdGVtcyB0aGF0IGhhdmUgYmVlbiB1bnNlbGVjdGVkIGJlZm9yZSB0aGUgZXZlbnQgd2FzIGZpcmVkLlxuXHQqICAgc2VsZWN0ZWQgLSBUaGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIExpc3QgaXRlbSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuIElmIGFuIGl0ZW0gd2FzIHNlbGVjdGVkIHRoZSB2YWx1ZSB3aWxsIGJlIHRydWUgYW5kIHZpY2UgdmVyc2EuXG5cdCogICB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgTGlzdCBpdGVtIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cblx0Ki9cblx0QE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZHJvcCBkb3duIGxpc3QgaXMgY2xvc2VkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBkcm9wIGRvd24gbGlzdCBpcyBhYm91dCB0byBiZSBjbG9zZWQuIFRoaXMgZXZlbnQgYWxsb3dzIHRvIGNhbmNlbCB0aGUgY2xvc2luZyBvcGVyYXRpb24gY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIGluIHRoZSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uQ2xvc2luZzogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gaXRlbSBpcyBjbGlja2VkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdGRpc2FibGVkLCBcdGluZGV4LCBcdGxhYmVsLCBcdHNlbGVjdGVkLCBcdHZhbHVlKVxuXHQqICAgZGlzYWJsZWQgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgTGlzdCBpdGVtIHRoYXQgd2FzIGNsaWNrZWQgaXMgZGlzYWJsZWQgb3Igbm90LlxuXHQqICAgaW5kZXggLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBMaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZC5cblx0KiAgIGxhYmVsIC0gVGhlIGxhYmVsIG9mIHRoZSBMaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZC5cblx0KiAgIHNlbGVjdGVkIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIExpc3QgaXRlbSB0aGF0IHdhcyBjbGlja2VkIGlzIHNlbGVjdGVkIG9yIG5vdC5cblx0KiAgIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBMaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZC5cblx0Ki9cblx0QE91dHB1dCgpIG9uSXRlbUNsaWNrOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZHJvcCBkb3duIGxpc3QgaXMgb3BlbmVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uT3BlbjogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGRyb3AgZG93biBsaXN0IGlzIGFib3V0IHRvIGJlIG9wZW5lZC4gVGhpcyBldmVudCBhbGxvd3MgdG8gY2FuY2VsIHRoZSBvcGVuaW5nIG9wZXJhdGlvbiBjYWxsaW5nIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgaW4gdGhlIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25PcGVuaW5nOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB1c2VyIHN0YXJ0cyByZXNpemluZyB0aGUgZHJvcCBkb3duLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdHBvc2l0aW9uKVxuXHQqICAgcG9zaXRpb24gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBsZWZ0IGFuZCB0b3AgcG9zaXRpb25zIG9mIHRoZSBkcm9wIGRvd24uXG5cdCovXG5cdEBPdXRwdXQoKSBvblJlc2l6ZVN0YXJ0OiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgcmVzaXppbmcgb2YgdGhlIGRyb3AgZG93biBpcyBmaW5pc2hlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdEN1c3RvbSBldmVudCB3YXMgY3JlYXRlZCB3aXRoOiBldmVudC5kZXRhaWwoXHRwb3NpdGlvbilcblx0KiAgIHBvc2l0aW9uIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbGVmdCBhbmQgdG9wIHBvc2l0aW9ucyBvZiB0aGUgZHJvcCBkb3duLlxuXHQqL1xuXHRAT3V0cHV0KCkgb25SZXNpemVFbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHVzZXIgc2Nyb2xscyB0byB0aGUgZW5kIG9mIHRoZSBkcm9wRG93biBsaXN0LlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uU2Nyb2xsQm90dG9tUmVhY2hlZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIHRoZSBzdGFydCBvZiB0aGUgZHJvcERvd24gbGlzdC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvblNjcm9sbFRvcFJlYWNoZWQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIGEgdG9rZW4gaXRlbShwaWxsKSBoYXMgYmVlbiBjbGlja2VkLiBUaGlzIGV2ZW50IGFsbG93cyB0byBjYW5jZWwgdGhlIG9wZW5pbmcgb3BlcmF0aW9uIGNhbGxpbmcgZXZlbnQucHJldmVudERlZmF1bHQoKSBpbiB0aGUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvblRva2VuQ2xpY2s6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBlbmRzIGEgTGlzdEl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBpdGVtcyBpbnNpZGUgZWxlbWVudC4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBBIExpc3RJdGVtIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGl0ZW1zIGFzIHRoZSBsYXN0IGl0ZW0uXG5cdCogQHJldHVybnMge05vZGV9XG4gICovXG5cdHB1YmxpYyBhc3luYyBhcHBlbmRDaGlsZChub2RlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQWRkcyBhIG5ldyBpdGVtKHMpLiBcblx0KiBAcGFyYW0ge2FueX0gaXRlbS4gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtIHRoYXQgd2lsbCBiZSBpbnNlcnRlZC4gWW91IGNhbiBhbHNvIHBhc3MgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdCovXG4gICAgcHVibGljIGFkZChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuYWRkKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmFkZChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuIFxuXHQqL1xuICAgIHB1YmxpYyBjbGVhckl0ZW1zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGVhckl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXJJdGVtcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVbnNlbGVjdHMgYWxsIGl0ZW1zLiBcblx0Ki9cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBkcm9wRG93biBsaXN0LiBcblx0Ki9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUGVyZm9ybXMgYSBkYXRhIGJpbmQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVmcmVzaCB0aGUgZGF0YSBzb3VyY2UuIFxuXHQqL1xuICAgIHB1YmxpYyBkYXRhQmluZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YUJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5kYXRhQmluZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbnN1cmVzIHRoZSBkZXNpcmVkIGl0ZW0gaXMgdmlzaWJsZSBieSBzY3JvbGxpbmcgdG8gaXQuIFxuXHQqIEBwYXJhbSB7SFRNTEVsZW1lbnQgfCBzdHJpbmd9IGl0ZW0uIEEgbGlzdCBpdGVtIG9yIHZhbHVlIG9mIHRoZSBkZXNpcmVkIGl0ZW0gdG8gYmUgdmlzaWJsZS5cblx0Ki9cbiAgICBwdWJsaWMgZW5zdXJlVmlzaWJsZShpdGVtOiBIVE1MRWxlbWVudCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5lbnN1cmVWaXNpYmxlKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmVuc3VyZVZpc2libGUoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJldHVybnMgYW4gaXRlbSBpbnN0YW5jZSBmcm9tIHRoZSBkcm9wRG93biBsaXN0LiBcblx0KiBAcGFyYW0ge3N0cmluZ30gdmFsdWUuIFRoZSB2YWx1ZSBvZiBhbiBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBsaXN0LlxuXHQqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgKi9cblx0cHVibGljIGFzeW5jIGdldEl0ZW0odmFsdWUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0SXRlbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIGEgbmV3IGl0ZW0gYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQuXG5cdCogQHBhcmFtIHthbnl9IGl0ZW0uIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQuIFlvdSBjYW4gYWxzbyBwYXNzIGFuIGFycmF5IG9mIGl0ZW1zLlxuXHQqL1xuICAgIHB1YmxpYyBpbnNlcnQocG9zaXRpb246IG51bWJlciwgaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydChwb3NpdGlvbiwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KHBvc2l0aW9uLCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyBhIG5ldyBMaXN0SXRlbSBiZWZvcmUgYW5vdGhlciBpbiB0aGUgbGlzdC4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBBIExpc3RJdGVtIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgYmVmb3JlIHRoZSByZWZlcmVuY2VJdGVtIGluIHRoZSBsaXN0LlxuXHQqIEBwYXJhbSB7Tm9kZSB8IG51bGx9IHJlZmVyZW5jZU5vZGUuIEEgTGlzdEl0ZW0gZWxlbWVudCB0aGF0IGFjdHMgYXMgdGhlIHJlZmVyZW5jZSBpdGVtIGJlZm9yZSB3aGljaCBhIG5ldyBpdGVtIGlzIGFib3V0IHRvIGJlIGluc2VydGVkLiBUaGUgcmVmZXJlbmNlTm9kZSBtdXN0IGJlIGluIHRoZSBzYW1lIGxpc3QgYXMgdGhlIG5vZGUuXG5cdCogQHJldHVybnMge05vZGV9XG4gICovXG5cdHB1YmxpYyBhc3luYyBpbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlTm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBPcGVucyB0aGUgZHJvcERvd24gbGlzdC4gXG5cdCovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYW4gaXRlbSBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gb2YgdGhlIHJlbW92ZWQgaXRlbS5cblx0Ki9cbiAgICBwdWJsaWMgcmVtb3ZlQXQocG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVBdChwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQocG9zaXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGEgTGlzdEl0ZW0gZnJvbSB0aGUgbGlzdCBvZiBpdGVtcyBpbnNpZGUgZWxlbWVudC4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBBIExpc3RJdGVtIGVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBsaXN0IG9mIGl0ZW1zIGluc2lkZSB0aGUgZWxlbWVudC5cblx0KiBAcmV0dXJucyB7Tm9kZX1cbiAgKi9cblx0cHVibGljIGFzeW5jIHJlbW92ZUNoaWxkKG5vZGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcERvd24gbGlzdC4gIFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGl0ZW0uIEEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBpdGVtIG9yIGFuIEhUTUwgRWxlbWVudCByZWZlcmVuY2luZyBhbiBpdGVtIGZyb20gdGhlIGxpc3Rcblx0Ki9cbiAgICBwdWJsaWMgc2VsZWN0KGl0ZW06IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFVuc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGRyb3BEb3duIGxpc3QuICBcblx0KiBAcGFyYW0ge3N0cmluZyB8IEhUTUxFbGVtZW50fSBpdGVtLiBBIHN0cmluZywgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBvciBhbiBIVE1MIEVsZW1lbnQgcmVmZXJlbmNpbmcgYW4gaXRlbSBmcm9tIHRoZSBsaXN0XG5cdCovXG4gICAgcHVibGljIHVuc2VsZWN0KGl0ZW06IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVuc2VsZWN0KGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVuc2VsZWN0KGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcERvd24gbGlzdC4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gd2hlcmUgdGhlIGl0ZW0gbXVzdCBiZSB1cGRhdGVkLlxuXHQqIEBwYXJhbSB7YW55fSB2YWx1ZS4gVGhlIHZhbHVlIG9mIHRoZSB1cGRhdGVkIGl0ZW0uXG5cdCovXG4gICAgcHVibGljIHVwZGF0ZShwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZShwb3NpdGlvbiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZShwb3NpdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXHRnZXQgaXNSZW5kZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQgOiBmYWxzZTtcblx0fVxuXG5cdG5nT25Jbml0KCkge1xuXHR9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgdGhhdC5vbkNyZWF0ZS5lbWl0KHRoYXQubmF0aXZlRWxlbWVudCk7XG5cblx0XHRTbWFydC5SZW5kZXIoKTtcblxuXHRcdHRoaXMubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWFydC1hbmd1bGFyJyk7XG5cblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHsgdGhhdC5vblJlYWR5LmVtaXQodGhhdC5uYXRpdmVFbGVtZW50KTsgfSk7XG5cdFx0dGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHRoaXMudW5saXN0ZW4oKTtcblx0fVxuXG5cdF9pbml0aWFsQ2hhbmdlID0gdHJ1ZTsgXG5cblx0Z2V0IG5nVmFsdWUoKTogYW55IHtcblx0XHRpZiAoIXRoaXMubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZXMgJiYgdGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID09PSAxID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkVmFsdWVzWzBdIDogdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkVmFsdWVzO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID8gaW5wdXQudmFsdWUgOiBudWxsO1xuXHR9XG5cblx0c2V0IG5nVmFsdWUodmFsdWU6IGFueSkge1xuXHRcdGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcblx0XHQgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHR3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xuXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICB0aGF0Lm5hdGl2ZUVsZW1lbnQuJC5saXN0Qm94LmlzSW5pdGlhbGl6ZWQgPSB0aGF0Ll9pbml0aWFsQ2hhbmdlID8gZmFsc2UgOiB0cnVlO1xuXHRcdFx0dGhhdC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9ybWFsaXplZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGN1cnJlbnRWYWx1ZTogYW55KSA9PiB0aGlzLnNlbGVjdChjdXJyZW50VmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuc2VsZWN0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhhdC5uYXRpdmVFbGVtZW50LiQubGlzdEJveC5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5fYXBwbHlTZWxlY3Rpb24oKTtcblx0XHRcdGlmICh0aGF0Ll9pbml0aWFsQ2hhbmdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGF0LnNlbGVjdGVkVmFsdWVzICYmIHRoYXQuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkNoYW5nZSh0aGF0LnNlbGVjdGVkVmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhhdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG5cdFx0XHRcdFx0bGV0IGlucHV0VmFsdWU6IGFueSA9IGlucHV0LnZhbHVlO1xuXHRcdFx0XHRcdGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdGlucHV0VmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQ2hhbmdlKCh0aGF0LnNlbGVjdGVkVmFsdWVzICYmIHRoYXQuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMCkgPyB0aGF0LnNlbGVjdGVkVmFsdWVzWzBdIDogKGlucHV0ID8gaW5wdXRWYWx1ZSA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cdFx0fSk7XG5cdH1cblxuXHRyZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLl9vbkNoYW5nZSA9IGZuO1xuXHR9XG5cblx0cmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcblx0XHRcdGZvciAoY29uc3QgcHJvcE5hbWUgaW4gY2hhbmdlcykge1xuXHRcdFx0XHRpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcblx0XHRcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcE5hbWVdID0gY2hhbmdlc1twcm9wTmFtZV0uY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBZGQgZXZlbnQgbGlzdGVuZXJzLiAqL1xuXHRwcml2YXRlIGxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DaGFuZ2UuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkNsb3NlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DbG9zaW5nLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydpdGVtQ2xpY2tIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25JdGVtQ2xpY2suZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaXRlbUNsaWNrJywgdGhhdC5ldmVudEhhbmRsZXJzWydpdGVtQ2xpY2tIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uT3Blbi5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk9wZW5pbmcuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbmluZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uUmVzaXplU3RhcnQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplU3RhcnQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uUmVzaXplRW5kLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZUVuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snc2Nyb2xsQm90dG9tUmVhY2hlZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblNjcm9sbEJvdHRvbVJlYWNoZWQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsQm90dG9tUmVhY2hlZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snc2Nyb2xsQm90dG9tUmVhY2hlZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbFRvcFJlYWNoZWRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25TY3JvbGxUb3BSZWFjaGVkLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbFRvcFJlYWNoZWQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbFRvcFJlYWNoZWRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWyd0b2tlbkNsaWNrSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uVG9rZW5DbGljay5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b2tlbkNsaWNrJywgdGhhdC5ldmVudEhhbmRsZXJzWyd0b2tlbkNsaWNrSGFuZGxlciddKTtcblxuXG4gICAgICAgIHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlTW9kZWxIYW5kbGVyJ10gPSAoZXZlbnQ6IEV2ZW50KSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICB0aGF0Ll9pbml0aWFsQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGF0Ll9vbkNoYW5nZSh0aGF0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMCA/ICh0aGF0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMSA/IHRoYXQubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlcyA6IHRoYXQubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlc1swXSkgOiB0aGF0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5ldmVudEhhbmRsZXJzWydibHVyTW9kZWxIYW5kbGVyJ10gPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGF0Ll9vblRvdWNoZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhhdC5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhhdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykpIHtcbiAgICAgICAgICAgICAgICB0aGF0LmV2ZW50SGFuZGxlcnNbJ2tleXVwTW9kZWxIYW5kbGVyJ10gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlTW9kZWxIYW5kbGVyJ10oZXZlbnQpOyB9LCA1MCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoYXQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhhdC5ldmVudEhhbmRsZXJzWydrZXl1cE1vZGVsSGFuZGxlciddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlTW9kZWxIYW5kbGVyJ10pO1xuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhhdC5ldmVudEhhbmRsZXJzWydibHVyTW9kZWxIYW5kbGVyJ10pO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzLiAqL1xuXHRwcml2YXRlIHVubGlzdGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NoYW5nZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydpdGVtQ2xpY2tIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdpdGVtQ2xpY2snLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2l0ZW1DbGlja0hhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZVN0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbEJvdHRvbVJlYWNoZWRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGxCb3R0b21SZWFjaGVkJywgdGhhdC5ldmVudEhhbmRsZXJzWydzY3JvbGxCb3R0b21SZWFjaGVkSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydzY3JvbGxUb3BSZWFjaGVkSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsVG9wUmVhY2hlZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snc2Nyb2xsVG9wUmVhY2hlZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sndG9rZW5DbGlja0hhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rva2VuQ2xpY2snLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Rva2VuQ2xpY2tIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2NoYW5nZU1vZGVsSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VNb2RlbEhhbmRsZXInXSk7XG4gICAgICAgICAgICBpZiAodGhhdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykpIHtcbiAgICAgICAgICAgICAgICAgIHRoYXQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhhdC5ldmVudEhhbmRsZXJzWydrZXl1cE1vZGVsSGFuZGxlciddKTtcbiAgICAgICAgICAgIH1cblx0XHR9XG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snYmx1ck1vZGVsSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoYXQuZXZlbnRIYW5kbGVyc1snYmx1ck1vZGVsSGFuZGxlciddKTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==
|
|
1115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQuY29tYm9ib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21ib2JveC9zcmMvc21hcnQuY29tYm9ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxVQUFVLEVBQTJCLE1BQU0sRUFBRSxZQUFZLEVBQThCLE1BQU0sZUFBZSxDQUFDO0FBQzNOLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJckQsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUZ6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFVeEMsTUFBTSxtQ0FBbUMsR0FBUTtJQUM3QyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFBO0FBUUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFdBQVc7SUFFakQsWUFBWSxHQUF5QjtRQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFJSixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQWEzQjs7O1VBR0U7UUFDSCxjQUFTLEdBQXlCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMxQzs7O1VBR0U7UUFDSCxlQUFVLEdBQWMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBNGtCdkM7Ozs7Ozs7OztVQVNFO1FBQ1EsYUFBUSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5FOzhDQUNzQztRQUM1QixZQUFPLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs7Ozs7OztVQU9FO1FBQ1EsZ0JBQVcsR0FBOEIsSUFBSSxZ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QkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVVGLE1BQU07c0JBRFQsS0FBSztnQkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVVGLFdBQVc7c0JBRGQsS0FBSztnQkFVRixLQUFLO3NCQURSLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVVGLDJCQUEyQjtzQkFEOUIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBa0JJLFFBQVE7c0JBQWpCLE1BQU07Z0JBSUcsT0FBTztzQkFBaEIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNO2dCQVVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsTUFBTTtzQkFBZixNQUFNO2dCQUlHLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUlHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFJRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBSUcsWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbWJvQm94IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGUsIERyb3BEb3duQnV0dG9uUG9zaXRpb24sIERyb3BEb3duT3Blbk1vZGUsIERyb3BEb3duUG9zaXRpb24sIENvbWJvQm94RXNjS2V5TW9kZSwgRmlsdGVyTW9kZSwgSG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHksIFNlYXJjaE1vZGUsIExpc3RJdGVtTWVhc3VyZU1vZGUsIFZlcnRpY2FsQWxpZ25tZW50LCBSZXNpemVNb2RlLCBTZWxlY3Rpb25EaXNwbGF5TW9kZSwgTGlzdFNlbGVjdGlvbk1vZGUsIFZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEaXJlY3RpdmUsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFF1ZXJ5TGlzdCwgQ29udGVudENoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlRWxlbWVudCwgU21hcnQgfSBmcm9tICcuL3NtYXJ0LmVsZW1lbnQnO1xuZXhwb3J0IHsgQXV0b0NvbXBsZXRlLCBEcm9wRG93bkJ1dHRvblBvc2l0aW9uLCBEcm9wRG93bk9wZW5Nb2RlLCBEcm9wRG93blBvc2l0aW9uLCBDb21ib0JveEVzY0tleU1vZGUsIEZpbHRlck1vZGUsIEhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5LCBTZWFyY2hNb2RlLCBMaXN0SXRlbU1lYXN1cmVNb2RlLCBWZXJ0aWNhbEFsaWdubWVudCwgUmVzaXplTW9kZSwgU2VsZWN0aW9uRGlzcGxheU1vZGUsIExpc3RTZWxlY3Rpb25Nb2RlLCBWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHksIEVsZW1lbnRSZW5kZXJNb2RlfSBmcm9tICcuLy4uL2luZGV4JztcbmV4cG9ydCB7IFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcbmV4cG9ydCB7IENvbWJvQm94IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuXG5pbXBvcnQgeyBMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vc21hcnQubGlzdGl0ZW0nO1xuXG5pbXBvcnQgeyBMaXN0SXRlbXNHcm91cENvbXBvbmVudCB9IGZyb20gJy4vc21hcnQubGlzdGl0ZW1zZ3JvdXAnO1xuXG5jb25zdCBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvQm94Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxufVxuXG5ARGlyZWN0aXZlKHtcblx0ZXhwb3J0QXM6ICdzbWFydC1jb21iby1ib3gnLFx0c2VsZWN0b3I6ICdzbWFydC1jb21iby1ib3gsIFtzbWFydC1jb21iby1ib3hdJyxcblx0cHJvdmlkZXJzOiBbQ1VTVE9NX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG5cbn0pXG5cbmV4cG9ydCBjbGFzcyBDb21ib0JveENvbXBvbmVudCBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG5cdGNvbnN0cnVjdG9yKHJlZjogRWxlbWVudFJlZjxDb21ib0JveD4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIENvbWJvQm94O1xuXHR9XG5cblx0cHJpdmF0ZSBldmVudEhhbmRsZXJzOiBhbnlbXSA9IFtdO1xuXG5cdHB1YmxpYyBkZWNsYXJlIG5hdGl2ZUVsZW1lbnQ6IENvbWJvQm94O1xuXHQvKiogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGNvbXBvbmVudCBvbiBkZW1hbmQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9wdGlvbmFsIG9iamVjdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSBiaW5kZWQgb25lcy5cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVDb21wb25lbnQocHJvcGVydGllcyA9IHt9KTogYW55IHtcbiAgICBcdHRoaXMubmF0aXZlRWxlbWVudCA9IDxDb21ib0JveD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFydC1jb21iby1ib3gnKTtcblx0XHRmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgeyBcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudDtcblx0fVxuICAgICAgICAvKipcbiAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMgb24gdGhlIGZvcm0gZWxlbWVudHMuXG4gICAgICAgICovXG4gICAgICAgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBmb3JtIGVsZW1lbnRzLlxuICAgICAgICAqL1xuICAgICAgIF9vblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xuXG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIHByb3BlcnR5IGlzIGFwcGxpY2FibGUgb25seSB3aGVuIGRyb3BEb3duT3Blbk1vZGUgaXMgc2V0IHRvICdhdXRvJy4gSXQgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZHJvcGRvd24gd2lsbCByZW1haW4gb3BlbiBhZnRlciB0aGUgcG9pbnRlciBsZWF2ZXMgdGhlIGVsZW1lbnQsIGJlZm9yZSBpdCBhdXRvbWF0aWNhbGx5IGNsb3Nlcy4gSWYgdGhlIHBvaW50ZXIgaXMgbm90IGhvdmVyaW5nIG92ZXIgdGhlIGRyb3Bkb3duIG9yIGl0cyB0cmlnZ2VyIGVsZW1lbnQsIHRoZSBkcm9wZG93biB3aWxsIGNsb3NlIGFmdGVyIHRoaXMgZGVsYXkuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ2xvc2VEZWxheSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0Nsb3NlRGVsYXkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGF1dG9DbG9zZURlbGF5KHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0Nsb3NlRGVsYXkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBhdXRvY29tcGxldGUgbW9kZSBmb3IgdGhlIGlucHV0IGZpZWxkLiBUaGUgc2VsZWN0ZWQgbW9kZSBkZWZpbmVzIGhvdyB0aGUgY29tcG9uZW50IGZpbHRlcnMgYW5kIGRpc3BsYXlzIGl0ZW1zIGZyb20gdGhlIGRhdGFTb3VyY2UsIHNob3dpbmcgb25seSB0aG9zZSBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIHVzZXIncyBpbnB1dCBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBtYXRjaGluZyBzdHJhdGVneS4gVGhpcyBzZXR0aW5nIGRpcmVjdGx5IGltcGFjdHMgdGhlIHN1Z2dlc3Rpb25zIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyB0aGV5IHR5cGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ29tcGxldGUoKTogQXV0b0NvbXBsZXRlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9Db21wbGV0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NvbXBsZXRlKHZhbHVlOiBBdXRvQ29tcGxldGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0NvbXBsZXRlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2FpdCBhZnRlciB0aGUgdXNlciBpbnB1dCBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcGRvd24gbGlzdCBvZiBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMuIFRoaXMgZGVsYXkgaGVscHMgY29udHJvbCBob3cgcXVpY2tseSB0aGUgc3VnZ2VzdGlvbnMgYXBwZWFyLCBhbGxvd2luZyBmb3Igc21vb3RoZXIgdXNlciBleHBlcmllbmNlIGFuZCByZWR1Y2luZyB1bm5lY2Vzc2FyeSBzZWFyY2hlcyBhcyB0aGUgdXNlciB0eXBlcy4gKi9cblx0QElucHV0KClcblx0Z2V0IGF1dG9Db21wbGV0ZURlbGF5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ29tcGxldGVEZWxheSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NvbXBsZXRlRGVsYXkodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ29tcGxldGVEZWxheSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzIHVzZXJzIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgY3VzdG9tIGtleSBuYW1lcyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgb3BlbmluZyBvZiB0aGUgcG9wdXAgd2hlbiBwcmVzc2VkLiBUaGlzIGFsbG93cyBmb3IgZmxleGlibGUga2V5Ym9hcmQgc2hvcnRjdXRzIHRhaWxvcmVkIHRvIHVzZXIgcHJlZmVyZW5jZXMgb3IgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgYXV0b09wZW5TaG9ydGN1dEtleSgpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvT3BlblNob3J0Y3V0S2V5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBhdXRvT3BlblNob3J0Y3V0S2V5KHZhbHVlOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvT3BlblNob3J0Y3V0S2V5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgc291cmNlIG9mIGRhdGEgdG8gcG9wdWxhdGUgdGhlIENvbWJvQm94LiBUaGUgZGF0YVNvdXJjZSBjYW4gYmUgcHJvdmlkZWQgaW4gc2V2ZXJhbCBmb3JtYXRzOi0gQW4gYXJyYXkgb2Ygc3RyaW5ncyBvciBudW1iZXJzLCB3aGVyZSBlYWNoIGl0ZW0gYmVjb21lcyBhIHNlbGVjdGFibGUgb3B0aW9uIGluIHRoZSBDb21ib0JveC4tIEFuIGFycmF5IG9mIG9iamVjdHMsIHdoZXJlIGVhY2ggb2JqZWN0IHJlcHJlc2VudHMgYSBsaXN0IGl0ZW0gYW5kIGl0cyBwcm9wZXJ0aWVzIGRlZmluZSB0aGUgZGlzcGxheWVkIGluZm9ybWF0aW9uIGFuZCBhc3NvY2lhdGVkIHZhbHVlIChlLmcuLCBsYWJlbCBmb3IgZGlzcGxheSB0ZXh0LCB2YWx1ZSBmb3IgdGhlIHVuZGVybHlpbmcgdmFsdWUsIGFuZCBvcHRpb25hbGx5IGdyb3VwIHRvIGNhdGVnb3JpemUgaXRlbXMpLi0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXMgaW4gZWl0aGVyIG9mIHRoZSBhYm92ZSBmb3JtYXRzLCBlbmFibGluZyBkeW5hbWljIG9yIGFzeW5jaHJvbm91cyBkYXRhIGxvYWRpbmcuVGhpcyBmbGV4aWJsZSBkYXRhU291cmNlIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHRoZSBDb21ib0JveCB0byBzdXBwb3J0IHNpbXBsZSBsaXN0cywgY2F0ZWdvcml6ZWQgbGlzdHMsIG9yIGR5bmFtaWNhbGx5IHJldHJpZXZlZCBkYXRhLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGF0YVNvdXJjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YVNvdXJjZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGF0YVNvdXJjZSh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRhdGFTb3VyY2UgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tYm8gYm94IGlzIGFjdGl2ZSBvciBpbmFjdGl2ZS4gV2hlbiBlbmFibGVkLCB1c2VycyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgY29tYm8gYm94IHRvIHNlbGVjdCBvciBlbnRlciBhIHZhbHVlLiBXaGVuIGRpc2FibGVkLCB0aGUgY29tYm8gYm94IGlzIG5vbi1pbnRlcmFjdGl2ZSBhbmQgYXBwZWFycyBncmF5ZWQgb3V0LCBwcmV2ZW50aW5nIGFueSB1c2VyIGlucHV0IG9yIHNlbGVjdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGV0aGVyIGEgdmlzdWFsIGluZGljYXRvciAoc3VjaCBhcyBhIGxvYWRpbmcgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXIpIHdpbGwgYmUgZGlzcGxheWVkIHdoaWxlIGZpbHRlcmluZyBkYXRhIGxvY2FsbHkgb3Igd2hlbiByZXRyaWV2aW5nIGl0ZW1zIGZyb20gYSByZW1vdGUgc291cmNlLiBUaGlzIGhlbHBzIGluZm9ybSB1c2VycyB0aGF0IGEgZmlsdGVyaW5nIG9wZXJhdGlvbiBvciBkYXRhIGZldGNoIGlzIGluIHByb2dyZXNzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3IoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNwbGF5TG9hZGluZ0luZGljYXRvciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzcGxheUxvYWRpbmdJbmRpY2F0b3IodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheUxvYWRpbmdJbmRpY2F0b3IgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciByZXRyaWV2ZXMgdGhlIGRpc3BsYXlNZW1iZXIgcHJvcGVydHkuIFRoZSBkaXNwbGF5TWVtYmVyIHByb3BlcnR5IGRlZmluZXMgdGhlIHNwZWNpZmljIGZpZWxkIG5hbWUgd2l0aGluIGVhY2ggZGF0YSBvYmplY3QgaW4gdGhlIGNvbGxlY3Rpb24gcHJvdmlkZWQgYnkgdGhlICdkYXRhU291cmNlJyBwcm9wZXJ0eS4gVGhpcyBmaWVsZCdzIHZhbHVlIGlzIHVzZWQgZm9yIGRpc3BsYXlpbmcgaXRlbXMgaW4gdGhlIFVJIGNvbXBvbmVudCwgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgd2hpY2ggYXR0cmlidXRlIG9mIHlvdXIgZGF0YSBvYmplY3RzIGlzIHNob3duIHRvIHRoZSB1c2VyLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGlzcGxheU1lbWJlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheU1lbWJlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzcGxheU1lbWJlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc3BsYXlNZW1iZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29udGFpbmVyIGZvciB0aGUgZHJvcGRvd24gZWxlbWVudC4gVGhlIGRyb3BEb3duQXBwZW5kVG8gcHJvcGVydHkgYWNjZXB0cyBhIENTUyBzZWxlY3RvciBzdHJpbmcsIGFuIGVsZW1lbnQncyBJRCwgdGhlIHN0cmluZyB2YWx1ZSAnYm9keScsIG9yIGEgZGlyZWN0IHJlZmVyZW5jZSB0byBhbiBIVE1MIGVsZW1lbnQuIEJ5IGRlZmF1bHQsIHRoZSBkcm9wZG93biBpcyBhcHBlbmRlZCB0byBpdHMgb3JpZ2luYWwgcGFyZW50IGluIHRoZSBET00uIEhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50cyBoYXMgQ1NTIHByb3BlcnRpZXMgKHN1Y2ggYXMgb3ZlcmZsb3c6IGhpZGRlbikgdGhhdCByZXN0cmljdCB0aGUgZHJvcGRvd24ncyB2aXNpYmlsaXR5LCB5b3UgY2FuIHNldCB0aGlzIHByb3BlcnR54oCUY29tbW9ubHkgdG8gJ2JvZHkn4oCUdG8gYXBwZW5kIHRoZSBkcm9wZG93biBkaXJlY3RseSB0byB0aGUgJmx0O2JvZHkmZ3Q7IGVsZW1lbnQgYW5kIGVuc3VyZSBpdCBkaXNwbGF5cyBwcm9wZXJseS5Qb3NzaWJsZSB2YWx1ZXM6LSBBIENTUyBzZWxlY3RvciBzdHJpbmcgKGUuZy4sICcuY29udGFpbmVyJyBvciAnI21haW5EaXYnKS0gVGhlIHN0cmluZyAnYm9keSctIEEgZGlyZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBIVE1MIGVsZW1lbnQtIEFuIGVsZW1lbnQncyBJRCAoYXMgYSBzdHJpbmcpLSBudWxsICh0byByZXNldCBhbmQgbW92ZSB0aGUgZHJvcGRvd24gYmFjayB0byBpdHMgb3JpZ2luYWwgcGFyZW50KVRoaXMgcHJvcGVydHkgaW1wcm92ZXMgY29tcGF0aWJpbGl0eSBpbiBsYXlvdXRzIHdpdGggcmVzdHJpY3RlZCBvdmVyZmxvdyBieSBhbGxvd2luZyB0aGUgZHJvcGRvd24gdG8gYmUgcmVuZGVyZWQgaW4gYSBjb250YWluZXIgb2YgeW91ciBjaG9vc2luZy4gUmVzZXR0aW5nIGRyb3BEb3duQXBwZW5kVG8gdG8gbnVsbCByZXN0b3JlcyB0aGUgZHJvcGRvd24gdG8gaXRzIGluaXRpYWwgcGxhY2VtZW50IHdpdGhpbiB0aGUgRE9NLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25BcHBlbmRUbygpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25BcHBlbmRUbyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25BcHBlbmRUbyh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duQXBwZW5kVG8gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZHJvcGRvd24gYnV0dG9uIHJlbGF0aXZlIHRvIGl0cyBhc3NvY2lhdGVkIGlucHV0IGZpZWxkIG9yIGNvbnRhaW5lci4gUG9zc2libGUgcG9zaXRpb25zIG1heSBpbmNsdWRlIFwibGVmdCxcIiBcInJpZ2h0LFwiIFwidG9wLFwiIG9yIFwiYm90dG9tLFwiIGFsbG93aW5nIGRldmVsb3BlcnMgdG8gY29udHJvbCB3aGVyZSB0aGUgZHJvcGRvd24gYnV0dG9uIGFwcGVhcnMgaW4gdGhlIHVzZXIgaW50ZXJmYWNlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25CdXR0b25Qb3NpdGlvbigpOiBEcm9wRG93bkJ1dHRvblBvc2l0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duQnV0dG9uUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duQnV0dG9uUG9zaXRpb24odmFsdWU6IERyb3BEb3duQnV0dG9uUG9zaXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25CdXR0b25Qb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgZHJvcGRvd24gbWVudS4gQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBtZWFucyB0aGUgZHJvcGRvd27igJlzIGhlaWdodCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgQ1NTIHZhcmlhYmxlLiBJZiBhIHNwZWNpZmljIHZhbHVlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBDU1MgdmFyaWFibGUgYW5kIHNldCB0aGUgZHJvcGRvd24gaGVpZ2h0IGV4cGxpY2l0bHkuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bkhlaWdodCgpOiBzdHJpbmcgfCBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25IZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duSGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25IZWlnaHQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgZHJvcGRvd24gbWVudS4gQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBtZWFucyB0aGUgZHJvcGRvd24ncyBtYXgtaGVpZ2h0IHdpbGwgYmUgY29udHJvbGxlZCBieSBhIENTUyB2YXJpYWJsZSBpbnN0ZWFkIG9mIGFuIGV4cGxpY2l0IHZhbHVlLiBJZiB5b3UgcHJvdmlkZSBhIHNwZWNpZmljIHZhbHVlIChlLmcuLCBcIjMwMHB4XCIgb3IgXCI1MHZoXCIpLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IENTUyB2YXJpYWJsZSBhbmQgZGlyZWN0bHkgc2V0IHRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgZHJvcGRvd24uICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bk1heEhlaWdodCgpOiBzdHJpbmcgfCBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25NYXhIZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duTWF4SGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25NYXhIZWlnaHQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgZHJvcGRvd24gbWVudS4gQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBtZWFucyB0aGUgZHJvcGRvd24ncyBtYXhpbXVtIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBhIGNvcnJlc3BvbmRpbmcgQ1NTIHZhcmlhYmxlLiBJZiBhIHNwZWNpZmljIHZhbHVlIGlzIHByb3ZpZGVkIChlLmcuLCBcIjMwMHB4XCIgb3IgXCI1MCVcIiksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIENTUyB2YXJpYWJsZSBhbmQgZGlyZWN0bHkgc2V0IHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBkcm9wZG93bi4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duTWF4V2lkdGgoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duTWF4V2lkdGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duTWF4V2lkdGgodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1heFdpZHRoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSBkcm9wZG93biBjb21wb25lbnQuIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgd2hpY2ggbWVhbnMgdGhlIGRyb3Bkb3duJ3MgbWluaW11bSBoZWlnaHQgaXMgZGV0ZXJtaW5lZCBieSBhIGNvcnJlc3BvbmRpbmcgQ1NTIHZhcmlhYmxlLiBJZiBhIHNwZWNpZmljIHZhbHVlIGlzIHByb3ZpZGVkIGZvciB0aGlzIHByb3BlcnR5LCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBDU1MgdmFyaWFibGUgYW5kIGV4cGxpY2l0bHkgc2V0IHRoZSBkcm9wZG93bidzIG1pbmltdW0gaGVpZ2h0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25NaW5IZWlnaHQoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duTWluSGVpZ2h0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkcm9wRG93bk1pbkhlaWdodCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duTWluSGVpZ2h0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgbWluaW11bSB3aWR0aCBvZiB0aGUgZHJvcGRvd24gY29tcG9uZW50LiBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpLiBXaGVuIGxlZnQgdW5zZXQsIHRoZSBkcm9wZG93buKAmXMgbWluaW11bSB3aWR0aCBpcyBkZXRlcm1pbmVkIGJ5IGEgQ1NTIHZhcmlhYmxlLCBhbGxvd2luZyBmb3IgZmxleGlibGUgc3R5bGluZyB0aHJvdWdoIGV4dGVybmFsIHN0eWxlc2hlZXRzLiBUbyBvdmVycmlkZSB0aGUgQ1NTIHZhbHVlLCBhc3NpZ24gYSBzcGVjaWZpYyB3aWR0aCB2YWx1ZSAoZS5nLiwgXCIyMDBweFwiIG9yIFwiMTByZW1cIikgdG8gdGhpcyBwcm9wZXJ0eS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duTWluV2lkdGgoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duTWluV2lkdGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duTWluV2lkdGgodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bk1pbldpZHRoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9yIGFuaW1hdGlvbiBpbiB3aGljaCB0aGUgZHJvcGRvd24gbWVudSB3aWxsIGFwcGVhciB3aGVuIGFjdGl2YXRlZCwgc3VjaCBhcyBvcGVuaW5nIHVwd2FyZHMsIGRvd253YXJkcywgb3Igd2l0aCBhIHNwZWNpZmljIHRyYW5zaXRpb24gZWZmZWN0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25PcGVuTW9kZSgpOiBEcm9wRG93bk9wZW5Nb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duT3Blbk1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duT3Blbk1vZGUodmFsdWU6IERyb3BEb3duT3Blbk1vZGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25PcGVuTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJZiB0aGlzIHByb3BlcnR5IGlzIGVuYWJsZWQsIG9wZW5pbmcgdGhlIGVsZW1lbnQncyBkcm9wZG93biB3aWxsIGluc2VydCBhIHRyYW5zcGFyZW50IG92ZXJsYXkgYmV0d2VlbiB0aGUgZHJvcGRvd24gYW5kIHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudC4gVGhpcyBvdmVybGF5IGNvdmVycyB0aGUgZW50aXJlIHZpZXdwb3J0IGV4Y2VwdCBmb3IgdGhlIGRyb3Bkb3duIGl0c2VsZiwgY2FwdHVyaW5nIGFsbCBjbGljayBldmVudHMgb3V0c2lkZSB0aGUgZHJvcGRvd24uIEFzIGEgcmVzdWx0LCBhbnkgY2xpY2tzIG91dHNpZGUgdGhlIHBvcHVwIHdpbGwgaW50ZXJhY3Qgd2l0aCB0aGUgb3ZlcmxheSBpbnN0ZWFkIG9mIG90aGVyIGVsZW1lbnRzIG9uIHRoZSBwYWdlLCBhbGxvd2luZyB5b3UgdG8gcmVsaWFibHkgZGV0ZWN0IGFuZCBoYW5kbGUgb3V0c2lkZSBjbGlja3MgKHN1Y2ggYXMgdG8gY2xvc2UgdGhlIGRyb3Bkb3duKSB3aXRob3V0IHVuaW50ZW50aW9uYWxseSB0cmlnZ2VyaW5nIG90aGVyIERPTSBlbGVtZW50cy4gKi9cblx0QElucHV0KClcblx0Z2V0IGRyb3BEb3duT3ZlcmxheSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duT3ZlcmxheSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25PdmVybGF5KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duT3ZlcmxheSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHRleHQgb3IgY29udGVudCB0byBiZSBzaG93biBpbiB0aGUgZHJvcGRvd24gYXMgYSBwbGFjZWhvbGRlciB3aGVuIHRoZSBkcm9wZG93biBjb250YWlucyBubyBzZWxlY3RhYmxlIGl0ZW1zLiBUaGlzIHBsYWNlaG9sZGVyIHByb3ZpZGVzIGd1aWRhbmNlIG9yIGNvbnRleHQgdG8gdGhlIHVzZXIsIGluZGljYXRpbmcgdGhhdCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGF2YWlsYWJsZSBvcHRpb25zLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25QbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25QbGFjZWhvbGRlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcERvd25QbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duUGxhY2Vob2xkZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgcmVsYXRpdmUgdG8gaXRzIHRyaWdnZXIgZWxlbWVudCB3aGVuIG9wZW5lZCAoZS5nLiwgYWJvdmUsIGJlbG93LCBsZWZ0LCBvciByaWdodCkuIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGVyZSB0aGUgZHJvcGRvd24gYXBwZWFycyBvbiB0aGUgc2NyZWVuIGluIHJlbGF0aW9uIHRvIHRoZSBlbGVtZW50IHRoYXQgYWN0aXZhdGVzIGl0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcERvd25Qb3NpdGlvbigpOiBEcm9wRG93blBvc2l0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BEb3duUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BEb3duUG9zaXRpb24odmFsdWU6IERyb3BEb3duUG9zaXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25Qb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkcm9wZG93biBtZW51LiBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBhbiBlbXB0eSBzdHJpbmcsIGFsbG93aW5nIHRoZSBkcm9wZG93bidzIHdpZHRoIHRvIGJlIGRldGVybWluZWQgYnkgdGhlIGFzc29jaWF0ZWQgQ1NTIHZhcmlhYmxlICh0eXBpY2FsbHkgdmlhIGN1c3RvbSBwcm9wZXJ0aWVzIG9yIHRoZW1lIHNldHRpbmdzKS4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgb3ZlcnJpZGVzIHRoZSBDU1MgdmFyaWFibGUgYW5kIGRpcmVjdGx5IHNldHMgdGhlIGRyb3Bkb3duJ3Mgd2lkdGguICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wRG93bldpZHRoKCk6IHN0cmluZyB8IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wRG93bldpZHRoIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkcm9wRG93bldpZHRoKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcERvd25XaWR0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IHNob3VsZCByZXNwb25kIHdoZW4gdGhlIEVzY2FwZSBrZXkgaXMgcHJlc3NlZCBieSB0aGUgdXNlci4gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgeW91IHRvIGRlZmluZSBhY3Rpb25zIHN1Y2ggYXMgY2xvc2luZyBhIG1vZGFsLCBkaXNtaXNzaW5nIGEgZGlhbG9nLCBvciB0cmlnZ2VyaW5nIGEgY3VzdG9tIGV2ZW50IHdoZW4gdGhlIEVzY2FwZSBrZXkgaXMgZGV0ZWN0ZWQgd2hpbGUgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBhY3RpdmUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBlc2NLZXlNb2RlKCk6IENvbWJvQm94RXNjS2V5TW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5lc2NLZXlNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBlc2NLZXlNb2RlKHZhbHVlOiBDb21ib0JveEVzY0tleU1vZGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZXNjS2V5TW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hldGhlciB0aGUgZmlsdGVyaW5nIGZlYXR1cmUgaXMgYWN0aXZlLiBXaGVuIHNldCB0byB0cnVlLCB1c2VycyBjYW4gYXBwbHkgZmlsdGVycyB0byBuYXJyb3cgZG93biBkaXNwbGF5ZWQgZGF0YTsgd2hlbiBmYWxzZSwgZmlsdGVyaW5nIG9wdGlvbnMgYXJlIGRpc2FibGVkIGFuZCBhbGwgZGF0YSBpcyBzaG93biB3aXRob3V0IHJlc3RyaWN0aW9uLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZmlsdGVyYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZpbHRlcmFibGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZpbHRlcmFibGUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlsdGVyYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHBsYWNlaG9sZGVyIHRleHQgZGlzcGxheWVkIGluc2lkZSB0aGUgZHJvcGRvd24gbGlzdOKAmXMgZmlsdGVyIGlucHV0IGZpZWxkLCBndWlkaW5nIHVzZXJzIG9uIHdoYXQgdG8gZW50ZXIgd2hlbiBzZWFyY2hpbmcgb3IgZmlsdGVyaW5nIG9wdGlvbnMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmaWx0ZXJJbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5maWx0ZXJJbnB1dFBsYWNlaG9sZGVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBmaWx0ZXJJbnB1dFBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlsdGVySW5wdXRQbGFjZWhvbGRlciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGZpbHRlcmluZyBiZWhhdmlvciBmb3IgdGhlIENvbWJvIEJveCwgY29udHJvbGxpbmcgaG93IHVzZXIgaW5wdXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhdmFpbGFibGUgb3B0aW9ucyAoZS5nLiwgY29udGFpbnMsIHN0YXJ0cyB3aXRoLCBvciBleGFjdCBtYXRjaCkuIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB3aGljaCBvcHRpb25zIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3Bkb3duIGxpc3QgYXMgdGhlIHVzZXIgdHlwZXMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmaWx0ZXJNb2RlKCk6IEZpbHRlck1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlsdGVyTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZmlsdGVyTW9kZSh2YWx1ZTogRmlsdGVyTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5maWx0ZXJNb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gZW5hYmxlZCwgdGhpcyBvcHRpb24gYXV0b21hdGljYWxseSBncm91cHMgdGhlIGl0ZW1zIGJhc2VkIG9uIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCBpdGVtJ3MgdmFsdWUgb3IgbGFiZWwuIE5vdGU6IFRoaXMgZ3JvdXBpbmcgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgZGF0YVNvdXJjZSBkb2VzIG5vdCBhbHJlYWR5IGluY2x1ZGUgcHJlZGVmaW5lZCBncm91cHMuIElmIHRoZSBkYXRhU291cmNlIGlzIGFscmVhZHkgZ3JvdXBlZCwgdGhpcyBzZXR0aW5nIHdpbGwgaGF2ZSBubyBlZmZlY3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBncm91cGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZ3JvdXBlZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZ3JvdXBlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5ncm91cGVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGljaCBhdHRyaWJ1dGUgb2YgdGhlIGRhdGFTb3VyY2Ugb2JqZWN0IHNob3VsZCBiZSB1c2VkIHRvIGdyb3VwIGl0ZW1zIGluIHRoZSBMaXN0Qm94LiBCeSBkZWZhdWx0LCBpZiB0aGlzIHByb3BlcnR5IChncm91cE1lbWJlcikgaXMgbm90IHNldCwgdGhlIExpc3RCb3ggd2lsbCB1c2UgdGhlICdncm91cCcgcHJvcGVydHkgZnJvbSBlYWNoIGRhdGFTb3VyY2UgaXRlbSB0byBvcmdhbml6ZSBncm91cHMuIFRoaXMgcHJvcGVydHkgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGxvYWRpbmcgZGF0YSBmcm9tIGEgSlNPTiBmaWxlLCBhbGxvd2luZyB5b3UgdG8gZGVzaWduYXRlIGEgc3BlY2lmaWMgcHJvcGVydHkgZnJvbSB5b3VyIGRhdGEgb2JqZWN0cyB0byBkZXRlcm1pbmUgdGhlIGdyb3VwaW5nIG9mIGl0ZW1z4oCUZXNwZWNpYWxseSBpZiB5b3VyIEpTT04gc3RydWN0dXJlIHVzZXMgYSBkaWZmZXJlbnQgcHJvcGVydHkgbmFtZSBmb3IgZ3JvdXBpbmcuICovXG5cdEBJbnB1dCgpXG5cdGdldCBncm91cE1lbWJlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZ3JvdXBNZW1iZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGdyb3VwTWVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZ3JvdXBNZW1iZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGlzcGxheXMgc3VwcGxlbWVudGFyeSBoZWxwZXIgdGV4dCBiZW5lYXRoIHRoZSBlbGVtZW50LiBUaGlzIGhpbnQgaXMgdmlzaWJsZSBleGNsdXNpdmVseSB3aGVuIHRoZSBlbGVtZW50IGlzIGluIGZvY3VzLCBwcm92aWRpbmcgY29udGV4dHVhbCBndWlkYW5jZSB0byB1c2VycyBhcyB0aGV5IGludGVyYWN0IHdpdGggdGhlIGZpZWxkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaGludCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGludCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGludCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIGlzIGRpc3BsYXllZCB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnUgd2hlbiB0aGUgY29udGVudCBleGNlZWRzIHRoZSBhdmFpbGFibGUgd2lkdGguICovXG5cdEBJbnB1dCgpXG5cdGdldCBob3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eSgpOiBIb3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5ob3Jpem9udGFsU2Nyb2xsQmFyVmlzaWJpbGl0eSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaG9yaXpvbnRhbFNjcm9sbEJhclZpc2liaWxpdHkodmFsdWU6IEhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5IHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lmhvcml6b250YWxTY3JvbGxCYXJWaXNpYmlsaXR5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIHByb3BlcnR5IG5hbWUgb2YgYSBMaXN0IGl0ZW0gd2hvc2UgdmFsdWUgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IGZpZWxkIHdoZW4gYSBMaXN0SXRlbSBpcyBzZWxlY3RlZC4gVGhpcyBhbGxvd3MgZGV2ZWxvcGVycyB0byBjb250cm9sIHdoaWNoIHByb3BlcnR5IG9mIGVhY2ggaXRlbSBpcyBzaG93biBpbiB0aGUgaW5wdXQsIHN1Y2ggYXMgZGlzcGxheWluZyB0aGUgaXRlbSdzIHZhbHVlIGluc3RlYWQgb2YgaXRzIGxhYmVsLiBCeSBkZWZhdWx0LCB0aGUgbGFiZWwgcHJvcGVydHkgaXMgdXNlZCBmb3IgZGlzcGxheS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSBkaXNwbGF5ZWQgY29udGVudCwgZm9yIGV4YW1wbGUsIHRvIHNob3cgYSB1bmlxdWUgaWRlbnRpZmllciBvciB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZGVzY3JpcHRpdmUgbGFiZWwuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbnB1dE1lbWJlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5wdXRNZW1iZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGlucHV0TWVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5wdXRNZW1iZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB0eXBlIG9mIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgZmllbGQgYW5kIGluZm9ybXMgdGhlIGJyb3dzZXIgYWJvdXQgdGhlIG5hdHVyZSBvZiB0aGUgZGF0YSB0byBiZSBlbnRlcmVkLiBUaGlzIGd1aWRhbmNlIGFsbG93cyB1c2VyIGFnZW50cyAoc3VjaCBhcyBicm93c2VycyBhbmQgcGFzc3dvcmQgbWFuYWdlcnMpIHRvIGRldGVybWluZSBpZiB0aGV5IGNhbiBwcm92aWRlIGF1dG9tYXRlZCBhc3Npc3RhbmNl4oCUbGlrZSBhdXRvZmlsbGluZyByZWxldmFudCB2YWx1ZXPigJR3aGVuIHRoZSBlbGVtZW50IGlzIHVzZWQgaW4gYSBmb3JtLiBUaGUgdmFsdWUgYXNzaWduZWQgdG8gdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSBtYXBzIHRvIHRoZSBzdGFuZGFyZCBIVE1MIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUuIENvbW1vbiB2YWx1ZXMgaW5jbHVkZSAnb24nIChlbmFibGUgYXV0b2NvbXBsZXRlKSwgJ29mZicgKGRpc2FibGUgYXV0b2NvbXBsZXRlKSwgJ25hbWUnIChmdWxsIG5hbWUpLCAnb3JnYW5pemF0aW9uJyAoY29tcGFueSBvciBvcmdhbml6YXRpb24pLCAnZW1haWwnLCAnc3RyZWV0LWFkZHJlc3MnLCBhbmQgbWFueSBvdGhlcnMsIGFzIHNwZWNpZmllZCBieSB0aGUgSFRNTCBzdGFuZGFyZC4gVXNpbmcgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW1wcm92ZXMgdXNlciBleHBlcmllbmNlLCBlbmhhbmNlcyBhY2Nlc3NpYmlsaXR5LCBhbmQgaGVscHMgbWFpbnRhaW4gcHJpdmFjeSBhbmQgc2VjdXJpdHkgc3RhbmRhcmRzIHdpdGhpbiB3ZWIgZm9ybXMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbnB1dFB1cnBvc2UoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmlucHV0UHVycG9zZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW5wdXRQdXJwb3NlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5wdXRQdXJwb3NlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoZSAnSW5jcmVtZW50YWxTZWFyY2hEZWxheScgcHJvcGVydHkgZGVmaW5lcyB0aGUgZHVyYXRpb24sIGluIG1pbGxpc2Vjb25kcywgdG8gd2FpdCBhZnRlciB0aGUgdXNlciBzdG9wcyB0eXBpbmcgYmVmb3JlIGNsZWFyaW5nIHRoZSBwcmV2aW91cyBzZWFyY2ggcXVlcnkuIFRoaXMgdGltZXIgYmVnaW5zIGFzIHNvb24gYXMgdGhlIHVzZXIgZmluaXNoZXMgdHlwaW5nLiBEdXJpbmcgdGhpcyBkZWxheSBwZXJpb2QsIG5vIG5ldyBzZWFyY2ggcXVlcnkgd2lsbCBiZSBpbml0aWF0ZWQuIE9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheSBoYXMgZWxhcHNlZCB3aWxsIHRoZSBjdXJyZW50IHNlYXJjaCBpbnB1dCBiZSBjbGVhcmVkLCBhbGxvd2luZyBhIG5ldyBzZWFyY2ggcXVlcnkgdG8gYmUgc3RhcnRlZC4gVGhpcyBoZWxwcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgdXNlciBleHBlcmllbmNlIGJ5IHByZXZlbnRpbmcgdW5uZWNlc3Nhcnkgb3IgcHJlbWF0dXJlIHF1ZXJpZXMgd2hpbGUgdGhlIHVzZXIgaXMgc3RpbGwgZW50ZXJpbmcgdGhlaXIgc2VhcmNoIHRlcm1zLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaW5jcmVtZW50YWxTZWFyY2hEZWxheSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5jcmVtZW50YWxTZWFyY2hEZWxheSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW5jcmVtZW50YWxTZWFyY2hEZWxheSh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmluY3JlbWVudGFsU2VhcmNoRGVsYXkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyBvciByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgbW9kZSBvZiBpbmNyZW1lbnRhbCBzZWFyY2guIEJ5IGRlZmF1bHQsIGluY3JlbWVudGFsIHNlYXJjaCBpcyBlbmFibGVkLCBhbGxvd2luZyB1c2VycyB0byB0eXBlIHdoaWxlIHRoZSBkcm9wZG93biBpcyBmb2N1c2VkIHRvIHF1aWNrbHkgZmlsdGVyIGFuZCBoaWdobGlnaHQgbWF0Y2hpbmcgb3B0aW9ucy4gTW9kaWZ5aW5nIHRoaXMgc2V0dGluZyBjb250cm9scyBob3cgdXNlciBpbnB1dCBpcyBwcm9jZXNzZWQgZm9yIHNlYXJjaGluZyB3aXRoaW4gdGhlIGRyb3Bkb3duIGxpc3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbmNyZW1lbnRhbFNlYXJjaE1vZGUoKTogU2VhcmNoTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmNyZW1lbnRhbFNlYXJjaE1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGluY3JlbWVudGFsU2VhcmNoTW9kZSh2YWx1ZTogU2VhcmNoTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmNyZW1lbnRhbFNlYXJjaE1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBoZWlnaHQgKGluIHBpeGVscykgZm9yIGVhY2ggbGlzdCBpdGVtIHdoZW4gcmVuZGVyaW5nIHRoZSBsaXN0LiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIGxpc3QgdmlydHVhbGl6YXRpb24gaXMgZW5hYmxlZCwgYXMgaXQgaGVscHMgb3B0aW1pemUgcmVuZGVyaW5nIHBlcmZvcm1hbmNlIGJ5IGFsbG93aW5nIHRoZSBjb21wb25lbnQgdG8gY2FsY3VsYXRlIGFuZCByZW5kZXIgb25seSB0aGUgdmlzaWJsZSBpdGVtcy4gKi9cblx0QElucHV0KClcblx0Z2V0IGl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1IZWlnaHQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGl0ZW1IZWlnaHQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtSGVpZ2h0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBvZiBlYWNoIGl0ZW0uIFRoaXMgc2V0dGluZyBkZXRlcm1pbmVzIGhvdyB0aGUgd2lkdGggb2YgYW4gaXRlbSBpcyBtZWFzdXJlZCwgc3VjaCBhcyB1c2luZyB0aGUgaXRlbSdzIGludHJpbnNpYyBjb250ZW50IHNpemUsIGEgZml4ZWQgdmFsdWUsIG9yIGEgcGVyY2VudGFnZSBvZiB0aGUgY29udGFpbmVyLiBBZGp1c3QgdGhpcyBwYXJhbWV0ZXIgdG8gY29udHJvbCBob3cgaXRlbSB3aWR0aHMgYXJlIGRldGVybWluZWQgd2l0aGluIHRoZSBsYXlvdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpdGVtTWVhc3VyZU1vZGUoKTogTGlzdEl0ZW1NZWFzdXJlTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtTWVhc3VyZU1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGl0ZW1NZWFzdXJlTW9kZSh2YWx1ZTogTGlzdEl0ZW1NZWFzdXJlTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtTWVhc3VyZU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQSBnZXR0ZXIgbWV0aG9kIHRoYXQgcmV0cmlldmVzIGFuZCByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGxpc3QgKCcnKSBlbGVtZW50cyBjdXJyZW50bHkgcHJlc2VudCB3aXRoaW4gdGhlIGRyb3Bkb3duIG1lbnUuIFRoaXMgYWxsb3dzIHlvdSB0byBlYXNpbHkgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIGV2ZXJ5IGl0ZW0gZGlzcGxheWVkIGluIHRoZSBkcm9wZG93bi4gKi9cblx0QElucHV0KClcblx0Z2V0IGl0ZW1zKCk6IHtsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfVtdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1zIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBpdGVtcyh2YWx1ZToge2xhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9W10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaXRlbXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhlIGl0ZW1UZW1wbGF0ZSBwcm9wZXJ0eSBpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgSUQgb2YgYW4gSFRNTFRlbXBsYXRlRWxlbWVudCBwcmVzZW50IGluIHRoZSBET00uIFRoaXMgdGVtcGxhdGUgaXMgdXNlZCB0byBkZWZpbmUgYW5kIGN1c3RvbWl6ZSB0aGUgc3RydWN0dXJlIGFuZCBjb250ZW50IG9mIGluZGl2aWR1YWwgbGlzdCBpdGVtcywgYWxsb3dpbmcgZGV2ZWxvcGVycyB0byBjb250cm9sIGhvdyBlYWNoIGl0ZW0gYXBwZWFycyB3aGVuIHJlbmRlcmVkIGluIHRoZSBsaXN0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaXRlbVRlbXBsYXRlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pdGVtVGVtcGxhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGl0ZW1UZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lml0ZW1UZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEaXNwbGF5cyBhIHNtYWxsIHRleHQgbGFiZWwgcG9zaXRpb25lZCBhYm92ZSB0aGUgZWxlbWVudCwgdHlwaWNhbGx5IHVzZWQgdG8gcHJvdmlkZSBjb250ZXh0LCBpbnN0cnVjdGlvbnMsIG9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdXNlcnMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsYWJlbCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSB0ZXh0IHRoYXQgYXBwZWFycyBhbG9uZ3NpZGUgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gdGhlIGxvYWRlciBpcyB2aXNpYmxlIGFuZCBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb21wb25lbnQuIFRoaXMgdGV4dCBwcm92aWRlcyB1c2VycyB3aXRoIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gb3Igc3RhdHVzIHVwZGF0ZXMgZHVyaW5nIGxvYWRpbmcuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2FkaW5nSW5kaWNhdG9yUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvYWRpbmdJbmRpY2F0b3JQbGFjZWhvbGRlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9hZGluZ0luZGljYXRvclBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9hZGluZ0luZGljYXRvclBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZXhhY3QgbG9jYXRpb24gb24gdGhlIHVzZXIgaW50ZXJmYWNlIHdoZXJlIHRoZSBsb2FkaW5nIGluZGljYXRvciB3aWxsIGJlIGRpc3BsYXllZCwgc3VjaCBhcyBhdCB0aGUgdG9wLCBjZW50ZXIsIG9yIGJvdHRvbSBvZiB0aGUgc2NyZWVuIG9yIGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGxvYWRpbmdJbmRpY2F0b3JQb3NpdGlvbigpOiBWZXJ0aWNhbEFsaWdubWVudCB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2FkaW5nSW5kaWNhdG9yUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvYWRpbmdJbmRpY2F0b3JQb3NpdGlvbih2YWx1ZTogVmVydGljYWxBbGlnbm1lbnQgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9hZGluZ0luZGljYXRvclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgcmV0cmlldmVzIHRoZSB1bmxvY2tLZXksIGEgdW5pcXVlIHZhbHVlIHJlcXVpcmVkIHRvIGdyYW50IGFjY2VzcyB0byB0aGUgcHJvZHVjdOKAmXMgcHJlbWl1bSBmZWF0dXJlcyBvciBhY3RpdmF0ZSBpdHMgZnVsbCBmdW5jdGlvbmFsaXR5LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdW5sb2NrS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmxvY2tLZXkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHVubG9ja0tleSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVubG9ja0tleSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgb3IgcmV0cmlldmVzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHNldHRpbmcgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB3aGljaCBsYW5ndWFnZSBpcyB1c2VkIHdoZW4gZGlzcGxheWluZyBjb250ZW50IGZyb20gdGhlIG1lc3NhZ2VzIHByb3BlcnR5LCBhbGxvd2luZyBmb3IgbG9jYWxpemF0aW9uIGFuZCBpbnRlcm5hdGlvbmFsaXphdGlvbiBvZiBkaXNwbGF5ZWQgbWVzc2FnZXMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGEgc3VwcG9ydGVkIGxhbmd1YWdlIGNvZGUgKGUuZy4sIFwiZW5cIiwgXCJmclwiKSB0byBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIHRyYW5zbGF0aW9ucyBmcm9tIHRoZSBtZXNzYWdlcyBvYmplY3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NhbGUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiBtZXNzYWdlcyByZXR1cm5lZCBieSB0aGUgTG9jYWxpemF0aW9uIE1vZHVsZS4gVXNlIHRoaXMgY2FsbGJhY2sgdG8gbW9kaWZ5IG1lc3NhZ2UgdGV4dCwgYXBwbHkgZHluYW1pYyB2YWx1ZXMsIG9yIGltcGxlbWVudCBjdXN0b20gZm9ybWF0dGluZyBsb2dpYyBiZWZvcmUgdGhlIGxvY2FsaXplZCBtZXNzYWdlcyBhcmUgZGVsaXZlcmVkIHRvIHlvdXIgYXBwbGljYXRpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxpemVGb3JtYXRGdW5jdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgb3IgcmV0cmlldmVzIGFuIG9iamVjdCBjb250YWluaW5nIGxvY2FsaXplZCBzdHJpbmcgdmFsdWVzIHVzZWQgd2l0aGluIHRoZSB3aWRnZXTigJlzIHVzZXIgaW50ZXJmYWNlLiBUaGlzIHByb3BlcnR5IGVuYWJsZXMgdGhlIGN1c3RvbWl6YXRpb24gYW5kIHRyYW5zbGF0aW9uIG9mIFVJIHRleHQgZm9yIGRpZmZlcmVudCBsYW5ndWFnZXMgb3IgcmVnaW9ucy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoIHRoZSBsb2NhbGUgcHJvcGVydHksIGFsbG93aW5nIHlvdSB0byBlYXNpbHkgcHJvdmlkZSBvciB1cGRhdGUgbG9jYWxpemVkIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBsb2NhbGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtZXNzYWdlcygpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1lc3NhZ2VzKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGEgdXNlciBtdXN0IGVudGVyIGluIHRoZSBpbnB1dCBmaWVsZCBiZWZvcmUgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlIGlzIGFjdGl2YXRlZCBhbmQgc3VnZ2VzdGlvbnMgYXJlIGRpc3BsYXllZC4gKi9cblx0QElucHV0KClcblx0Z2V0IG1pbkxlbmd0aCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluTGVuZ3RoIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtaW5MZW5ndGgodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVudGVyZWQgaW50byB0aGUgaW5wdXQgZmllbGQuIEFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYmV5b25kIHRoaXMgbGltaXQgd2lsbCBub3QgYmUgYWNjZXB0ZWQuIFRoaXMgaGVscHMgZW5mb3JjZSBkYXRhIHZhbGlkYXRpb24gYW5kIGNvbnNpc3RlbmN5IGZvciB1c2VyIGlucHV0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXhMZW5ndGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQncyBuYW1lIGF0dHJpYnV0ZS4gVGhlIG5hbWUgYXR0cmlidXRlIHVuaXF1ZWx5IGlkZW50aWZpZXMgZm9ybSBlbGVtZW50cyB3aGVuIHN1Ym1pdHRpbmcgSFRNTCBmb3JtcywgYWxsb3dpbmcgdGhlIGZvcm0gZGF0YSB0byBiZSBvcmdhbml6ZWQgYW5kIGFjY2Vzc2VkIGJ5IG5hbWUgb24gdGhlIHNlcnZlciBzaWRlLiBUaGlzIGF0dHJpYnV0ZSBpcyBlc3NlbnRpYWwgZm9yIGdyb3VwaW5nIGZvcm0gY29udHJvbHMgYW5kIGFjY3VyYXRlbHkgdHJhbnNtaXR0aW5nIHVzZXIgaW5wdXQgZHVyaW5nIGZvcm0gc3VibWlzc2lvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IG5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm5hbWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5uYW1lID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgdmlzaWJsZSAob3Blbikgb3IgaGlkZGVuIChjbG9zZWQpIGluIHRoZSB1c2VyIGludGVyZmFjZS4gKi9cblx0QElucHV0KClcblx0Z2V0IG9wZW5lZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW5lZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgb3BlbmVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW5lZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHBsYWNlaG9sZGVyIHRleHQgdGhhdCBhcHBlYXJzIGluc2lkZSB0aGUgaW5wdXQgZmllbGQgd2hlbiBpdCBpcyBlbXB0eSwgcHJvdmlkaW5nIGd1aWRhbmNlIG9yIGV4YW1wbGUgY29udGVudCB0byB0aGUgdXNlci4gKi9cblx0QElucHV0KClcblx0Z2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyBhbnkgdXNlciBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgZWxlbWVudCwgaW5jbHVkaW5nIGNsaWNraW5nLCB0YXBwaW5nLCBzZWxlY3RpbmcsIGhvdmVyaW5nLCBvciBmb2N1c2luZy4gV2hpbGUgdGhpcyBpcyBlbmFibGVkLCB0aGUgZWxlbWVudCB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlLCBrZXlib2FyZCwgb3IgdG91Y2ggZXZlbnRzLCBlZmZlY3RpdmVseSBtYWtpbmcgaXQgbm9uLWludGVyYWN0aXZlIGZvciB1c2Vycy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlYWRvbmx5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyBvciByZXRyaWV2ZXMgYSB2YWx1ZSB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZWxlbWVudOKAmXMgdGV4dCBkaXJlY3Rpb24gaXMgc2V0IHRvIHN1cHBvcnQgcmlnaHQtdG8tbGVmdCAoUlRMKSBsYW5ndWFnZXMsIHN1Y2ggYXMgQXJhYmljIG9yIEhlYnJldy4gV2hlbiBlbmFibGVkLCB0aGUgZWxlbWVudCBhbmQgaXRzIGNvbnRlbnQgYXJlIGFsaWduZWQgYWNjb3JkaW5nIHRvIFJUTCBmb3JtYXR0aW5nLCBlbnN1cmluZyBwcm9wZXIgZGlzcGxheSBmb3IgbG9jYWxlcyB0aGF0IHVzZSByaWdodC10by1sZWZ0IHNjcmlwdHMuICovXG5cdEBJbnB1dCgpXG5cdGdldCByaWdodFRvTGVmdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByaWdodFRvTGVmdCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yaWdodFRvTGVmdCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcmVzaXplIGluZGljYXRvciBsb2NhdGVkIGluIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIHRoZSBkcm9wZG93biBjb21wb25lbnQuIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSwgdXNlcnMgd2lsbCBzZWUgYSBoYW5kbGUgYWxsb3dpbmcgdGhlbSB0byByZXNpemUgdGhlIGRyb3Bkb3duIGFyZWEuIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgcmVzaXplTW9kZSBwcm9wZXJ0eSB0byBkZWZpbmUgYm90aCB0aGUgYXZhaWxhYmlsaXR5IGFuZCBiZWhhdmlvciBvZiB0aGUgcmVzaXppbmcgZmVhdHVyZS4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlc2l6ZUluZGljYXRvcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZUluZGljYXRvciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVzaXplSW5kaWNhdG9yKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZUluZGljYXRvciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hldGhlciB0aGUgZHJvcC1kb3duIG1lbnUgaXMgcmVzaXphYmxlIGJ5IHRoZSB1c2VyLiBJZiByZXNpemluZyBpcyBlbmFibGVkLCBhIHJlc2l6ZSBiYXIgd2lsbCBiZSBkaXNwbGF5ZWQgYWxvbmcgdGhlIHRvcCBvciBib3R0b20gZWRnZSBvZiB0aGUgZHJvcC1kb3duLCBhbGxvd2luZyB1c2VycyB0byBjbGljayBhbmQgZHJhZyB0byBhZGp1c3QgaXRzIGhlaWdodC4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIHJlc2l6ZSBiYXIgYW5kIHByZXZlbnRzIGFueSBtYW51YWwgcmVzaXppbmcgb2YgdGhlIGRyb3AtZG93biBjb21wb25lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCByZXNpemVNb2RlKCk6IFJlc2l6ZU1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzaXplTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVzaXplTW9kZSh2YWx1ZTogUmVzaXplTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVNb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgY29udGVudCBvciB2YWx1ZSB0aGF0IHdpbGwgYXBwZWFyIHdpdGhpbiB0aGUgaW5wdXQgZmllbGQsIGVpdGhlciBhcyBhIGRlZmF1bHQgdmFsdWUsIHVzZXItZW50ZXJlZCBkYXRhLCBvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29udGVudC4gVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoYXQgdGhlIHVzZXIgc2VlcyBhbmQgaW50ZXJhY3RzIHdpdGggaW5zaWRlIHRoZSBpbnB1dCBlbGVtZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0aW9uRGlzcGxheU1vZGUoKTogU2VsZWN0aW9uRGlzcGxheU1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRGlzcGxheU1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNlbGVjdGlvbkRpc3BsYXlNb2RlKHZhbHVlOiBTZWxlY3Rpb25EaXNwbGF5TW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25EaXNwbGF5TW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIHJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgaW5kZXhlcy4gVGhlIHNlbGVjdGVkIGluZGV4ZXMgcHJvcGVydHkgaXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBpbmRleGVzIG9mIHRoZSBpdGVtcyB0aGF0IGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQuIEVhY2ggdmFsdWUgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIHRoZSBwb3NpdGlvbiBvZiBhIHNlbGVjdGVkIGl0ZW0gd2l0aGluIHRoZSBvdmVyYWxsIGxpc3Qgb3IgY29sbGVjdGlvbi4gQXNzaWduaW5nIGEgbmV3IGFycmF5IHRvIHRoaXMgcHJvcGVydHkgdXBkYXRlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgaW5kZXhlczsgcmV0cmlldmluZyBpdCByZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyBhbiBhcnJheSBvZiBpbmRleGVzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0ZWRJbmRleGVzKCk6IG51bWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkSW5kZXhlcyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRJbmRleGVzKHZhbHVlOiBudW1iZXJbXSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4ZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gICBcIlNldHMgb3IgcmV0cmlldmVzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW5kZXhlcy4gVGhlICdzZWxlY3RlZCcgcHJvcGVydHkgaG9sZHMgYW4gYXJyYXkgb2YgdGhlIGluZGljZXMgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbXMgdGhhdCBhcmUgbWFya2VkIGFzIHNlbGVjdGVkLiBXaGVuIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSwgcHJvdmlkZSBhbiBhcnJheSBvZiBpbmRleGVzIHRvIHNwZWNpZnkgd2hpY2ggaXRlbXMgc2hvdWxkIGJlIHNlbGVjdGVkLiBXaGVuIGdldHRpbmcgdGhpcyBwcm9wZXJ0eSwgaXQgcmV0dXJucyB0aGUgYXJyYXkgb2YgaW5kZXhlcyBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcy5cIiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0ZWRWYWx1ZXMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNlbGVjdGVkVmFsdWVzKHZhbHVlOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlcyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYSB1c2VyIGlzIGFsbG93ZWQgdG8gc2VsZWN0IGF0IG9uZSB0aW1lLiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byAxLCBvbmx5IHNpbmdsZSBzZWxlY3Rpb24gaXMgcGVybWl0dGVkOyBoaWdoZXIgdmFsdWVzIGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnMgdXAgdG8gdGhlIGRlZmluZWQgbGltaXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzZWxlY3Rpb25Nb2RlKCk6IExpc3RTZWxlY3Rpb25Nb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbk1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNlbGVjdGlvbk1vZGUodmFsdWU6IExpc3RTZWxlY3Rpb25Nb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbk1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGl0ZW1zIGFyZSBhcnJhbmdlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byB0cnVlLCB0aGUgaXRlbXMgd2lsbCBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHk7IGlmIGZhbHNlLCB0aGUgb3JpZ2luYWwgb3JkZXIgd2lsbCBiZSBwcmVzZXJ2ZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzb3J0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNvcnRlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zb3J0ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBzb3J0aW5nIG9yZGVyIGZvciBkYXRhLCBhbGxvd2luZyB5b3UgdG8gY2hvb3NlIGJldHdlZW4gYXNjZW5kaW5nIChcImFzY1wiKSBmb3IgbG93ZXN0LXRvLWhpZ2hlc3Qgb3IgYWxwaGFiZXRpY2FsIEHigJNaIHNvcnRpbmcsIGFuZCBkZXNjZW5kaW5nIChcImRlc2NcIikgZm9yIGhpZ2hlc3QtdG8tbG93ZXN0IG9yIFrigJNBIHNvcnRpbmcuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzb3J0RGlyZWN0aW9uKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zb3J0RGlyZWN0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzb3J0RGlyZWN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc29ydERpcmVjdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHZpc3VhbCB0aGVtZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LiBUaGUgc2VsZWN0ZWQgdGhlbWUgY29udHJvbHMgdGhlIGVsZW1lbnTigJlzIGFwcGVhcmFuY2UsIGluY2x1ZGluZyBjb2xvcnMsIGZvbnRzLCBhbmQgb3RoZXIgc3R5bGlzdGljIHByb3BlcnRpZXMsIGVuc3VyaW5nIGEgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsIGFjcm9zcyB0aGUgdXNlciBpbnRlcmZhY2UuICovXG5cdEBJbnB1dCgpXG5cdGdldCB0aGVtZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRoZW1lKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgY3VzdG9tIGNvbnRlbnQgdG8gZGlzcGxheSB3aXRoaW4gZWFjaCB0b2tlbiB3aGVuIHRoZSBzZWxlY3Rpb25EaXNwbGF5TW9kZSBpcyBzZXQgdG8gXCJ0b2tlbnNcIi4gVG9rZW5zIHZpc3VhbGx5IHJlcHJlc2VudCBzZWxlY3RlZCBpdGVtcyBpbiBhIG11bHRpLXNlbGVjdCBpbnRlcmZhY2UgYW5kIGFyZSBvbmx5IGFwcGxpY2FibGUgd2hlbiBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZC4gVXNlIHRoaXMgb3B0aW9uIHRvIGN1c3RvbWl6ZSBob3cgZWFjaCB0b2tlbiBhcHBlYXJzLCBzdWNoIGFzIGRpc3BsYXlpbmcgc3BlY2lmaWMgdGV4dCwgaWNvbnMsIG9yIGFkZGl0aW9uYWwgZGF0YSBmb3IgZWFjaCBzZWxlY3RlZCBpdGVtLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdG9rZW5UZW1wbGF0ZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudG9rZW5UZW1wbGF0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdG9rZW5UZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRva2VuVGVtcGxhdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSWYgc2V0IHRvIHRydWUsIHRoZSBlbGVtZW50IHdpbGwgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSBrZXlib2FyZCBvciBtb3VzZSBmb2N1cywgbWFraW5nIGl0IGluYWNjZXNzaWJsZSB2aWEgdGFiIG5hdmlnYXRpb24gb3IgcHJvZ3JhbW1hdGljIGZvY3VzIG1ldGhvZHMuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmZvY3VzYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVuZm9jdXNhYmxlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB1bmZvY3VzYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHJldHJpZXZlIChnZXQpIG9yIGFzc2lnbiAoc2V0KSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuIFdoZW4gdXNlZCBhcyBhIGdldHRlciwgaXQgcmV0dXJucyB0aGUgcHJvcGVydHkncyBjdXJyZW50IHZhbHVlLiBXaGVuIHVzZWQgYXMgYSBzZXR0ZXIsIGl0IHVwZGF0ZXMgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4gKi9cblx0QElucHV0KClcblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC52YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hpY2ggcHJvcGVydHkgb2YgZWFjaCBpdGVtIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQgaXRlbS4gVGhlIHZhbHVlIGRlc2lnbmF0ZWQgYnkgdmFsdWVNZW1iZXIgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGl0ZW0ncyB2YWx1ZSBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBmdW5jdGlvbnMgc2ltaWxhcmx5IHRvIGdyb3VwTWVtYmVyLCBidXQgaXMgZm9jdXNlZCBvbiBpZGVudGlmeWluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdyb3VwLiB2YWx1ZU1lbWJlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gcG9wdWxhdGluZyBhIExpc3RCb3ggZnJvbSBhIEpTT04gZGF0YSBzb3VyY2UsIGFzIGl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBwcm9wZXJ0eSBvZiB5b3VyIGRhdGEgb2JqZWN0cyBzaG91bGQgc2VydmUgYXMgdGhlIHVuaXF1ZSB2YWx1ZSBmb3IgZWFjaCBpdGVtIGluIHRoZSBMaXN0Qm94LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdmFsdWVNZW1iZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlTWVtYmVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2YWx1ZU1lbWJlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlTWVtYmVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIgaXMgZGlzcGxheWVkIHdpdGhpbiB0aGUgY29udGVudCBhcmVhLCBhbGxvd2luZyB1c2VycyB0byBzY3JvbGwgdmVydGljYWxseSB3aGVuIHRoZSBjb250ZW50IGV4dGVuZHMgYmV5b25kIHRoZSB2aXNpYmxlIHJlZ2lvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IHZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSgpOiBWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2ZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkodmFsdWU6IFZlcnRpY2FsU2Nyb2xsQmFyVmlzaWJpbGl0eSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC52ZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHZpcnR1YWxpemF0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBDb21ib0JveC4gV2hlbiB2aXJ0dWFsaXphdGlvbiBpcyBlbmFibGVkLCB0aGUgQ29tYm9Cb3ggY2FuIGVmZmljaWVudGx5IGRpc3BsYXkgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBpdGVtc+KAlHN1Y2ggYXMgYSBtaWxsaW9u4oCUYnkgb25seSByZW5kZXJpbmcgdGhlIHZpc2libGUgaXRlbXMgaW4gdGhlIExpc3RCb3ggYW5kIGR5bmFtaWNhbGx5IGxvYWRpbmcgaXRlbXMgYXMgbmVlZGVkLiBUaGlzIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZXMgbWVtb3J5IHVzYWdlLCBlc3BlY2lhbGx5IHdpdGggbGFyZ2UgZGF0YSBzZXRzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdmlydHVhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC52aXJ0dWFsaXplZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdmlydHVhbGl6ZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmlydHVhbGl6ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2hhbmdlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24sIHN1Y2ggYXMgaGlnaGxpZ2h0aW5nIGRpZmZlcmVudCB0ZXh0IG9yIHNlbGVjdGluZyBhIG5ldyBpdGVtIGluIGEgbGlzdC4gSXQgYWxsb3dzIHlvdSB0byBkZXRlY3QgYW5kIHJlc3BvbmQgdG8gdXBkYXRlcyBpbiB0aGUgc2VsZWN0ZWQgY29udGVudCBvciBvcHRpb25zIHdpdGhpbiB0aGUgaW50ZXJmYWNlLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdGFkZGVkSXRlbXMsIFx0ZGlzYWJsZWQsIFx0aW5kZXgsIFx0bGFiZWwsIFx0cmVtb3ZlZEl0ZW1zLCBcdHNlbGVjdGVkLCBcdHZhbHVlKVxuXHQqICAgYWRkZWRJdGVtcyAtIEFuIGFycmF5IG9mIExpc3QgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQuXG5cdCogICBkaXNhYmxlZCAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIHRoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgZXZlbnQgaXMgZGlzYWJsZWQuXG5cdCogICBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgTGlzdCBpdGVtIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cblx0KiAgIGxhYmVsIC0gVGhlIGxhYmVsIG9mIHRoZSBMaXN0IGl0ZW0gdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuXHQqICAgcmVtb3ZlZEl0ZW1zIC0gQW4gYXJyYXkgb2YgTGlzdCBpdGVtcyB0aGF0IGhhdmUgYmVlbiB1bnNlbGVjdGVkIGJlZm9yZSB0aGUgZXZlbnQgd2FzIGZpcmVkLlxuXHQqICAgc2VsZWN0ZWQgLSBUaGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIExpc3QgaXRlbSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuIElmIGFuIGl0ZW0gd2FzIHNlbGVjdGVkIHRoZSB2YWx1ZSB3aWxsIGJlIHRydWUgYW5kIHZpY2UgdmVyc2EuXG5cdCogICB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgTGlzdCBpdGVtIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cblx0Ki9cblx0QE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZHJvcC1kb3duIGxpc3QgaXMgY2xvc2VkLCBlaXRoZXIgYnkgdGhlIHVzZXIgc2VsZWN0aW5nIGFuIG9wdGlvbiBvciBieSBjbGlja2luZyBvdXRzaWRlIHRoZSBtZW51LiBJdCBvY2N1cnMgYWZ0ZXIgdGhlIGRyb3AtZG93biBtZW51IGlzIG5vIGxvbmdlciB2aXNpYmxlLCBhbGxvd2luZyB5b3UgdG8gcGVyZm9ybSBhY3Rpb25zIGluIHJlc3BvbnNlIHRvIHRoZSBtZW51J3MgY2xvc3VyZS5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgcmlnaHQgYmVmb3JlIHRoZSBkcm9wZG93biBsaXN0IGlzIGFib3V0IHRvIGNsb3NlLCBwcm92aWRpbmcgYW4gb3Bwb3J0dW5pdHkgdG8gaW50ZXJ2ZW5lLiBCeSBjYWxsaW5nIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgd2l0aGluIHRoZSBldmVudCBoYW5kbGVyLCB5b3UgY2FuIGNhbmNlbCB0aGUgY2xvc2luZyBvcGVyYXRpb24sIGFsbG93aW5nIHlvdSB0byBwZXJmb3JtIHZhbGlkYXRpb24sIGRpc3BsYXkgYSBjb25maXJtYXRpb24gZGlhbG9nLCBvciBleGVjdXRlIGN1c3RvbSBsb2dpYyBiZWZvcmUgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkNsb3Npbmc6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuZXZlciBhIHVzZXIgY2xpY2tzIG9uIGEgc3BlY2lmaWMgaXRlbSwgYWxsb3dpbmcgeW91IHRvIGV4ZWN1dGUgY3VzdG9tIGFjdGlvbnMgaW4gcmVzcG9uc2UgdG8gdGhlIHVzZXIncyBzZWxlY3Rpb24uIFRoZSBldmVudCBwcm92aWRlcyBjb250ZXh0IGFib3V0IHRoZSBjbGlja2VkIGl0ZW0sIGVuYWJsaW5nIHlvdSB0byBhY2Nlc3MgaXRzIHByb3BlcnRpZXMgb3IgcGVyZm9ybSByZWxhdGVkIHVwZGF0ZXMgd2l0aGluIHlvdXIgYXBwbGljYXRpb24uXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHRDdXN0b20gZXZlbnQgd2FzIGNyZWF0ZWQgd2l0aDogZXZlbnQuZGV0YWlsKFx0ZGlzYWJsZWQsIFx0aW5kZXgsIFx0bGFiZWwsIFx0c2VsZWN0ZWQsIFx0dmFsdWUpXG5cdCogICBkaXNhYmxlZCAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBMaXN0IGl0ZW0gdGhhdCB3YXMgY2xpY2tlZCBpcyBkaXNhYmxlZCBvciBub3QuXG5cdCogICBpbmRleCAtIEluZGljYXRlcyB0aGUgaW5kZXggb2YgdGhlIExpc3QgaXRlbSB0aGF0IHdhcyBjbGlja2VkLlxuXHQqICAgbGFiZWwgLSBUaGUgbGFiZWwgb2YgdGhlIExpc3QgaXRlbSB0aGF0IHdhcyBjbGlja2VkLlxuXHQqICAgc2VsZWN0ZWQgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgTGlzdCBpdGVtIHRoYXQgd2FzIGNsaWNrZWQgaXMgc2VsZWN0ZWQgb3Igbm90LlxuXHQqICAgdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIExpc3QgaXRlbSB0aGF0IHdhcyBjbGlja2VkLlxuXHQqL1xuXHRAT3V0cHV0KCkgb25JdGVtQ2xpY2s6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuZXZlciB0aGUgZHJvcGRvd24gbGlzdCBiZWNvbWVzIHZpc2libGUgdG8gdGhlIHVzZXIsIHN1Y2ggYXMgd2hlbiB0aGUgdXNlciBjbGlja3Mgb3IgaW50ZXJhY3RzIHdpdGggdGhlIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBkaXNwbGF5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zLiBVc2UgdGhpcyBldmVudCB0byBleGVjdXRlIGN1c3RvbSBsb2dpYyB3aGVuIHRoZSBkcm9wZG93biBtZW51IGlzIG9wZW5lZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbk9wZW46IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRyb3Bkb3duIGxpc3QgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBXaXRoaW4gdGhlIGV2ZW50IGhhbmRsZXIsIHlvdSBjYW4gcHJldmVudCB0aGUgZHJvcGRvd24gZnJvbSBvcGVuaW5nIGJ5IGNhbGxpbmcgZXZlbnQucHJldmVudERlZmF1bHQoKS4gVGhpcyBhbGxvd3MgeW91IHRvIGltcGxlbWVudCBjdXN0b20gbG9naWMgdG8gY29uZGl0aW9uYWxseSBhbGxvdyBvciBibG9jayB0aGUgb3BlbmluZyBvZiB0aGUgZHJvcGRvd24sIHN1Y2ggYXMgdmFsaWRhdGluZyBjb25kaXRpb25zIG9yIG1hbmFnaW5nIHVzZXIgcGVybWlzc2lvbnMgYmVmb3JlIHRoZSBsaXN0IGlzIHNob3duLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uT3BlbmluZzogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgaW5pdGlhdGVzIHRoZSByZXNpemluZyBhY3Rpb24gb24gdGhlIGRyb3Bkb3duIGNvbXBvbmVudCwgc3VjaCBhcyBjbGlja2luZyBhbmQgZHJhZ2dpbmcgYSByZXNpemUgaGFuZGxlLiBJdCBhbGxvd3MgZGV2ZWxvcGVycyB0byBkZXRlY3QgdGhlIGV4YWN0IG1vbWVudCB3aGVuIGEgcmVzaXplIG9wZXJhdGlvbiBvbiB0aGUgZHJvcGRvd24gYmVnaW5zLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdHBvc2l0aW9uKVxuXHQqICAgcG9zaXRpb24gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBsZWZ0IGFuZCB0b3AgcG9zaXRpb25zIG9mIHRoZSBkcm9wIGRvd24uXG5cdCovXG5cdEBPdXRwdXQoKSBvblJlc2l6ZVN0YXJ0OiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIGNvbXBsZXRlZCByZXNpemluZyB0aGUgZHJvcGRvd24gbWVudSwgc2lnbmFsaW5nIHRoYXQgdGhlIHJlc2l6aW5nIGFjdGlvbiBoYXMgZW5kZWQgYW5kIHRoZSBuZXcgZGltZW5zaW9ucyBoYXZlIGJlZW4gc2V0LlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Q3VzdG9tIGV2ZW50IHdhcyBjcmVhdGVkIHdpdGg6IGV2ZW50LmRldGFpbChcdHBvc2l0aW9uKVxuXHQqICAgcG9zaXRpb24gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBsZWZ0IGFuZCB0b3AgcG9zaXRpb25zIG9mIHRoZSBkcm9wIGRvd24uXG5cdCovXG5cdEBPdXRwdXQoKSBvblJlc2l6ZUVuZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyB0byB0aGUgYm90dG9tIG9mIHRoZSBkcm9wZG93biBsaXN0LCBpbmRpY2F0aW5nIHRoYXQgYWxsIGF2YWlsYWJsZSBvcHRpb25zIGhhdmUgYmVlbiBkaXNwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB3aGVuIGFkZGl0aW9uYWwgZGF0YSBzaG91bGQgYmUgbG9hZGVkIG9yIHdoZW4gbm8gZnVydGhlciBvcHRpb25zIHJlbWFpbiBpbiB0aGUgZHJvcGRvd24uXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25TY3JvbGxCb3R0b21SZWFjaGVkOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBzY3JvbGxzIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyAodG9wKSBvZiB0aGUgZHJvcGRvd24gbGlzdCwgaW5kaWNhdGluZyB0aGF0IG5vIG1vcmUgaXRlbXMgYXJlIGF2YWlsYWJsZSBhYm92ZSB0aGUgY3VycmVudCB2aWV3LlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uU2Nyb2xsVG9wUmVhY2hlZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gYSB0b2tlbiBpdGVtIChhbHNvIGtub3duIGFzIGEgJ3BpbGwnKSBpcyBjbGlja2VkIGJ5IHRoZSB1c2VyLiBCeSBoYW5kbGluZyB0aGlzIGV2ZW50LCBkZXZlbG9wZXJzIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGludGVyY2VwdCB0aGUgZGVmYXVsdCBhY3Rpb24gdGhhdCB3b3VsZCBub3JtYWxseSBvY2N1ciB3aGVuIHRoZSB0b2tlbiBpcyBjbGlja2Vk4oCUc3VjaCBhcyBvcGVuaW5nIGEgZHJvcGRvd24gb3IgcGVyZm9ybWluZyBhbm90aGVyIHJlbGF0ZWQgb3BlcmF0aW9uLiBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZyb20gZXhlY3V0aW5nLCBjYWxsIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgd2l0aGluIHlvdXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi5cIlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uVG9rZW5DbGljazogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGVuZHMgYSBuZXcgTGlzdEl0ZW0gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBleGlzdGluZyBsaXN0IG9mIGl0ZW1zIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBlbGVtZW50LCB0aGVyZWJ5IHVwZGF0aW5nIHRoZSBsaXN0IHRvIGluY2x1ZGUgdGhlIG5ld2x5IGFkZGVkIGl0ZW0gYXMgaXRzIGxhc3QgZW50cnkuIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbm9kZS4gQSBMaXN0SXRlbSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXN0IG9mIHRoZSBpdGVtcyBhcyB0aGUgbGFzdCBpdGVtLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgYXBwZW5kQ2hpbGQobm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHRwdWJsaWMgYXBwZW5kQ2hpbGRTeW5jKG5vZGUpOiBOb2RlIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gXHQgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBhcHBlbmRzIG9uZSBvciBtb3JlIG5ldyBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBvciBsaXN0LiBcblx0KiBAcGFyYW0ge2FueX0gaXRlbS4gRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtIHRoYXQgd2lsbCBiZSBpbnNlcnRlZC4gWW91IGNhbiBhbHNvIHBhc3MgYW4gYXJyYXkgb2YgaXRlbXMuXG5cdCovXG4gICAgcHVibGljIGFkZChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuYWRkKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmFkZChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhbGwgZXhpc3RpbmcgaXRlbXMgZnJvbSB0aGUgZHJvcGRvd24gbGlzdCwgcmVzdWx0aW5nIGluIGFuIGVtcHR5IGxpc3Qgd2l0aCBubyBzZWxlY3RhYmxlIG9wdGlvbnMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBcblx0Ki9cbiAgICBwdWJsaWMgY2xlYXJJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXJJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsZWFySXRlbXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGVzZWxlY3RzIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMsIGVuc3VyaW5nIHRoYXQgbm8gaXRlbXMgcmVtYWluIHNlbGVjdGVkLiBUaGlzIGFjdGlvbiBjbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgYW5kIHJlc2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlLiBcblx0Ki9cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBkcm9wLWRvd24gbGlzdCwgaGlkaW5nIGFsbCBhdmFpbGFibGUgb3B0aW9ucyBmcm9tIHZpZXcgYW5kIHJldHVybmluZyB0aGUgY29tcG9uZW50IHRvIGl0cyBjb2xsYXBzZWQgc3RhdGUuIFRoaXMgYWN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZHJvcC1kb3duIG1lbnUgaXMgbm8gbG9uZ2VyIHZpc2libGUgdG8gdGhlIHVzZXIuIFxuXHQqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJbml0aWF0ZXMgYSBkYXRhIGJpbmRpbmcgcHJvY2VzcywgY29ubmVjdGluZyBVSSBjb21wb25lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlLiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGRhdGEgc291cmNlLCBlbnN1cmluZyB0aGF0IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRhdGEgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdXNlciBpbnRlcmZhY2UuIEl0IGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBkaXNwbGF5ZWQgaW5mb3JtYXRpb24gYWZ0ZXIgbW9kaWZ5aW5nLCBhZGRpbmcsIG9yIGRlbGV0aW5nIGRhdGEuIFxuXHQqL1xuICAgIHB1YmxpYyBkYXRhQmluZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YUJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5kYXRhQmluZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTY3JvbGxzIHRoZSB0YXJnZXQgaXRlbSBpbnRvIHZpZXcgd2l0aGluIGl0cyBjb250YWluZXIsIGF1dG9tYXRpY2FsbHkgYWRqdXN0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gYXMgbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGUgZW50aXJlIGl0ZW0gaXMgZnVsbHkgdmlzaWJsZSB0byB0aGUgdXNlci4gXG5cdCogQHBhcmFtIHtIVE1MRWxlbWVudCB8IHN0cmluZ30gaXRlbS4gQSBsaXN0IGl0ZW0gb3IgdmFsdWUgb2YgdGhlIGRlc2lyZWQgaXRlbSB0byBiZSB2aXNpYmxlLlxuXHQqL1xuICAgIHB1YmxpYyBlbnN1cmVWaXNpYmxlKGl0ZW06IEhUTUxFbGVtZW50IHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmVuc3VyZVZpc2libGUoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZW5zdXJlVmlzaWJsZShpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHNwZWNpZmljIGl0ZW0gaW5zdGFuY2UgZnJvbSB0aGUgZHJvcERvd24gbGlzdCwgYWxsb3dpbmcgeW91IHRvIGFjY2VzcyB0aGUgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpdGVtLCBzdWNoIGFzIGl0cyB2YWx1ZSwgbGFiZWwsIG9yIGluZGV4IHdpdGhpbiB0aGUgZHJvcERvd24uIFxuXHQqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZS4gVGhlIHZhbHVlIG9mIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuXG5cdCogQHJldHVybnMge0hUTUxFbGVtZW50fVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgZ2V0SXRlbSh2YWx1ZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRJdGVtKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHRwdWJsaWMgZ2V0SXRlbVN5bmModmFsdWUpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuIFx0ICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0SXRlbSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyBhIG5ldyBpdGVtIGludG8gdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb24sIHNoaWZ0aW5nIGV4aXN0aW5nIGVsZW1lbnRzIHRvIHRoZSByaWdodCB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IGl0ZW0uIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQuXG5cdCogQHBhcmFtIHthbnl9IGl0ZW0uIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgaXRlbSB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQuIFlvdSBjYW4gYWxzbyBwYXNzIGFuIGFycmF5IG9mIGl0ZW1zLlxuXHQqL1xuICAgIHB1YmxpYyBpbnNlcnQocG9zaXRpb246IG51bWJlciwgaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydChwb3NpdGlvbiwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KHBvc2l0aW9uLCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyBhIG5ldyBMaXN0SXRlbSBlbGVtZW50IGRpcmVjdGx5IGJlZm9yZSBhIHNwZWNpZmllZCBleGlzdGluZyBMaXN0SXRlbSB3aXRoaW4gdGhlIGxpc3QsIHByZXNlcnZpbmcgdGhlIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgaXRlbXMuIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbm9kZS4gQSBMaXN0SXRlbSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIGFkZGVkIGJlZm9yZSB0aGUgcmVmZXJlbmNlSXRlbSBpbiB0aGUgbGlzdC5cblx0KiBAcGFyYW0ge05vZGUgfCBudWxsfSByZWZlcmVuY2VOb2RlLiBBIExpc3RJdGVtIGVsZW1lbnQgdGhhdCBhY3RzIGFzIHRoZSByZWZlcmVuY2UgaXRlbSBiZWZvcmUgd2hpY2ggYSBuZXcgaXRlbSBpcyBhYm91dCB0byBiZSBpbnNlcnRlZC4gVGhlIHJlZmVyZW5jZU5vZGUgbXVzdCBiZSBpbiB0aGUgc2FtZSBsaXN0IGFzIHRoZSBub2RlLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZmVyZW5jZU5vZGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdHB1YmxpYyBpbnNlcnRCZWZvcmVTeW5jKG5vZGUsIHJlZmVyZW5jZU5vZGUpOiBOb2RlIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gXHQgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGlzcGxheXMgYW5kIGV4cGFuZHMgdGhlIGRyb3AtZG93biBsaXN0LCBtYWtpbmcgYWxsIGF2YWlsYWJsZSBvcHRpb25zIHZpc2libGUgZm9yIHNlbGVjdGlvbi4gXG5cdCovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlbW92ZXMgdGhlIGl0ZW0gbG9jYXRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9yIHBvc2l0aW9uIHdpdGhpbiBhIGNvbGxlY3Rpb24gKHN1Y2ggYXMgYW4gYXJyYXkgb3IgbGlzdCkuIEFmdGVyIHJlbW92YWwsIHRoZSBjb2xsZWN0aW9uIGlzIHVwZGF0ZWQgc28gdGhhdCBzdWJzZXF1ZW50IGl0ZW1zIHNoaWZ0IHRvIGZpbGwgdGhlIGdhcCwgZW5zdXJpbmcgY29udGlndW91cyBpbmRleGluZy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gb2YgdGhlIHJlbW92ZWQgaXRlbS5cblx0Ki9cbiAgICBwdWJsaWMgcmVtb3ZlQXQocG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVBdChwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQocG9zaXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGEgc3BlY2lmaWVkIExpc3RJdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgaXRlbXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZ2l2ZW4gZWxlbWVudCwgdXBkYXRpbmcgdGhlIGxpc3QgdG8gcmVmbGVjdCB0aGUgZGVsZXRpb24uIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbm9kZS4gQSBMaXN0SXRlbSBlbGVtZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbGlzdCBvZiBpdGVtcyBpbnNpZGUgdGhlIGVsZW1lbnQuXG5cdCogQHJldHVybnMge05vZGV9XG4gICovXG5cdHB1YmxpYyBhc3luYyByZW1vdmVDaGlsZChub2RlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdHB1YmxpYyByZW1vdmVDaGlsZFN5bmMobm9kZSk6IE5vZGUge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiBcdCAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNlbGVjdHMgYSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBkcm9wZG93biBsaXN0LCBhbGxvd2luZyB1c2VycyB0byBjaG9vc2Ugb25lIG9wdGlvbiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy4gVGhpcyBhY3Rpb24gdXBkYXRlcyB0aGUgZHJvcGRvd27igJlzIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjYW4gdHJpZ2dlciBhbnkgYXNzb2NpYXRlZCBldmVudCBoYW5kbGVycyBvciBjaGFuZ2VzIGluIHRoZSBhcHBsaWNhdGlvbuKAmXMgc3RhdGUuIFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGl0ZW0uIEEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBpdGVtIG9yIGFuIEhUTUwgRWxlbWVudCByZWZlcmVuY2luZyBhbiBpdGVtIGZyb20gdGhlIGxpc3Rcblx0Ki9cbiAgICBwdWJsaWMgc2VsZWN0KGl0ZW06IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERlc2VsZWN0cyBhIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIGRyb3Bkb3duIGxpc3QsIHJlbW92aW5nIGl0cyBzZWxlY3RlZCBzdGF0ZSBhbmQgcmV2ZXJ0aW5nIHRoZSBkcm9wZG93biB0byByZWZsZWN0IHRoYXQgdGhlIGl0ZW0gaXMgbm8gbG9uZ2VyIGNob3NlbiBieSB0aGUgdXNlci4gXG5cdCogQHBhcmFtIHtzdHJpbmcgfCBIVE1MRWxlbWVudH0gaXRlbS4gQSBzdHJpbmcsIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0gb3IgYW4gSFRNTCBFbGVtZW50IHJlZmVyZW5jaW5nIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdFxuXHQqL1xuICAgIHB1YmxpYyB1bnNlbGVjdChpdGVtOiBzdHJpbmcgfCBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51bnNlbGVjdChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51bnNlbGVjdChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB0aGUgZHJvcERvd24gbGlzdCB3aXRoIG5ldyBkYXRhIG9yIGF0dHJpYnV0ZXMuIFRoaXMgYWN0aW9uIG1vZGlmaWVzIHRoZSBleGlzdGluZyBpdGVtIHJhdGhlciB0aGFuIGFkZGluZyBvciByZW1vdmluZyBpdGVtcyBmcm9tIHRoZSBsaXN0LCBlbnN1cmluZyB0aGF0IGFueSBjaGFuZ2VzIGFyZSByZWZsZWN0ZWQgaW1tZWRpYXRlbHkgaW4gdGhlIHVzZXIgaW50ZXJmYWNlLiBTcGVjaWZ5IHRoZSB0YXJnZXQgaXRlbSBhbmQgdGhlIHVwZGF0ZWQgdmFsdWVzIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBpdGVtIG11c3QgYmUgdXBkYXRlZC5cblx0KiBAcGFyYW0ge2FueX0gdmFsdWUuIFRoZSB2YWx1ZSBvZiB0aGUgdXBkYXRlZCBpdGVtLlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGUocG9zaXRpb246IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGUocG9zaXRpb24sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGUocG9zaXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cblx0Z2V0IGlzUmVuZGVyZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkIDogZmFsc2U7XG5cdH1cblxuXHRuZ09uSW5pdCgpIHtcblx0fVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgIHRoYXQub25DcmVhdGUuZW1pdCh0aGF0Lm5hdGl2ZUVsZW1lbnQpO1xuXG5cdFx0aWYgKFNtYXJ0KSBTbWFydC5SZW5kZXIoKTtcblxuXHRcdHRoaXMubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWFydC1hbmd1bGFyJyk7XG5cblx0XHRpZiAodGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCkgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7IHRoYXQub25SZWFkeS5lbWl0KHRoYXQubmF0aXZlRWxlbWVudCk7IH0pO1xuXHRcdHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpIHtcblx0XHR0aGlzLnVubGlzdGVuKCk7XG5cdH1cblxuXHRfaW5pdGlhbENoYW5nZSA9IHRydWU7IFxuXG5cdGdldCBuZ1ZhbHVlKCk6IGFueSB7XG5cdFx0aWYgKCF0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNlbGVjdGVkVmFsdWVzICYmIHRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMSA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlc1swXSA6IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZFZhbHVlcztcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA/IGlucHV0LnZhbHVlIDogbnVsbDtcblx0fVxuXG5cdHNldCBuZ1ZhbHVlKHZhbHVlOiBhbnkpIHtcblx0XHRpZiAodGhpcy5uYXRpdmVFbGVtZW50KSB7XG5cdFx0ICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cblx0d3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcblxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5uYXRpdmVFbGVtZW50LiQubGlzdEJveC5pc0luaXRpYWxpemVkID0gdGhhdC5faW5pdGlhbENoYW5nZSA/IGZhbHNlIDogdHJ1ZTtcblx0XHRcdHRoYXQuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChjdXJyZW50VmFsdWU6IGFueSkgPT4gdGhpcy5zZWxlY3QoY3VycmVudFZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGF0LnNlbGVjdChub3JtYWxpemVkVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoYXQubmF0aXZlRWxlbWVudC4kLmxpc3RCb3guaXNJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuX2FwcGx5U2VsZWN0aW9uKCk7XG5cdFx0XHRpZiAodGhhdC5faW5pdGlhbENoYW5nZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5zZWxlY3RlZFZhbHVlcyAmJiB0aGF0LnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25DaGFuZ2UodGhhdC5zZWxlY3RlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoYXQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuXHRcdFx0XHRcdGxldCBpbnB1dFZhbHVlOiBhbnkgPSBpbnB1dC52YWx1ZTtcblx0XHRcdFx0XHRpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRpbnB1dFZhbHVlID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkNoYW5nZSgodGhhdC5zZWxlY3RlZFZhbHVlcyAmJiB0aGF0LnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDApID8gdGhhdC5zZWxlY3RlZFZhbHVlc1swXSA6IChpbnB1dCA/IGlucHV0VmFsdWUgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXHRcdH0pO1xuXHR9XG5cblx0cmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5fb25DaGFuZ2UgPSBmbjtcblx0fVxuXG5cdHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLl9vblRvdWNoZWQgPSBmbjtcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRpZiAodGhpcy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3BOYW1lIGluIGNoYW5nZXMpIHtcblx0XHRcdFx0aWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG5cdFx0XHRcdFx0dGhpcy5uYXRpdmVFbGVtZW50W3Byb3BOYW1lXSA9IGNoYW5nZXNbcHJvcE5hbWVdLmN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQWRkIGV2ZW50IGxpc3RlbmVycy4gKi9cblx0cHJpdmF0ZSBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ2hhbmdlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DbG9zZS5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ2xvc2luZy5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snaXRlbUNsaWNrSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uSXRlbUNsaWNrLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2l0ZW1DbGljaycsIHRoYXQuZXZlbnRIYW5kbGVyc1snaXRlbUNsaWNrSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk9wZW4uZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25PcGVuaW5nLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW5pbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc2l6ZVN0YXJ0LmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZVN0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc2l6ZUVuZC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXNpemVFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbEJvdHRvbVJlYWNoZWRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25TY3JvbGxCb3R0b21SZWFjaGVkLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbEJvdHRvbVJlYWNoZWQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbEJvdHRvbVJlYWNoZWRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydzY3JvbGxUb3BSZWFjaGVkSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uU2Nyb2xsVG9wUmVhY2hlZC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGxUb3BSZWFjaGVkJywgdGhhdC5ldmVudEhhbmRsZXJzWydzY3JvbGxUb3BSZWFjaGVkSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1sndG9rZW5DbGlja0hhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblRva2VuQ2xpY2suZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG9rZW5DbGljaycsIHRoYXQuZXZlbnRIYW5kbGVyc1sndG9rZW5DbGlja0hhbmRsZXInXSk7XG5cblxuICAgICAgICB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NoYW5nZU1vZGVsSGFuZGxlciddID0gKGV2ZW50OiBFdmVudCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgdGhhdC5faW5pdGlhbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhhdC5fb25DaGFuZ2UodGhhdC5uYXRpdmVFbGVtZW50LnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDAgPyAodGhhdC5uYXRpdmVFbGVtZW50LnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDEgPyB0aGF0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMgOiB0aGF0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXNbMF0pIDogdGhhdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoYXQuZXZlbnRIYW5kbGVyc1snYmx1ck1vZGVsSGFuZGxlciddID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5fb25Ub3VjaGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoYXQubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoYXQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5ldmVudEhhbmRsZXJzWydrZXl1cE1vZGVsSGFuZGxlciddID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NoYW5nZU1vZGVsSGFuZGxlciddKGV2ZW50KTsgfSwgNTApO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGF0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sna2V5dXBNb2RlbEhhbmRsZXInXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NoYW5nZU1vZGVsSGFuZGxlciddKTtcblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoYXQuZXZlbnRIYW5kbGVyc1snYmx1ck1vZGVsSGFuZGxlciddKTtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGV2ZW50IGxpc3RlbmVycy4gKi9cblx0cHJpdmF0ZSB1bmxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2luZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2luZ0hhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snaXRlbUNsaWNrSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaXRlbUNsaWNrJywgdGhhdC5ldmVudEhhbmRsZXJzWydpdGVtQ2xpY2tIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbmluZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZUVuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydzY3JvbGxCb3R0b21SZWFjaGVkSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsQm90dG9tUmVhY2hlZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snc2Nyb2xsQm90dG9tUmVhY2hlZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snc2Nyb2xsVG9wUmVhY2hlZEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbFRvcFJlYWNoZWQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Njcm9sbFRvcFJlYWNoZWRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Rva2VuQ2xpY2tIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b2tlbkNsaWNrJywgdGhhdC5ldmVudEhhbmRsZXJzWyd0b2tlbkNsaWNrSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjaGFuZ2VNb2RlbEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2hhbmdlTW9kZWxIYW5kbGVyJ10pO1xuICAgICAgICAgICAgaWYgKHRoYXQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSB7XG4gICAgICAgICAgICAgICAgICB0aGF0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sna2V5dXBNb2RlbEhhbmRsZXInXSk7XG4gICAgICAgICAgICB9XG5cdFx0fVxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2JsdXJNb2RlbEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2JsdXJNb2RlbEhhbmRsZXInXSk7XG5cdFx0fVxuXHR9XG59XG4iXX0=
|