@magic-xpa/gui 4.800.0-dev480.21 → 4.800.0-dev480.210
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/bundles/magic-xpa-gui.umd.js +1050 -7528
- package/bundles/magic-xpa-gui.umd.js.map +1 -1
- package/bundles/magic-xpa-gui.umd.min.js +1 -1
- package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
- package/esm2015/index.js +1 -1
- package/esm2015/magic-xpa-gui.js +1 -4
- package/esm2015/src/Commands.js +11 -114
- package/esm2015/src/Events.js +1 -517
- package/esm2015/src/EventsProcessor.js +1 -51
- package/esm2015/src/FocusManager.js +1 -13
- package/esm2015/src/GuiConstants.js +2 -11
- package/esm2015/src/GuiEnums.js +126 -130
- package/esm2015/src/GuiEnvironment.js +1 -1
- package/esm2015/src/IFlowMonitorQueue.js +1 -1
- package/esm2015/src/Manager.js +10 -148
- package/esm2015/src/UIBridge.js +1 -6
- package/esm2015/src/env/IEnvironment.js +1 -1
- package/esm2015/src/gui/ControlBase.js +1 -1
- package/esm2015/src/gui/GuiMgControl.js +1 -94
- package/esm2015/src/gui/GuiMgForm.js +1 -1
- package/esm2015/src/gui/KeyboardItem.js +5 -46
- package/esm2015/src/gui/LastFocusedVal.js +1 -5
- package/esm2015/src/gui/MgValue.js +1 -1
- package/esm2015/src/gui/PropParentInterface.js +1 -1
- package/esm2015/src/gui/low/DialogHandler.js +1 -10
- package/esm2015/src/gui/low/GuiCommand.js +1 -12
- package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
- package/esm2015/src/gui/low/GuiInteractive.js +8 -465
- package/esm2015/src/gui/low/Style.js +1 -9
- package/esm2015/src/management/RuntimeContextBase.js +11 -14
- package/esm2015/src/management/data/BlobType.js +0 -0
- package/esm2015/src/management/data/DcValues.js +8 -67
- package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
- package/esm2015/src/management/data/FieldDef.js +1 -95
- package/esm2015/src/management/data/FieldsTable.js +2 -28
- package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
- package/esm2015/src/management/data/GuiFieldBase.js +4 -39
- package/esm2015/src/management/data/IRecord.js +1 -1
- package/esm2015/src/management/data/IReferencedObject.js +1 -8
- package/esm2015/src/management/data/NUM_TYPE.js +14 -485
- package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
- package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
- package/esm2015/src/management/data/RecordUtils.js +6 -112
- package/esm2015/src/management/data/VectorType.js +17 -252
- package/esm2015/src/management/data/VectorTypeBase.js +1 -35
- package/esm2015/src/management/events/IActionManager.js +1 -1
- package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
- package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
- package/esm2015/src/management/gui/ControlTable.js +18 -72
- package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
- package/esm2015/src/management/gui/FieldValidator.js +58 -339
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
- package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
- package/esm2015/src/management/gui/HebrewDate.js +3 -140
- package/esm2015/src/management/gui/Helps.js +2 -48
- package/esm2015/src/management/gui/MgControlBase.js +143 -876
- package/esm2015/src/management/gui/MgFormBase.js +68 -407
- package/esm2015/src/management/gui/PIC.js +58 -285
- package/esm2015/src/management/gui/PropDefaults.js +13 -48
- package/esm2015/src/management/gui/PropInterface.js +2 -4
- package/esm2015/src/management/gui/PropTable.js +72 -183
- package/esm2015/src/management/gui/Property.js +35 -372
- package/esm2015/src/management/gui/ValidationDetails.js +10 -52
- package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
- package/esm2015/src/management/gui/WrongFormatException.js +1 -15
- package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
- package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
- package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
- package/esm2015/src/management/tasks/ITask.js +1 -1
- package/esm2015/src/management/tasks/MgTimer.js +1 -16
- package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
- package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
- package/esm2015/src/util/MemoryUtil.js +1 -41
- package/esm2015/src/util/ObjectReference.js +1 -8
- package/esm2015/src/util/ProcessLauncher.js +3 -21
- package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
- package/fesm2015/magic-xpa-gui.js +857 -7052
- package/fesm2015/magic-xpa-gui.js.map +1 -1
- package/magic-xpa-gui.d.ts +0 -3
- package/package.json +2 -2
- package/src/Commands.d.ts +2 -0
- package/src/Events.d.ts +0 -2
- package/src/GuiEnums.d.ts +125 -128
- package/src/env/IEnvironment.d.ts +3 -0
- package/src/gui/PropParentInterface.d.ts +1 -1
- package/src/gui/low/GuiInteractive.d.ts +3 -1
- package/src/gui/low/Style.d.ts +0 -3
- package/src/management/RuntimeContextBase.d.ts +2 -0
- package/src/management/data/GuiDataViewBase.d.ts +4 -4
- package/src/management/data/IRecord.d.ts +1 -1
- package/src/management/exp/ExpressionInterface.d.ts +4 -0
- package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
- package/src/management/gui/ControlTable.d.ts +1 -1
- package/src/management/gui/DisplayConvertor.d.ts +1 -1
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
- package/src/management/gui/MgControlBase.d.ts +7 -7
- package/src/management/gui/MgFormBase.d.ts +6 -6
- package/src/management/gui/PIC.d.ts +1 -0
- package/src/management/gui/PropInterface.d.ts +2 -4
- package/src/management/gui/PropTable.d.ts +4 -5
- package/src/management/gui/Property.d.ts +1 -1
- package/src/management/tasks/GuiTaskBase.d.ts +8 -14
- package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
|
@@ -14,16 +14,11 @@ import { PropInterface } from './PropInterface';
|
|
|
14
14
|
import { GuiConstants } from '../../GuiConstants';
|
|
15
15
|
import { GuiFormPropertyAdapter } from './GuiFormPropertyAdapter';
|
|
16
16
|
const delimiter = ', ';
|
|
17
|
-
/// <summary>
|
|
18
|
-
/// data for <form>...</form>
|
|
19
|
-
/// </summary>
|
|
20
17
|
export class MgFormBase extends GuiFormPropertyAdapter {
|
|
21
|
-
/// </summary>
|
|
22
18
|
constructor() {
|
|
23
19
|
super();
|
|
24
20
|
this.InInitForm = false;
|
|
25
21
|
this.CtrlTab = null;
|
|
26
|
-
// until the form is refreshed in the first time
|
|
27
22
|
this.FormRefreshed = false;
|
|
28
23
|
this.RefreshRepeatableAllowed = false;
|
|
29
24
|
this.Rows = null;
|
|
@@ -35,34 +30,30 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
35
30
|
this.isLegalForm = false;
|
|
36
31
|
this.PBImagesNumber = 0;
|
|
37
32
|
this.ignoreFirstRefreshTable = false;
|
|
38
|
-
/// </summary>
|
|
39
33
|
this.ParentForm = null;
|
|
40
|
-
/// </summary>
|
|
41
34
|
this._destTblRow = Int32.MinValue;
|
|
42
|
-
this._firstTableTabOrder = 0;
|
|
35
|
+
this._firstTableTabOrder = 0;
|
|
43
36
|
this._inRefreshDisp = false;
|
|
44
37
|
this._inRestore = false;
|
|
45
|
-
this._lastRowSent = -1;
|
|
46
|
-
this._prevGuiTopIndex = -1;
|
|
38
|
+
this._lastRowSent = -1;
|
|
39
|
+
this._prevGuiTopIndex = -1;
|
|
47
40
|
this._propTab = null;
|
|
48
41
|
this._rowsInPage = 1;
|
|
49
|
-
this._maxRowsInPaginatedTable = 0;
|
|
42
|
+
this._maxRowsInPaginatedTable = 0;
|
|
50
43
|
this._subFormCtrl = null;
|
|
51
44
|
this._tableMgControl = null;
|
|
52
|
-
this._tableItemsCount = 0;
|
|
45
|
+
this._tableItemsCount = 0;
|
|
53
46
|
this._tableRefreshed = false;
|
|
54
|
-
this._task = null;
|
|
55
|
-
this._topIndexUpdated = false;
|
|
56
|
-
|
|
57
|
-
this._transferingData = false; // rows are requested for a GUI thread
|
|
58
|
-
// prevents refresh of DisplayList for the corresponding controls and currRecCompute(RC)
|
|
47
|
+
this._task = null;
|
|
48
|
+
this._topIndexUpdated = false;
|
|
49
|
+
this._transferingData = false;
|
|
59
50
|
this._allowedSubformRecompute = true;
|
|
60
51
|
this._concreteWindowType = 0;
|
|
61
52
|
this._containerCtrl = null;
|
|
62
53
|
this._firstRefreshOfProps = true;
|
|
63
54
|
this._prevSelIndex = -1;
|
|
64
|
-
this._shouldCreateToolbar = false;
|
|
65
|
-
this._tableChildren = null;
|
|
55
|
+
this._shouldCreateToolbar = false;
|
|
56
|
+
this._tableChildren = null;
|
|
66
57
|
this._tableColumns = null;
|
|
67
58
|
this._userStateId = '';
|
|
68
59
|
this.displayLine = 0;
|
|
@@ -105,8 +96,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
105
96
|
set AllowedSubformRecompute(value) {
|
|
106
97
|
this._allowedSubformRecompute = value;
|
|
107
98
|
}
|
|
108
|
-
/// <summary>
|
|
109
|
-
/// Returns true for a FitToMdi window.
|
|
110
99
|
get ConcreteWindowType() {
|
|
111
100
|
if (this._concreteWindowType === 0) {
|
|
112
101
|
let windowType = this.GetComputedProperty(PropInterface.PROP_TYPE_WINDOW_TYPE).GetComputedValueInteger();
|
|
@@ -116,36 +105,15 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
116
105
|
}
|
|
117
106
|
return this._concreteWindowType;
|
|
118
107
|
}
|
|
119
|
-
/// <summary>
|
|
120
|
-
/// Returns true for Floating, Tool or Modal.
|
|
121
108
|
set ConcreteWindowType(value) {
|
|
122
109
|
this._concreteWindowType = value;
|
|
123
110
|
}
|
|
124
|
-
/// <summary>
|
|
125
|
-
/// This method enables a specific action on all the menu objects of the form and its children's
|
|
126
|
-
/// menus.
|
|
127
|
-
/// </summary>
|
|
128
|
-
/// <param name = "action">action whose state has changed</param>
|
|
129
|
-
/// <returns></returns>
|
|
130
111
|
static ShouldPutActOnFormClose() {
|
|
131
112
|
return false;
|
|
132
113
|
}
|
|
133
|
-
/// <summary>
|
|
134
|
-
/// get a property of the form that already was computed by its Id
|
|
135
|
-
/// This method does not create a property if it isn't exist.
|
|
136
|
-
/// May we need to create a property and use its default value.
|
|
137
|
-
/// In Phase 2 in RefreshProperties method we'll create and compute properties,
|
|
138
|
-
/// perhaps we need create all properties not only those that are different from default.
|
|
139
|
-
/// </summary>
|
|
140
|
-
/// <returns></returns>
|
|
141
114
|
static ShouldBehaveAsModal() {
|
|
142
115
|
return false;
|
|
143
116
|
}
|
|
144
|
-
/// <summary>
|
|
145
|
-
/// checks if property has expression
|
|
146
|
-
/// </summary>
|
|
147
|
-
/// <param name="propId"></param>
|
|
148
|
-
/// <returns></returns>
|
|
149
117
|
static ConvertArrayListToString(items, isItemNumType) {
|
|
150
118
|
let from = ['\\', '-', ','];
|
|
151
119
|
let to = ['\\\\', '\\-', '\\,'];
|
|
@@ -162,10 +130,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
162
130
|
}
|
|
163
131
|
return stringBuilder.ToString();
|
|
164
132
|
}
|
|
165
|
-
/// <summary>
|
|
166
|
-
/// parse the form structure
|
|
167
|
-
/// </summary>
|
|
168
|
-
/// <param name = "increase"></param>
|
|
169
133
|
UpdateModalFormsCount(mgFormBase, increase) {
|
|
170
134
|
if (increase)
|
|
171
135
|
this.ModalFormsCount += 1;
|
|
@@ -173,11 +137,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
173
137
|
this.ModalFormsCount -= 1;
|
|
174
138
|
Events.SetModal(mgFormBase, increase);
|
|
175
139
|
}
|
|
176
|
-
/// <summary>
|
|
177
|
-
/// To allocate and fill inner objects of the class
|
|
178
|
-
/// </summary>
|
|
179
|
-
/// <param name="foundTagName"></param>
|
|
180
|
-
/// <returns></returns>
|
|
181
140
|
EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
|
|
182
141
|
return __awaiter(this, void 0, void 0, function* () {
|
|
183
142
|
return yield this._task.EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, true, wasEvaluated);
|
|
@@ -186,9 +145,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
186
145
|
GetExpressionStorage(expId) {
|
|
187
146
|
return this._task.GetExpressionStorage(expId);
|
|
188
147
|
}
|
|
189
|
-
/// <summary>
|
|
190
|
-
/// initialization.
|
|
191
|
-
/// <returns></returns>
|
|
192
148
|
checkIfExistProp(propId) {
|
|
193
149
|
let exist = false;
|
|
194
150
|
if (this._propTab !== null) {
|
|
@@ -197,97 +153,59 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
197
153
|
}
|
|
198
154
|
return exist;
|
|
199
155
|
}
|
|
200
|
-
/// <summary>
|
|
201
|
-
/// Fill name member of the class
|
|
202
|
-
/// </summary>
|
|
203
|
-
/// <param name = "propId">the Id of the property</param>
|
|
204
156
|
getProp(propId) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_FORM, this);
|
|
213
|
-
if (prop !== null)
|
|
214
|
-
yield this._propTab.addPropWithCheckExistence(prop, false);
|
|
215
|
-
}
|
|
157
|
+
let prop = null;
|
|
158
|
+
if (this._propTab !== null) {
|
|
159
|
+
prop = this._propTab.getPropById(propId);
|
|
160
|
+
if (prop === null) {
|
|
161
|
+
prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_FORM, this);
|
|
162
|
+
if (prop !== null)
|
|
163
|
+
this._propTab.addProp(prop);
|
|
216
164
|
}
|
|
217
|
-
|
|
218
|
-
|
|
165
|
+
}
|
|
166
|
+
return prop;
|
|
219
167
|
}
|
|
220
|
-
/// <summary>
|
|
221
|
-
/// for each control build the list of all the controls that are linked to it
|
|
222
|
-
/// <param name = "propId">the Id of the property</param>
|
|
223
168
|
GetComputedProperty(propId) {
|
|
224
169
|
let prop = null;
|
|
225
170
|
if (this._propTab !== null)
|
|
226
171
|
prop = this._propTab.getPropById(propId);
|
|
227
172
|
return prop;
|
|
228
173
|
}
|
|
229
|
-
/// <returns></returns>
|
|
230
174
|
PropertyHasExpression(propId) {
|
|
231
175
|
let prop = this._propTab.getPropById(propId);
|
|
232
176
|
return prop !== null && prop.isExpression();
|
|
233
177
|
}
|
|
234
|
-
/// <summary>
|
|
235
|
-
/// <returns></returns>
|
|
236
178
|
getCompIdx() {
|
|
237
179
|
return (this.getTask() === null) ? 0 : this.getTask().getCompIdx();
|
|
238
180
|
}
|
|
239
|
-
/// <summary>
|
|
240
|
-
/// arrange zorder for controls. recursive function.
|
|
241
|
-
/// </summary>
|
|
242
|
-
/// <returns></returns>
|
|
243
181
|
IsFirstRefreshOfProps() {
|
|
244
182
|
return this._firstRefreshOfProps;
|
|
245
183
|
}
|
|
246
|
-
/// <summary>
|
|
247
|
-
/// build list of all columns controls
|
|
248
|
-
/// </summary>
|
|
249
184
|
getForm() {
|
|
250
185
|
return this;
|
|
251
186
|
}
|
|
252
|
-
/// <summary>
|
|
253
|
-
/// Checks if an internal Fit to MDI form needs to be created to hold the Main Program controls
|
|
254
|
-
/// </summary>
|
|
255
|
-
/// <param name = "taskRef">reference to the ownerTask of this form</param>
|
|
256
187
|
fillData(taskRef) {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
});
|
|
188
|
+
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
189
|
+
if (this._task === null && taskRef !== null)
|
|
190
|
+
this._task = taskRef;
|
|
191
|
+
while (this.initInnerObjects(parser.getNextTag())) {
|
|
192
|
+
}
|
|
264
193
|
}
|
|
265
|
-
/// </summary>
|
|
266
194
|
init() {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
this.buildTableColumnsList();
|
|
277
|
-
yield this.createForm();
|
|
278
|
-
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_SCREEN_MODE, this.isScreenMode());
|
|
279
|
-
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_LEFT_TO_RIGHT, !this.GetComputedProperty(PropInterface.PROP_TYPE_HEBREW).GetComputedValueBoolean());
|
|
280
|
-
});
|
|
195
|
+
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
196
|
+
let ctrl = this.CtrlTab.getCtrl(i);
|
|
197
|
+
ctrl.Init();
|
|
198
|
+
}
|
|
199
|
+
this.buildLinkedControlsLists();
|
|
200
|
+
this.buildTableColumnsList();
|
|
201
|
+
this.createForm();
|
|
202
|
+
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_SCREEN_MODE, this.isScreenMode());
|
|
203
|
+
this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_LEFT_TO_RIGHT, !this.GetComputedProperty(PropInterface.PROP_TYPE_HEBREW).GetComputedValueBoolean());
|
|
281
204
|
}
|
|
282
|
-
/// <summary>
|
|
283
|
-
/// order the splitter container children. The child that is docked to fill is added first, then
|
|
284
|
-
/// the splitter control and finally the child that is docked either to the top or to the left
|
|
285
|
-
/// <returns> end Index of the<form ...> subtag</returns>
|
|
286
205
|
fillName(formTag) {
|
|
287
206
|
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
288
207
|
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
289
208
|
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
290
|
-
// last position of its tag
|
|
291
209
|
let tag = parser.getXMLsubstring(endContext);
|
|
292
210
|
parser.add2CurrIndex(tag.indexOf(formTag) + formTag.length);
|
|
293
211
|
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
@@ -321,81 +239,44 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
321
239
|
break;
|
|
322
240
|
}
|
|
323
241
|
}
|
|
324
|
-
parser.setCurrIndex(endContext + 1);
|
|
242
|
+
parser.setCurrIndex(endContext + 1);
|
|
325
243
|
return;
|
|
326
244
|
}
|
|
327
245
|
Events.WriteExceptionToLog('in Form.FillName() out of bounds');
|
|
328
246
|
}
|
|
329
|
-
/// <summary>
|
|
330
|
-
/// returns true for mdi child and fit to mdi
|
|
331
|
-
/// </summary>
|
|
332
|
-
/// <param name="windowType"></param>
|
|
333
|
-
/// </summary>
|
|
334
247
|
createForm() {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
if (this.HasTable())
|
|
347
|
-
this.InitTableControl();
|
|
348
|
-
Commands.beginInvoke();
|
|
349
|
-
});
|
|
248
|
+
let inputControls = this.GetListOfInputControls();
|
|
249
|
+
let formName = this.buildFormName();
|
|
250
|
+
if (!this.isSubForm()) {
|
|
251
|
+
Commands.addOpenForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
Commands.addOpensubform(CommandType.CREATE_SUB_FORM, this.getSubFormCtrl(), this.getTask().getTaskTag(), this.getSubFormCtrl().getName(), formName, inputControls, this.getTask().RouterPath, this.getTask().GetRouterParams(), this.getTask().InDefaultRouterOutlet);
|
|
255
|
+
}
|
|
256
|
+
if (this.HasTable())
|
|
257
|
+
this.InitTableControl();
|
|
258
|
+
Commands.beginInvoke();
|
|
350
259
|
}
|
|
351
|
-
/// <summary>
|
|
352
|
-
/// add the call js command and get the return value
|
|
353
|
-
/// </summary>
|
|
354
|
-
/// <returns></returns>
|
|
355
260
|
CallJS(methodName, args) {
|
|
356
261
|
return __awaiter(this, void 0, void 0, function* () {
|
|
357
262
|
return Commands.addCallJS(this, this.UniqueName, methodName, args);
|
|
358
263
|
});
|
|
359
264
|
}
|
|
360
|
-
/// <summary>
|
|
361
|
-
/// return true if form has automatic tabbing order
|
|
362
|
-
/// </summary>
|
|
363
|
-
/// <returns></returns>
|
|
364
265
|
isAutomaticTabbingOrder() {
|
|
365
266
|
return this.GetComputedProperty(PropInterface.PROP_TYPE_TABBING_ORDER).GetComputedValueInteger() === TabbingOrderType.Automatically;
|
|
366
267
|
}
|
|
367
|
-
/// <summary>
|
|
368
|
-
/// true if we can refresh repeatable controls
|
|
369
|
-
/// QCR #434649, we prevent painting table's control untill shell is opened and we know how many rows to paint
|
|
370
|
-
/// </summary>
|
|
371
|
-
/// <returns></returns>
|
|
372
268
|
isRefreshRepeatableAllowed() {
|
|
373
269
|
return this.RefreshRepeatableAllowed;
|
|
374
270
|
}
|
|
375
|
-
/// <summary>
|
|
376
|
-
/// returns true if the form is screen mode
|
|
377
|
-
/// </summary>
|
|
378
271
|
isScreenMode() {
|
|
379
272
|
return !this.isLineMode();
|
|
380
273
|
}
|
|
381
|
-
/// <summary>
|
|
382
|
-
/// returns true if the form is line mode
|
|
383
|
-
/// if we have a tree or a table on the form
|
|
384
|
-
/// </summary>
|
|
385
274
|
isLineMode() {
|
|
386
275
|
return this.getMainControl() !== null;
|
|
387
276
|
}
|
|
388
|
-
/// <summary>
|
|
389
|
-
/// return true if task has table or tree
|
|
390
|
-
/// </summary>
|
|
391
|
-
/// <returns></returns>
|
|
392
277
|
hasTable() {
|
|
393
278
|
return this._tableMgControl !== null;
|
|
394
279
|
}
|
|
395
|
-
/// <summary>
|
|
396
|
-
/// return true if form should be opened as modal window
|
|
397
|
-
/// </summary>
|
|
398
|
-
/// <returns></returns>
|
|
399
280
|
isDialog() {
|
|
400
281
|
let isDialog = false;
|
|
401
282
|
let windowType = this.ConcreteWindowType;
|
|
@@ -405,54 +286,30 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
405
286
|
isDialog = true;
|
|
406
287
|
return isDialog;
|
|
407
288
|
}
|
|
408
|
-
/// <summary>
|
|
409
|
-
/// Should this form behave as Modal although its WindowType != Modal?
|
|
410
|
-
/// </summary>
|
|
411
|
-
/// <returns> boolean</returns>
|
|
412
289
|
isSubForm() {
|
|
413
290
|
return this._subFormCtrl !== null;
|
|
414
291
|
}
|
|
415
|
-
/// <summary>
|
|
416
|
-
/// returns true if this form is subform
|
|
417
|
-
/// </summary>
|
|
418
|
-
/// <returns></returns>
|
|
419
292
|
HasTable() {
|
|
420
293
|
return this._tableMgControl !== null;
|
|
421
294
|
}
|
|
422
|
-
/// <returns></returns>
|
|
423
295
|
getTopMostForm() {
|
|
424
296
|
let topMostForm = this;
|
|
425
|
-
// The form of the sub form control
|
|
426
297
|
while (topMostForm.isSubForm() && topMostForm.ParentForm !== null)
|
|
427
298
|
topMostForm = topMostForm.ParentForm;
|
|
428
299
|
return topMostForm;
|
|
429
300
|
}
|
|
430
|
-
/// <summary>
|
|
431
|
-
/// return the topmost frame form for menu refresh.
|
|
432
|
-
/// </summary>
|
|
433
|
-
/// <returns></returns>
|
|
434
301
|
getTopMostFrameForm() {
|
|
435
302
|
let topMostForm = this;
|
|
436
303
|
while (topMostForm !== null)
|
|
437
304
|
topMostForm = ((topMostForm.ParentForm !== null) ? topMostForm.ParentForm : null);
|
|
438
305
|
return topMostForm;
|
|
439
306
|
}
|
|
440
|
-
/// <summary>
|
|
441
|
-
/// return the topmost mgform of the subform
|
|
442
|
-
/// </summary>
|
|
443
|
-
/// </returns>
|
|
444
307
|
getSubFormCtrl() {
|
|
445
308
|
return this._subFormCtrl;
|
|
446
309
|
}
|
|
447
|
-
/// <summary>
|
|
448
|
-
/// return object that is used for form mapping in control's map
|
|
449
|
-
/// </summary>
|
|
450
|
-
/// <param name = "ctrlIdx">the index of the requested control</param>
|
|
451
310
|
getCtrl(ctrlIdx) {
|
|
452
311
|
return this.CtrlTab.getCtrl(ctrlIdx);
|
|
453
312
|
}
|
|
454
|
-
/// <summary>Returns the requested control</summary>
|
|
455
|
-
/// <returns> a reference to the control with the given name or null if does not exist</returns>
|
|
456
313
|
GetCtrl(ctrlName) {
|
|
457
314
|
return this.CtrlTab.getCtrl(ctrlName);
|
|
458
315
|
}
|
|
@@ -464,11 +321,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
464
321
|
}
|
|
465
322
|
return this.defaultRouterOutlet;
|
|
466
323
|
}
|
|
467
|
-
/// <summary>
|
|
468
|
-
/// Return the control with a given name
|
|
469
|
-
/// </summary>
|
|
470
|
-
/// <param name = "ctrlName">the of the requested control</param>
|
|
471
|
-
/// <returns></returns>
|
|
472
324
|
GetChoiceControlItemList(mgControl) {
|
|
473
325
|
return __awaiter(this, void 0, void 0, function* () {
|
|
474
326
|
Debug.Assert(mgControl.isChoiceControl());
|
|
@@ -490,11 +342,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
490
342
|
return NString.Empty;
|
|
491
343
|
});
|
|
492
344
|
}
|
|
493
|
-
/// <summary>
|
|
494
|
-
/// Get the items list of choice controls.
|
|
495
|
-
/// </summary>
|
|
496
|
-
/// <param name="mgControl"></param>
|
|
497
|
-
/// <returns></returns>
|
|
498
345
|
GetChoiceControlDisplayList(mgControl) {
|
|
499
346
|
return __awaiter(this, void 0, void 0, function* () {
|
|
500
347
|
Debug.Assert(mgControl.isChoiceControl());
|
|
@@ -516,27 +363,15 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
516
363
|
return NString.Empty;
|
|
517
364
|
});
|
|
518
365
|
}
|
|
519
|
-
/// <summary>
|
|
520
|
-
/// Returns the comma concatenated string from array list.
|
|
521
|
-
/// </summary>
|
|
522
|
-
/// <param name="items"></param>
|
|
523
|
-
/// <param name="isItemNumType"></param>
|
|
524
|
-
/// <returns></returns>
|
|
525
366
|
getControlColumn(ctrl) {
|
|
526
367
|
let column = null;
|
|
527
368
|
if ((ctrl.IsRepeatable || ctrl.IsTableHeaderChild) && this._tableColumns !== null)
|
|
528
369
|
column = this._tableColumns.get_Item(ctrl.getLayer() - 1);
|
|
529
370
|
return column;
|
|
530
371
|
}
|
|
531
|
-
/// <returns> the container control</returns>
|
|
532
372
|
getContainerCtrl() {
|
|
533
373
|
return this._containerCtrl;
|
|
534
374
|
}
|
|
535
|
-
/// <summary>
|
|
536
|
-
/// return control's column
|
|
537
|
-
/// </summary>
|
|
538
|
-
/// <param name = "ctrl"></param>
|
|
539
|
-
/// </summary>
|
|
540
375
|
getColumnControls() {
|
|
541
376
|
let columnControlsList = null;
|
|
542
377
|
if (this.CtrlTab !== null) {
|
|
@@ -551,38 +386,22 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
551
386
|
}
|
|
552
387
|
return columnControlsList;
|
|
553
388
|
}
|
|
554
|
-
/// </summary>
|
|
555
389
|
getTask() {
|
|
556
390
|
return this._task;
|
|
557
391
|
}
|
|
558
|
-
/// <summary>
|
|
559
|
-
/// converts from double pixels to uom
|
|
560
|
-
/// </summary>
|
|
561
|
-
/// <param name="pixVal"></param>
|
|
562
|
-
/// <param name="isXaxis"></param>
|
|
563
|
-
/// <returns></returns>
|
|
564
392
|
getTableCtrl() {
|
|
565
393
|
return this._tableMgControl;
|
|
566
394
|
}
|
|
567
|
-
/// <summary>
|
|
568
|
-
/// after open the form need to move it according to the startup position property on the form
|
|
569
|
-
/// PROP_TYPE_STARTUP_POSITION
|
|
570
|
-
/// <returns></returns>
|
|
571
395
|
getMainControl() {
|
|
572
396
|
return this._tableMgControl;
|
|
573
397
|
}
|
|
574
|
-
/// <returns> a reference to the control with the given name or null if does not exist</returns>
|
|
575
398
|
getCtrlByName(ctrlName, ctrlType) {
|
|
576
399
|
return this.CtrlTab.getCtrlByName(ctrlName, ctrlType);
|
|
577
400
|
}
|
|
578
|
-
/// <summary>
|
|
579
|
-
/// return Point ,center to the giving relativeRect
|
|
580
|
-
/// <param name = "idx"></param>
|
|
581
401
|
checkAndCreateRow(idx) {
|
|
582
402
|
if (this._tableMgControl !== null && !this.isRowCreated(idx))
|
|
583
403
|
this.createRow(idx);
|
|
584
404
|
}
|
|
585
|
-
/// <param name="idx"></param>
|
|
586
405
|
IsValidRow(idx) {
|
|
587
406
|
let validRow = false;
|
|
588
407
|
if (this._tableMgControl !== null && idx >= 0 && idx < this.Rows.length) {
|
|
@@ -591,40 +410,23 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
591
410
|
}
|
|
592
411
|
return validRow;
|
|
593
412
|
}
|
|
594
|
-
/// <summary>
|
|
595
|
-
/// get table control
|
|
596
|
-
/// </summary>
|
|
597
|
-
/// <summary>
|
|
598
|
-
/// return tree or table control of the form
|
|
599
|
-
/// </summary>
|
|
600
|
-
/// </summary>
|
|
601
413
|
refreshProps() {
|
|
602
414
|
return __awaiter(this, void 0, void 0, function* () {
|
|
603
415
|
if (this._firstRefreshOfProps) {
|
|
604
|
-
|
|
416
|
+
this.getProp(PropInterface.PROP_TYPE_TITLE_BAR);
|
|
605
417
|
}
|
|
606
418
|
yield this._propTab.RefreshDisplay(false, false);
|
|
607
419
|
if (this._firstRefreshOfProps)
|
|
608
420
|
this._firstRefreshOfProps = false;
|
|
609
421
|
});
|
|
610
422
|
}
|
|
611
|
-
/// <summary>
|
|
612
|
-
/// Return the control (which is not the frame form) with a given name
|
|
613
|
-
/// </summary>
|
|
614
|
-
/// <param name = "ctrlName">the of the requested control</param>
|
|
615
|
-
/// <param name="ctrlType"></param>
|
|
616
|
-
/// <param name = "repeatableOnly">should be true in order to refresh only the controls that belong to a table</param>
|
|
617
423
|
refreshControls(repeatableOnly) {
|
|
618
424
|
return __awaiter(this, void 0, void 0, function* () {
|
|
619
425
|
let ctrl;
|
|
620
|
-
// record does not exist
|
|
621
426
|
if (this.DisplayLine === Int32.MinValue)
|
|
622
427
|
return;
|
|
623
|
-
// refresh the table first
|
|
624
428
|
if (this._tableMgControl !== null && !repeatableOnly)
|
|
625
429
|
yield this._tableMgControl.RefreshDisplay();
|
|
626
|
-
// refresh all COLUMNS (refresh for each control base on the refresh of the column (e.g:column width)
|
|
627
|
-
// so we must refresh the column first
|
|
628
430
|
if (this._tableColumns !== null && !repeatableOnly) {
|
|
629
431
|
for (let i = 0; i < this._tableColumns.length; i = i + 1) {
|
|
630
432
|
let mgControlBase = this._tableColumns.get_Item(i);
|
|
@@ -632,10 +434,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
632
434
|
}
|
|
633
435
|
}
|
|
634
436
|
this.checkAndCreateRow(this.DisplayLine);
|
|
635
|
-
// QCR #709563 Must refresh frameset's subfroms before we refresh frameset itself.
|
|
636
|
-
// During refresh of the frameset nested subforms with RefreshWhenHidden might be brought to server
|
|
637
|
-
// but their subform's controls have not been set with correct bounds. This causes illegal placement
|
|
638
|
-
// and incorrect final location of controls on nested subforms
|
|
639
437
|
let tabAndGroupControls = new Stack();
|
|
640
438
|
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
641
439
|
ctrl = this.CtrlTab.getCtrl(i);
|
|
@@ -651,15 +449,11 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
651
449
|
}
|
|
652
450
|
});
|
|
653
451
|
}
|
|
654
|
-
/// <param name = "idx"></param>
|
|
655
452
|
markRowNOTCreated(idx) {
|
|
656
453
|
Commands.addWithNumber(CommandType.UNDO_CREATE_TABLE_ROW, this._tableMgControl, idx);
|
|
657
454
|
if (idx >= 0 && idx < this.Rows.length)
|
|
658
455
|
this.Rows.set_Item(idx, new Row(false, false));
|
|
659
456
|
}
|
|
660
|
-
/// <summary>
|
|
661
|
-
/// validate row
|
|
662
|
-
/// </summary>
|
|
663
457
|
SelectRow(sendAlwaysOrRowIdx, sendAlways) {
|
|
664
458
|
if (arguments.length === 0)
|
|
665
459
|
this.SelectRow_0();
|
|
@@ -668,32 +462,15 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
668
462
|
else
|
|
669
463
|
this.SelectRow_2(sendAlwaysOrRowIdx, sendAlways);
|
|
670
464
|
}
|
|
671
|
-
/// <summary>(public)
|
|
672
|
-
/// check if specified row is valid row in page
|
|
673
|
-
/// </summary>
|
|
674
|
-
/// <summary>
|
|
675
|
-
/// refresh the controls of the current row
|
|
676
|
-
/// </summary>
|
|
677
|
-
/// <returns> int is the table size</returns>
|
|
678
465
|
getRowsInPage() {
|
|
679
466
|
return this._rowsInPage;
|
|
680
467
|
}
|
|
681
|
-
/// <returns> int is the table size</returns>
|
|
682
468
|
getMaxRowsInPaginatedTable() {
|
|
683
469
|
return this._maxRowsInPaginatedTable;
|
|
684
470
|
}
|
|
685
|
-
/// <summary>
|
|
686
|
-
/// returns true if Row is created on GUI level
|
|
687
|
-
/// </summary>
|
|
688
|
-
/// <param name = "idx"></param>
|
|
689
|
-
/// <param name = "size">the table size</param>
|
|
690
471
|
setRowsInPage(size) {
|
|
691
472
|
this._rowsInPage = size;
|
|
692
473
|
}
|
|
693
|
-
/// <summary>
|
|
694
|
-
/// marks this row as not created
|
|
695
|
-
/// </summary>
|
|
696
|
-
/// <returns></returns>
|
|
697
474
|
getColumnsCount() {
|
|
698
475
|
let columnsCount = 0;
|
|
699
476
|
if (this.CtrlTab !== null) {
|
|
@@ -705,50 +482,29 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
705
482
|
}
|
|
706
483
|
return columnsCount;
|
|
707
484
|
}
|
|
708
|
-
/// </summary>
|
|
709
485
|
inRefreshDisplay() {
|
|
710
486
|
return this._inRefreshDisp;
|
|
711
487
|
}
|
|
712
488
|
setTitle(newTitle) {
|
|
713
489
|
Commands.setTitle(this, newTitle);
|
|
714
490
|
}
|
|
715
|
-
/// <summary>
|
|
716
|
-
/// returns the value of the "in refresh display" flag
|
|
717
491
|
getControlIdx(ctrl) {
|
|
718
492
|
return this.CtrlTab.getControlIdx(ctrl, true);
|
|
719
493
|
}
|
|
720
|
-
/// <summary>
|
|
721
|
-
/// Execute the layout and all its children
|
|
722
|
-
/// </summary>
|
|
723
494
|
getTopIndexFromGUI() {
|
|
724
495
|
let topDisplayLine = 0;
|
|
725
496
|
if (this.hasTable())
|
|
726
497
|
topDisplayLine = Commands.getTopIndex(this.getMainControl());
|
|
727
498
|
return topDisplayLine;
|
|
728
499
|
}
|
|
729
|
-
/// <summary>
|
|
730
|
-
/// return TRUE if this group is the last group in the toolbar
|
|
731
|
-
/// </summary>
|
|
732
|
-
/// <param name = "groupNumber"></param>
|
|
733
|
-
/// <returns> table items count</returns>
|
|
734
500
|
getTableItemsCount() {
|
|
735
501
|
return this._tableItemsCount;
|
|
736
502
|
}
|
|
737
|
-
/// <summary>
|
|
738
|
-
/// Table control is always first on the form
|
|
739
|
-
/// When table is a child of tab, it is created before tab's layers(TabPages) are created.
|
|
740
|
-
/// Computing Tab's children coordinates depends on the TabPages being created
|
|
741
|
-
/// So, we must fix table's location after Tab is created
|
|
742
|
-
/// QCR #289966
|
|
743
|
-
/// </summary>
|
|
744
503
|
removeRefsToCtrls() {
|
|
745
504
|
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
746
505
|
this.CtrlTab.getCtrl(i).removeRefFromField();
|
|
747
506
|
}
|
|
748
507
|
}
|
|
749
|
-
/// <summary>
|
|
750
|
-
/// this form may have ActiveRowHightlightState
|
|
751
|
-
/// </summary>
|
|
752
508
|
buildTableChildren() {
|
|
753
509
|
if (this._tableChildren === null) {
|
|
754
510
|
this._tableChildren = new List();
|
|
@@ -775,26 +531,15 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
775
531
|
}
|
|
776
532
|
}
|
|
777
533
|
}
|
|
778
|
-
/// <summary>
|
|
779
|
-
/// return the prev group index if exist
|
|
780
|
-
/// </summary>
|
|
781
|
-
/// <param name = "currGroup"></param>
|
|
782
|
-
/// <param name = "tableCtrl">the tableCtrl to set</param>
|
|
783
534
|
setTableCtrl(tableCtrl) {
|
|
784
535
|
this._tableMgControl = tableCtrl;
|
|
785
536
|
}
|
|
786
|
-
/// <summary>
|
|
787
|
-
/// sets the property
|
|
788
|
-
/// </summary>
|
|
789
|
-
/// <param name = "propId"></param>
|
|
790
537
|
getCtrlCount() {
|
|
791
538
|
return this.CtrlTab.getSize();
|
|
792
539
|
}
|
|
793
|
-
/// <returns></returns>
|
|
794
540
|
GetControlsCountExcludingStatusBar() {
|
|
795
541
|
return this.CtrlTab.getSize();
|
|
796
542
|
}
|
|
797
|
-
/// </summary>
|
|
798
543
|
refreshPropsOnExpression() {
|
|
799
544
|
return __awaiter(this, void 0, void 0, function* () {
|
|
800
545
|
let i;
|
|
@@ -810,7 +555,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
810
555
|
}
|
|
811
556
|
});
|
|
812
557
|
}
|
|
813
|
-
/// <returns></returns>
|
|
814
558
|
getTabControl(ctrl) {
|
|
815
559
|
let obj;
|
|
816
560
|
let result = null;
|
|
@@ -823,7 +567,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
823
567
|
}
|
|
824
568
|
obj = currCtrl.getParent();
|
|
825
569
|
}
|
|
826
|
-
// if ctrl is not tab and not tab's child - find first tab in the form
|
|
827
570
|
if (result == null) {
|
|
828
571
|
for (let i = 0; i < this.CtrlTab.getSize(); i++) {
|
|
829
572
|
obj = this.CtrlTab.getCtrl(i);
|
|
@@ -835,8 +578,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
835
578
|
}
|
|
836
579
|
return result;
|
|
837
580
|
}
|
|
838
|
-
/// <summary>
|
|
839
|
-
/// remove references to the controls of this form
|
|
840
581
|
IsInputType(ctrl) {
|
|
841
582
|
switch (ctrl.Type) {
|
|
842
583
|
case MgControlType.CTRL_TYPE_CHECKBOX:
|
|
@@ -849,8 +590,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
849
590
|
return false;
|
|
850
591
|
}
|
|
851
592
|
}
|
|
852
|
-
/// <summary>
|
|
853
|
-
/// build list of table children
|
|
854
593
|
GetListOfInputControls() {
|
|
855
594
|
let filterterList = this.CtrlTab.filter(((c, index, array) => this.IsInputType(c)));
|
|
856
595
|
let names = filterterList.reduce((pre, ctrl, i) => {
|
|
@@ -859,30 +598,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
859
598
|
}, {});
|
|
860
599
|
return names;
|
|
861
600
|
}
|
|
862
|
-
// getGuiTableChildren(): List<GuiMgControl> {
|
|
863
|
-
// let flag: boolean = this._guiTableChildren === null;
|
|
864
|
-
// if (flag) {
|
|
865
|
-
// this._guiTableChildren = new List<GuiMgControl>();
|
|
866
|
-
// let tableChildren: List<MgControlBase> = this.TableChildren;
|
|
867
|
-
// let enumerator: List_Enumerator<MgControlBase> = tableChildren.GetEnumerator();
|
|
868
|
-
// try {
|
|
869
|
-
// while (enumerator.MoveNext()) {
|
|
870
|
-
// let current: MgControlBase = enumerator.Current;
|
|
871
|
-
// this._guiTableChildren.Add(current);
|
|
872
|
-
// }
|
|
873
|
-
// }
|
|
874
|
-
// finally {
|
|
875
|
-
// (<IDisposable>enumerator).Dispose();
|
|
876
|
-
// }
|
|
877
|
-
// }
|
|
878
|
-
// return this._guiTableChildren;
|
|
879
|
-
// }
|
|
880
|
-
/// <summary>
|
|
881
|
-
/// Sets the table control related to this form
|
|
882
|
-
/// </summary>
|
|
883
|
-
/// <summary>
|
|
884
|
-
/// Refresh form display if it has a property which is an expression
|
|
885
|
-
/// </summary>
|
|
886
601
|
firstTableRefresh() {
|
|
887
602
|
if (this._tableMgControl !== null) {
|
|
888
603
|
this._rowsInPage = Commands.getRowsInPage(this._tableMgControl);
|
|
@@ -909,10 +624,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
909
624
|
}
|
|
910
625
|
this.InitTableControl_1(dvSize, tableItemsCount, removeAll);
|
|
911
626
|
}
|
|
912
|
-
/// <summary>
|
|
913
|
-
/// update arrays of table children controls
|
|
914
|
-
/// </summary>
|
|
915
|
-
/// <param name="size"></param>
|
|
916
627
|
UpdateTableChildrenArraysSize(size) {
|
|
917
628
|
let children = this.TableChildren;
|
|
918
629
|
if (children != null) {
|
|
@@ -924,15 +635,9 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
924
635
|
if (this._tableMgControl != null)
|
|
925
636
|
this._tableMgControl.updateArrays(size);
|
|
926
637
|
}
|
|
927
|
-
/// <summary>
|
|
928
|
-
/// find tab control for performing CTRL+TAB && CTRL+SHIFT+TAB actions
|
|
929
|
-
/// the code original is in RT::skip_to_tab_control
|
|
930
|
-
/// </summary>
|
|
931
|
-
/// <param name = "ctrl">current control</param>
|
|
932
638
|
toString() {
|
|
933
639
|
return '{GuiMgForm' + ': Id=' + this._userStateId + '}';
|
|
934
640
|
}
|
|
935
|
-
/// <returns></returns>
|
|
936
641
|
IncludeControlInTabbingOrder(control, includeControlChildOfFrameForm) {
|
|
937
642
|
if (!control.PropertyExists(PropInterface.PROP_TYPE_TAB_ORDER))
|
|
938
643
|
return false;
|
|
@@ -941,38 +646,27 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
941
646
|
GetHashCode() {
|
|
942
647
|
return this.FormIsn;
|
|
943
648
|
}
|
|
944
|
-
/// <returns></returns>
|
|
945
649
|
initInnerObjects(foundTagName) {
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
return false;
|
|
966
|
-
return true;
|
|
967
|
-
});
|
|
650
|
+
if (foundTagName === null)
|
|
651
|
+
return false;
|
|
652
|
+
let parser = Manager.GetCurrentRuntimeContext().Parser;
|
|
653
|
+
if (MgFormBase.IsFormTag(foundTagName))
|
|
654
|
+
this.fillName(foundTagName);
|
|
655
|
+
else if (foundTagName === XMLConstants.MG_TAG_PROP)
|
|
656
|
+
this._propTab.fillData(this, 'F', parser);
|
|
657
|
+
else if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
|
|
658
|
+
this.CtrlTab.fillData(this, parser);
|
|
659
|
+
if (!this.HasTable())
|
|
660
|
+
this.RefreshRepeatableAllowed = true;
|
|
661
|
+
}
|
|
662
|
+
else if (MgFormBase.IsEndFormTag(foundTagName)) {
|
|
663
|
+
parser.setCurrIndex2EndOfTag();
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
else
|
|
667
|
+
return false;
|
|
668
|
+
return true;
|
|
968
669
|
}
|
|
969
|
-
/// <summary>
|
|
970
|
-
/// constructs an object of MgControl
|
|
971
|
-
/// </summary>
|
|
972
|
-
/// <param name="type"></param>
|
|
973
|
-
/// <param name="task"></param>
|
|
974
|
-
/// <param name="parentControl"></param>
|
|
975
|
-
/// <returns></returns>
|
|
976
670
|
isRowCreated(idx) {
|
|
977
671
|
if (this.Rows.length <= idx || idx < 0) {
|
|
978
672
|
return false;
|
|
@@ -982,7 +676,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
982
676
|
return false;
|
|
983
677
|
return row.Created;
|
|
984
678
|
}
|
|
985
|
-
/// </summary>
|
|
986
679
|
buildLinkedControlsLists() {
|
|
987
680
|
for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
|
|
988
681
|
let ctrl = this.CtrlTab.getCtrl(i);
|
|
@@ -991,9 +684,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
991
684
|
linkedParent.linkCtrl(ctrl);
|
|
992
685
|
}
|
|
993
686
|
}
|
|
994
|
-
/// <summary>
|
|
995
|
-
/// build list of all columns controls
|
|
996
|
-
/// </summary>
|
|
997
687
|
buildTableColumnsList() {
|
|
998
688
|
if (this._tableMgControl !== null) {
|
|
999
689
|
this._tableColumns = new List();
|
|
@@ -1004,10 +694,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
1004
694
|
}
|
|
1005
695
|
}
|
|
1006
696
|
}
|
|
1007
|
-
/// <summary>
|
|
1008
|
-
/// update arrays of table children controls
|
|
1009
|
-
/// </summary>
|
|
1010
|
-
/// <param name = "idx"></param>
|
|
1011
697
|
createRow(idx) {
|
|
1012
698
|
Commands.addWithNumber(CommandType.CREATE_TABLE_ROW, this._tableMgControl, idx);
|
|
1013
699
|
if (this.Rows.length <= idx)
|
|
@@ -1017,41 +703,24 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
1017
703
|
SelectRow_0() {
|
|
1018
704
|
this.SelectRow(false);
|
|
1019
705
|
}
|
|
1020
|
-
/// <summary>
|
|
1021
|
-
/// Get the appropriate window type for a Default window type.
|
|
1022
|
-
/// </summary>
|
|
1023
|
-
/// <param name="windowType"></param>
|
|
1024
|
-
/// </summary>
|
|
1025
706
|
SelectRow_1(sendAlways) {
|
|
1026
707
|
this.SelectRow(this.DisplayLine, sendAlways);
|
|
1027
708
|
}
|
|
1028
|
-
/// <summary>
|
|
1029
|
-
/// For online we need to pit 'ACT_HIT' when the form was closed from system menu
|
|
1030
|
-
/// if the task has only subform control on it.
|
|
1031
|
-
/// For RC always return false
|
|
1032
|
-
/// </summary>
|
|
1033
|
-
/// <param name = "sendAlways">send selection command depending on previous value</param>
|
|
1034
709
|
SelectRow_2(rowIdx, sendAlways) {
|
|
1035
|
-
// controlForSelect can be table control or tree control
|
|
1036
710
|
let mainControl = this.getMainControl();
|
|
1037
711
|
if (mainControl !== null && this.RefreshRepeatableAllowed) {
|
|
1038
712
|
let index = rowIdx;
|
|
1039
713
|
if (this._task.DataView.isEmptyDataview())
|
|
1040
714
|
index = GuiConstants.NO_ROW_SELECTED;
|
|
1041
715
|
if (sendAlways || index !== this._prevSelIndex) {
|
|
1042
|
-
// for tree control we always send selection, since sometimes we need to undo tree defaul selection
|
|
1043
716
|
this._prevSelIndex = index;
|
|
1044
717
|
Commands.addOperationWithLine(CommandType.SET_PROPERTY, mainControl, 0, HtmlProperties.SelectedRow, index);
|
|
1045
718
|
}
|
|
1046
719
|
}
|
|
1047
720
|
}
|
|
1048
|
-
/// <summary>
|
|
1049
|
-
/// force all MgControls to update the colors used on the controls
|
|
1050
|
-
/// </summary>
|
|
1051
721
|
InitTableControl_0() {
|
|
1052
722
|
this.InitTableControl(1, 1, false);
|
|
1053
723
|
}
|
|
1054
|
-
/// <param name = "removeAll">remove all elements form the table including first and last dummy elements</param>
|
|
1055
724
|
InitTableControl_1(dvSize, tableItemsCount, removeAll) {
|
|
1056
725
|
if (this._tableMgControl != null) {
|
|
1057
726
|
Commands.addWithNumber(CommandType.SET_TABLE_ITEMS_COUNT, this._tableMgControl, tableItemsCount);
|
|
@@ -1063,10 +732,6 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
1063
732
|
this._maxRowsInPaginatedTable = Commands.getMaxRowsInPaginatedTable(this._tableMgControl);
|
|
1064
733
|
}
|
|
1065
734
|
}
|
|
1066
|
-
/// <summary>
|
|
1067
|
-
/// update arrays of table children controls
|
|
1068
|
-
/// </summary>
|
|
1069
|
-
/// <param name="size"></param>
|
|
1070
735
|
InsertTableChildrenArrays(idx, count) {
|
|
1071
736
|
let children = this.TableChildren;
|
|
1072
737
|
if (children != null) {
|
|
@@ -1077,14 +742,10 @@ export class MgFormBase extends GuiFormPropertyAdapter {
|
|
|
1077
742
|
}
|
|
1078
743
|
}
|
|
1079
744
|
}
|
|
1080
|
-
/// <summary>
|
|
1081
|
-
/// class describing row
|
|
1082
|
-
/// </summary>
|
|
1083
|
-
/// <author>rinav</author>
|
|
1084
745
|
export class Row {
|
|
1085
746
|
constructor(created, validated) {
|
|
1086
|
-
this.Created = false;
|
|
1087
|
-
this.Validated = false;
|
|
747
|
+
this.Created = false;
|
|
748
|
+
this.Validated = false;
|
|
1088
749
|
if (arguments.length === 0) {
|
|
1089
750
|
this.constructor_0();
|
|
1090
751
|
return;
|
|
@@ -1099,4 +760,4 @@ export class Row {
|
|
|
1099
760
|
this.Validated = validated;
|
|
1100
761
|
}
|
|
1101
762
|
}
|
|
1102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBYSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBWSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FB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QUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvcFBhcmVudEludGVyZmFjZSB9IGZyb20gJy4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBUYWJiaW5nT3JkZXJUeXBlLFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBEZWJ1ZywgSUhhc2hDb2RlLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2xCYXNlIH0gZnJvbSAnLi9NZ0NvbnRyb2xCYXNlJztcclxuaW1wb3J0IHsgUHJvcFRhYmxlIH0gZnJvbSAnLi9Qcm9wVGFibGUnO1xyXG5pbXBvcnQgeyBHdWlUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHsgQ29udHJvbFRhYmxlIH0gZnJvbSAnLi9Db250cm9sVGFibGUnO1xyXG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi9Qcm9wZXJ0eSc7XHJcbmltcG9ydCB7IENvbW1hbmRUeXBlLCBIdG1sUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHsgTlVNX1RZUEUgfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7IEd1aUZpZWxkQmFzZSB9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHsgUHJvcEludGVyZmFjZSB9IGZyb20gJy4vUHJvcEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEd1aUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tICcuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQgeyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIH0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuXHJcblxyXG5jb25zdCBkZWxpbWl0ZXI6IHN0cmluZyA9ICcsICc7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBkYXRhIGZvciA8Zm9ybT4uLi48L2Zvcm0+XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNZ0Zvcm1CYXNlIGV4dGVuZHMgR3VpRm9ybVByb3BlcnR5QWRhcHRlciBpbXBsZW1lbnRzIFByb3BQYXJlbnRJbnRlcmZhY2UsIElIYXNoQ29kZSB7XHJcbiAgSW5Jbml0Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBDdHJsVGFiOiBDb250cm9sVGFibGUgPSBudWxsO1xyXG4gIC8vIHVudGlsIHRoZSBmb3JtIGlzIHJlZnJlc2hlZCBpbiB0aGUgZmlyc3QgdGltZVxyXG4gIEZvcm1SZWZyZXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBSZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBSb3dzOiBMaXN0PFJvdz4gPSBudWxsO1xyXG4gIE1vZGFsRm9ybXNDb3VudDogbnVtYmVyID0gMDtcclxuICBFcnJvck9jY3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGb3JtSXNuOiBudW1iZXIgPSAwO1xyXG4gIE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNMZWdhbEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQQkltYWdlc051bWJlcjogbnVtYmVyID0gMDtcclxuICBpZ25vcmVGaXJzdFJlZnJlc2hUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcm90ZWN0ZWQgX2Rlc3RUYmxSb3c6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByb3RlY3RlZCBfZmlyc3RUYWJsZVRhYk9yZGVyOiBudW1iZXIgPSAwOyAgICAgICAgICAgIC8vIHRhYiBvcmRlciBvZiBmaXJzdCBjaGlsZCBvZiB0YWJsZVxyXG4gIHByb3RlY3RlZCBfaW5SZWZyZXNoRGlzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfaW5SZXN0b3JlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9sYXN0Um93U2VudDogbnVtYmVyID0gLTE7ICAgICAgICAgICAgICAgICAgLy8gbGFzdCByb3cgc2VudCBybyBndWkgdGhyZWFkXHJcbiAgcHJvdGVjdGVkIF9wcmV2R3VpVG9wSW5kZXg6IG51bWJlciA9IC0xOyAgICAgICAgICAgICAgLy8gRm9yIHBhZ2luYXRlZCB0YWJsZSBpdCdzIEd1aVRvcEluZGV4IGVsc2UgaXQncyBkdlRvcEluZGV4XHJcbiAgcHJvdGVjdGVkIF9wcm9wVGFiOiBQcm9wVGFibGUgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfcm93c0luUGFnZTogbnVtYmVyID0gMTtcclxuICBwcm90ZWN0ZWQgX21heFJvd3NJblBhZ2luYXRlZFRhYmxlOiBudW1iZXIgPSAwOyAgICAgICAvLyBtYXggbm8gb2Ygcm93cyBpbiBwYWdpbmF0ZWQgdGFibGVcclxuICBwcm90ZWN0ZWQgX3N1YkZvcm1DdHJsOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX3RhYmxlTWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX3RhYmxlSXRlbXNDb3VudDogbnVtYmVyID0gMDsgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGVcclxuICBwcm90ZWN0ZWQgX3RhYmxlUmVmcmVzaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF90YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhc2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZm9ybSBiZWxvbmdzXHJcbiAgcHJvdGVjdGVkIF90b3BJbmRleFVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gdHJ1ZSBpZiBhIHRvcCBpbmRleCB3YXMgdXBkYXRlZFxyXG5cclxuICAvLyBGb3JtIHJlcHJlc2VudGluZyB0aGUgaW50ZXJuYWwgaGVscCB3aW5kb3cuSGVyZSB0aGUgaW50ZXJuYWwgZm9ybSBvYmplY3QgaXMga2VwdCBvbiB0aGUgZm9ybSBvYmplY3QgaXRzZWxmLlxyXG4gIHByb3RlY3RlZCBfdHJhbnNmZXJpbmdEYXRhOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIHJvd3MgYXJlIHJlcXVlc3RlZCBmb3IgYSBHVUkgdGhyZWFkXHJcbiAgLy8gcHJldmVudHMgcmVmcmVzaCBvZiBEaXNwbGF5TGlzdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbHMgYW5kIGN1cnJSZWNDb21wdXRlKFJDKVxyXG4gIHByaXZhdGUgX2FsbG93ZWRTdWJmb3JtUmVjb21wdXRlOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9jb25jcmV0ZVdpbmRvd1R5cGU6IFdpbmRvd1R5cGUgPSAwO1xyXG4gIHByaXZhdGUgX2NvbnRhaW5lckN0cmw6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpcnN0UmVmcmVzaE9mUHJvcHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9wcmV2U2VsSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgX3Nob3VsZENyZWF0ZVRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgIC8vIGlmIHRvIGNyZWF0ZSB0b29sYmFyXHJcbiAgcHJpdmF0ZSBfdGFibGVDaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7ICAgLy8gQ2FuJ3QgdXNlIExpc3Q8VD5cclxuICBwcml2YXRlIF90YWJsZUNvbHVtbnM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdXNlclN0YXRlSWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIGRpc3BsYXlMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5DdHJsVGFiID0gbmV3IENvbnRyb2xUYWJsZSgpO1xyXG4gICAgdGhpcy5Sb3dzID0gbmV3IExpc3QoKTtcclxuICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPjA7XHJcbiAgICB0aGlzLlBhcmVudEZvcm0gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IERpc3BsYXlMaW5lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIHNldCBEaXNwbGF5TGluZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlMaW5lID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVW5pcXVlTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUUpICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IFRhYmxlQ2hpbGRyZW4oKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVDaGlsZHJlbiA9PT0gbnVsbClcclxuICAgICAgdGhpcy5idWlsZFRhYmxlQ2hpbGRyZW4oKTtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgc2V0IFRhYmxlQ2hpbGRyZW4odmFsdWU6IExpc3Q8TWdDb250cm9sQmFzZT4pIHtcclxuICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBTaG91bGRDcmVhdGVUb29sYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZENyZWF0ZVRvb2xiYXI7XHJcbiAgfVxyXG5cclxuICBnZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICBzZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIGEgRml0VG9NZGkgd2luZG93LlxyXG5cclxuICBnZXQgQ29uY3JldGVXaW5kb3dUeXBlKCk6IFdpbmRvd1R5cGUge1xyXG4gICAgaWYgKHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9PT0gPFdpbmRvd1R5cGU+MCkge1xyXG4gICAgICBsZXQgd2luZG93VHlwZTogV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPnRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRSkuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgaWYgKHRoaXMuUGFyZW50Rm9ybSA9PT0gbnVsbCB8fCB3aW5kb3dUeXBlICE9PSBXaW5kb3dUeXBlLk92ZXJsYXkpXHJcbiAgICAgICAgd2luZG93VHlwZSA9IFdpbmRvd1R5cGUuRGVmYXVsdDtcclxuXHJcbiAgICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IHdpbmRvd1R5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIEZsb2F0aW5nLCBUb29sIG9yIE1vZGFsLlxyXG5cclxuICBzZXQgQ29uY3JldGVXaW5kb3dUeXBlKHZhbHVlOiBXaW5kb3dUeXBlKSB7XHJcbiAgICB0aGlzLl9jb25jcmV0ZVdpbmRvd1R5cGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgZW5hYmxlcyBhIHNwZWNpZmljIGFjdGlvbiBvbiBhbGwgdGhlIG1lbnUgb2JqZWN0cyBvZiB0aGUgZm9ybSBhbmQgaXRzIGNoaWxkcmVuJ3NcclxuICAvLy8gbWVudXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdGlvblwiPmFjdGlvbiB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZDwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3VsZFB1dEFjdE9uRm9ybUNsb3NlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGZvcm0gdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZCBieSBpdHMgSWRcclxuICAvLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIGEgcHJvcGVydHkgaWYgaXQgaXNuJ3QgZXhpc3QuXHJcbiAgLy8vIE1heSB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHByb3BlcnR5IGFuZCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuXHJcbiAgLy8vIEluIFBoYXNlIDIgaW4gUmVmcmVzaFByb3BlcnRpZXMgbWV0aG9kIHdlJ2xsIGNyZWF0ZSBhbmQgY29tcHV0ZSBwcm9wZXJ0aWVzLFxyXG4gIC8vLyBwZXJoYXBzIHdlIG5lZWQgY3JlYXRlIGFsbCBwcm9wZXJ0aWVzIG5vdCBvbmx5IHRob3NlIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgc3RhdGljIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyBpZiBwcm9wZXJ0eSBoYXMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBDb252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXM6IExpc3Q8c3RyaW5nPiwgaXNJdGVtTnVtVHlwZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgZnJvbTogc3RyaW5nW10gPSBbJ1xcXFwnLCAnLScsICcsJ107XHJcbiAgICBsZXQgdG86IHN0cmluZ1tdID0gWydcXFxcXFxcXCcsICdcXFxcLScsICdcXFxcLCddO1xyXG4gICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG5VTV9UWVBFOiBOVU1fVFlQRTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ID0gaW5kZXggKyAxKSB7XHJcbiAgICAgIGlmIChpc0l0ZW1OdW1UeXBlKSB7XHJcbiAgICAgICAgblVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoPHN0cmluZz5pdGVtcy5nZXRfSXRlbShpbmRleCkpO1xyXG4gICAgICAgIGl0ZW1zLnNldF9JdGVtKGluZGV4LCBuVU1fVFlQRS50b19kb3VibGUoKS50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKDxzdHJpbmc+aXRlbXMuZ2V0X0l0ZW0oaW5kZXgpLCBmcm9tLCB0bykpO1xyXG5cclxuICAgICAgaWYgKGluZGV4IDwgaXRlbXMubGVuZ3RoIC0gMSlcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChkZWxpbWl0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcnNlIHRoZSBmb3JtIHN0cnVjdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5jcmVhc2VcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGFsRm9ybXNDb3VudChtZ0Zvcm1CYXNlOiBNZ0Zvcm1CYXNlLCBpbmNyZWFzZTogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgIGlmIChpbmNyZWFzZSlcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgKz0gMTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgLT0gMTtcclxuXHJcbiAgICBFdmVudHMuU2V0TW9kYWwobWdGb3JtQmFzZSwgaW5jcmVhc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90YXNrLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCB0cnVlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2suR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6YXRpb24uXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2hlY2tJZkV4aXN0UHJvcChwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcEJ5SWQ6IFByb3BlcnR5ID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBleGlzdCA9IChwcm9wQnlJZCAhPT0gbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBuYW1lIG1lbWJlciBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGFzeW5jIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9taXNlPFByb3BlcnR5PiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNLCB0aGlzKTtcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuX3Byb3BUYWIuYWRkUHJvcFdpdGhDaGVja0V4aXN0ZW5jZShwcm9wLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZvciBlYWNoIGNvbnRyb2wgYnVpbGQgdGhlIGxpc3Qgb2YgYWxsIHRoZSBjb250cm9scyB0aGF0IGFyZSBsaW5rZWQgdG8gaXRcclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBHZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuXHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFByb3BlcnR5SGFzRXhwcmVzc2lvbihwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgcmV0dXJuIHByb3AgIT09IG51bGwgJiYgcHJvcC5pc0V4cHJlc3Npb24oKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29tcElkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmdldFRhc2soKSA9PT0gbnVsbCkgPyAwIDogdGhpcy5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFycmFuZ2Ugem9yZGVyIGZvciBjb250cm9scy4gcmVjdXJzaXZlIGZ1bmN0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNGaXJzdFJlZnJlc2hPZlByb3BzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgbGlzdCBvZiBhbGwgY29sdW1ucyBjb250cm9sc1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tzIGlmIGFuIGludGVybmFsIEZpdCB0byBNREkgZm9ybSBuZWVkcyB0byBiZSBjcmVhdGVkIHRvIGhvbGQgdGhlIE1haW4gUHJvZ3JhbSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnJlZmVyZW5jZSB0byB0aGUgb3duZXJUYXNrIG9mIHRoaXMgZm9ybTwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEodGFza1JlZjogR3VpVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuUGFyc2VyO1xyXG5cclxuICAgIGlmICh0aGlzLl90YXNrID09PSBudWxsICYmIHRhc2tSZWYgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2sgPSB0YXNrUmVmO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAvLyBpbml0aWFsaXplcyB0aGUgc3ViZm9ybSBjb250cm9sc1xyXG4gICAgICBjdHJsLkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBidWlsZCBsaXN0cyBvZiBsaW5rZWQgY29udHJvbHMgb24gdGhlaXIgcGFyZW50c1xyXG4gICAgdGhpcy5idWlsZExpbmtlZENvbnRyb2xzTGlzdHMoKTtcclxuXHJcbiAgICAvLyBidWlsZCBsaXN0IG9mIGNvbHVtbnMgYW5kIG5vbiBjb2x1bW5zXHJcbiAgICB0aGlzLmJ1aWxkVGFibGVDb2x1bW5zTGlzdCgpO1xyXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVGb3JtKCk7XHJcblxyXG4gICAgdGhpcy5fdGFzay5zZXRLZXlib2FyZE1hcHBpbmdTdGF0ZShDb25zdGFudHMuQUNUX1NUVF9UQkxfU0NSRUVOX01PREUsIHRoaXMuaXNTY3JlZW5Nb2RlKCkpO1xyXG4gICAgdGhpcy5fdGFzay5zZXRLZXlib2FyZE1hcHBpbmdTdGF0ZShDb25zdGFudHMuQUNUX1NUVF9UQkxfTEVGVF9UT19SSUdIVCwgIXRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUJSRVcpLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG9yZGVyIHRoZSBzcGxpdHRlciBjb250YWluZXIgY2hpbGRyZW4uIFRoZSBjaGlsZCB0aGF0IGlzIGRvY2tlZCB0byBmaWxsIGlzIGFkZGVkIGZpcnN0LCB0aGVuXHJcbiAgLy8vICAgdGhlIHNwbGl0dGVyIGNvbnRyb2wgYW5kIGZpbmFsbHkgdGhlIGNoaWxkIHRoYXQgaXMgZG9ja2VkIGVpdGhlciB0byB0aGUgdG9wIG9yIHRvIHRoZSBsZWZ0XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gZW5kIEluZGV4IG9mIHRoZTxmb3JtIC4uLj4gc3VidGFnPC9yZXR1cm5zPlxyXG4gIGZpbGxOYW1lKGZvcm1UYWc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoZm9ybVRhZykgKyBmb3JtVGFnLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShpKTtcclxuICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShpICsgMSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICAgIHRoaXMuTmFtZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5HdWkpKVxyXG4gICAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUd1aVRvTG9nKE5TdHJpbmcuRm9ybWF0KCdQYXJzaW5nIGZvcm0gXCJ7MH1cIicsIHRoaXMuTmFtZSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSVNfRlJBTUVTRVQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19MSUdBTF9SQ19GT1JNOlxyXG4gICAgICAgICAgICB0aGlzLmlzTGVnYWxGb3JtID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUEJfSU1BR0VTX05VTUJFUjpcclxuICAgICAgICAgICAgdGhpcy5QQkltYWdlc051bWJlciA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRk9STV9JU046XHJcbiAgICAgICAgICAgIHRoaXMuRm9ybUlzbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVVNFUlNUQVRFX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl91c2VyU3RhdGVJZCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdCgnVW5oYW5kbGVkIGF0dHJpYnV0ZSBcXCd7MH1cXCcuJywgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyAxKTsgLy8gdG8gZGVsZXRlIFwiPlwiIHRvb1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZygnaW4gRm9ybS5GaWxsTmFtZSgpIG91dCBvZiBib3VuZHMnKTtcclxuICB9XHJcblxyXG5cclxuICBhYnN0cmFjdCBhc3luYyBidWlsZEZvcm1OYW1lKCk6IFByb21pc2U8c3RyaW5nPjtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIHRydWUgZm9yIG1kaSBjaGlsZCBhbmQgZml0IHRvIG1kaVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2luZG93VHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgY3JlYXRlRm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpbnB1dENvbnRyb2xzID0gdGhpcy5HZXRMaXN0T2ZJbnB1dENvbnRyb2xzKCk7XHJcbiAgICBsZXQgZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IHRoaXMuYnVpbGRGb3JtTmFtZSgpO1xyXG4gICAgaWYgKCF0aGlzLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZW5Gb3JtKHRoaXMsIGZvcm1OYW1lLCAnMCcsIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgaW5wdXRDb250cm9scywgdGhpcy5pc0RpYWxvZygpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZW5zdWJmb3JtKENvbW1hbmRUeXBlLkNSRUFURV9TVUJfRk9STSwgdGhpcy5nZXRTdWJGb3JtQ3RybCgpLCB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksICg8TWdDb250cm9sQmFzZT50aGlzLmdldFN1YkZvcm1DdHJsKCkpLmdldE5hbWUoKSxcclxuICAgICAgICBmb3JtTmFtZSwgaW5wdXRDb250cm9scywgdGhpcy5nZXRUYXNrKCkuUm91dGVyUGF0aCwgdGhpcy5nZXRUYXNrKCkuR2V0Um91dGVyUGFyYW1zKCksIHRoaXMuZ2V0VGFzaygpLkluRGVmYXVsdFJvdXRlck91dGxldCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVmYXVsdCBjcmVhdGUgb25lIHJvdyBpbiB0YWJsZSBjb250cm9sLiBET04nVCBzZXQgaXRlbXMgY291bnQgZHVyaW5nIGZvcm0gb3Blbi5cclxuICAgIC8vIGZpcnN0VGFibGVSZWZyZXNoKCkgd2lsbCBjcmVhdGUgdGhlIGFjdHVhbCByb3dzLCBhbmQgcmVmcmVzaCB0aGUgdGFibGUuXHJcbiAgICBpZiAodGhpcy5IYXNUYWJsZSgpKVxyXG4gICAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2woKTtcclxuXHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgYWRkIHRoZSBjYWxsIGpzIGNvbW1hbmQgYW5kIGdldCB0aGUgcmV0dXJuIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGxKUyhtZXRob2ROYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PGFueT4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIENvbW1hbmRzLmFkZENhbGxKUyh0aGlzLCB0aGlzLlVuaXF1ZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIGZvcm0gaGFzIGF1dG9tYXRpYyB0YWJiaW5nIG9yZGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQXV0b21hdGljVGFiYmluZ09yZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpID09PSBUYWJiaW5nT3JkZXJUeXBlLkF1dG9tYXRpY2FsbHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdHJ1ZSBpZiB3ZSBjYW4gcmVmcmVzaCByZXBlYXRhYmxlIGNvbnRyb2xzXHJcbiAgLy8vICAgUUNSICM0MzQ2NDksIHdlIHByZXZlbnQgcGFpbnRpbmcgdGFibGUncyBjb250cm9sIHVudGlsbCBzaGVsbCBpcyBvcGVuZWQgYW5kIHdlIGtub3cgaG93IG1hbnkgcm93cyB0byBwYWludFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1JlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGZvcm0gaXMgc2NyZWVuIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzU2NyZWVuTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5pc0xpbmVNb2RlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIGxpbmUgbW9kZVxyXG4gIC8vLyAgIGlmIHdlIGhhdmUgYSB0cmVlIG9yIGEgdGFibGUgb24gdGhlIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTGluZU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRNYWluQ29udHJvbCgpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRhc2sgaGFzIHRhYmxlIG9yIHRyZWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaGFzVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgZm9ybSBzaG91bGQgYmUgb3BlbmVkIGFzIG1vZGFsIHdpbmRvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0RpYWxvZygpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHdpbmRvd1R5cGU6IFdpbmRvd1R5cGUgPSB0aGlzLkNvbmNyZXRlV2luZG93VHlwZTtcclxuICAgIGlmICh3aW5kb3dUeXBlID09PSBXaW5kb3dUeXBlLk92ZXJsYXkpXHJcbiAgICAgIGlzRGlhbG9nID0gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKE1nRm9ybUJhc2UuU2hvdWxkQmVoYXZlQXNNb2RhbCgpKVxyXG4gICAgICBpc0RpYWxvZyA9IHRydWU7XHJcbiAgICByZXR1cm4gaXNEaWFsb2c7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3VsZCB0aGlzIGZvcm0gYmVoYXZlIGFzIE1vZGFsIGFsdGhvdWdoIGl0cyBXaW5kb3dUeXBlICE9IE1vZGFsP1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbjwvcmV0dXJucz5cclxuICBpc1N1YkZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3ViRm9ybUN0cmwgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgZm9ybSBpcyBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBIYXNUYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IHRvcE1vc3RGb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcztcclxuXHJcbiAgICAvLyBUaGUgZm9ybSBvZiB0aGUgc3ViIGZvcm0gY29udHJvbFxyXG4gICAgd2hpbGUgKHRvcE1vc3RGb3JtLmlzU3ViRm9ybSgpICYmIHRvcE1vc3RGb3JtLlBhcmVudEZvcm0gIT09IG51bGwpXHJcbiAgICAgIHRvcE1vc3RGb3JtID0gdG9wTW9zdEZvcm0uUGFyZW50Rm9ybTtcclxuXHJcbiAgICByZXR1cm4gdG9wTW9zdEZvcm07XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBmcmFtZSBmb3JtIGZvciBtZW51IHJlZnJlc2guXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUb3BNb3N0RnJhbWVGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgbGV0IHRvcE1vc3RGb3JtOiBNZ0Zvcm1CYXNlID0gdGhpcztcclxuXHJcbiAgICB3aGlsZSAodG9wTW9zdEZvcm0gIT09IG51bGwpXHJcbiAgICAgIHRvcE1vc3RGb3JtID0gKCh0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtICE9PSBudWxsKSA/IHRvcE1vc3RGb3JtLlBhcmVudEZvcm0gOiBudWxsKTtcclxuXHJcbiAgICByZXR1cm4gdG9wTW9zdEZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB0b3Btb3N0IG1nZm9ybSBvZiB0aGUgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0U3ViRm9ybUN0cmwoKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3ViRm9ybUN0cmw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciBmb3JtIG1hcHBpbmcgaW4gY29udHJvbCdzIG1hcFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybElkeFwiPnRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIGdldEN0cmwoY3RybElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+UmV0dXJucyB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIGRvZXMgbm90IGV4aXN0PC9yZXR1cm5zPlxyXG4gIEdldEN0cmwoY3RybE5hbWU6IHN0cmluZyk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVmYXVsdFJvdXRlck91dGxldDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIGdldCBEZWZhdWx0Um91dGVyT3V0bGV0KCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKHRoaXMuZGVmYXVsdFJvdXRlck91dGxldCA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdFJvdXRlck91dGxldCA9IHRoaXMuQ3RybFRhYi5HZXRDb250cm9sKCh4OiBNZ0NvbnRyb2xCYXNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHguSXNEZWZhdWx0Um91dGVyT3V0bGV0KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRSb3V0ZXJPdXRsZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIHRoZSBjb250cm9sIHdpdGggYSBnaXZlbiBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0Q2hvaWNlQ29udHJvbEl0ZW1MaXN0KG1nQ29udHJvbDogTWdDb250cm9sQmFzZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQobWdDb250cm9sLmlzQ2hvaWNlQ29udHJvbCgpKTtcclxuXHJcbiAgICBsZXQgaXRlbXM6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0KCk7XHJcbiAgICBsZXQgZmxkOiBHdWlGaWVsZEJhc2UgPSBtZ0NvbnRyb2wuZ2V0RmllbGQoKTtcclxuICAgIGxldCBzdG9yYWdlQXR0cmlidXRlOiBTdG9yYWdlQXR0cmlidXRlID0gZmxkLmdldENlbGxzVHlwZSgpO1xyXG5cclxuICAgIGlmIChzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgJiYgc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKSB7XHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZsZC5HZXRSYWRpb0N0cmxzKCkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCByYWRpb0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBmbGQuR2V0UmFkaW9DdHJscygpLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgaXRlbXMuQWRkUmFuZ2UoYXdhaXQgcmFkaW9Db250cm9sLkdldEl0ZW1zUmFuZ2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IG1nQ29udHJvbC5HZXRJdGVtc1JhbmdlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBNZ0Zvcm1CYXNlLkNvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtcywgc3RvcmFnZUF0dHJpYnV0ZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBpdGVtcyBsaXN0IG9mIGNob2ljZSBjb250cm9scy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nQ29udHJvbFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0Q2hvaWNlQ29udHJvbERpc3BsYXlMaXN0KG1nQ29udHJvbDogTWdDb250cm9sQmFzZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQobWdDb250cm9sLmlzQ2hvaWNlQ29udHJvbCgpKTtcclxuXHJcbiAgICBsZXQgaXRlbXM6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0KCk7XHJcbiAgICBsZXQgZmxkOiBHdWlGaWVsZEJhc2UgPSBtZ0NvbnRyb2wuZ2V0RmllbGQoKTtcclxuICAgIGxldCBzdG9yYWdlQXR0cmlidXRlOiBTdG9yYWdlQXR0cmlidXRlID0gZmxkLmdldENlbGxzVHlwZSgpO1xyXG5cclxuICAgIGlmIChzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgJiYgc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKSB7XHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuaXNSYWRpbygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZsZC5HZXRSYWRpb0N0cmxzKCkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCByYWRpb0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBmbGQuR2V0UmFkaW9DdHJscygpLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgaXRlbXMuQWRkUmFuZ2UoYXdhaXQgcmFkaW9Db250cm9sLkdldERpc3BsYXlSYW5nZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbXMuQWRkUmFuZ2UoYXdhaXQgbWdDb250cm9sLkdldEl0ZW1zUmFuZ2UoKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1nRm9ybUJhc2UuQ29udmVydEFycmF5TGlzdFRvU3RyaW5nKGl0ZW1zLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBjb21tYSBjb25jYXRlbmF0ZWQgc3RyaW5nIGZyb20gYXJyYXkgbGlzdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1zXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0l0ZW1OdW1UeXBlXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb250cm9sQ29sdW1uKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGxldCBjb2x1bW46IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICAgIGlmICgoY3RybC5Jc1JlcGVhdGFibGUgfHwgY3RybC5Jc1RhYmxlSGVhZGVyQ2hpbGQpICYmIHRoaXMuX3RhYmxlQ29sdW1ucyAhPT0gbnVsbClcclxuICAgICAgY29sdW1uID0gdGhpcy5fdGFibGVDb2x1bW5zLmdldF9JdGVtKGN0cmwuZ2V0TGF5ZXIoKSAtIDEpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjb250YWluZXIgY29udHJvbDwvcmV0dXJucz5cclxuICBnZXRDb250YWluZXJDdHJsKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGNvbnRyb2wncyBjb2x1bW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29sdW1uQ29udHJvbHMoKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICBsZXQgY29sdW1uQ29udHJvbHNMaXN0OiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5DdHJsVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTikge1xyXG4gICAgICAgICAgaWYgKGNvbHVtbkNvbnRyb2xzTGlzdCA9PT0gbnVsbClcclxuICAgICAgICAgICAgY29sdW1uQ29udHJvbHNMaXN0ID0gbmV3IExpc3Q8TWdDb250cm9sQmFzZT4oKTtcclxuICAgICAgICAgIGNvbHVtbkNvbnRyb2xzTGlzdC5wdXNoKGN0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbHVtbkNvbnRyb2xzTGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFzaygpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIGNvbnZlcnRzIGZyb20gZG91YmxlIHBpeGVscyB0byB1b21cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBpeFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNYYXhpc1wiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VGFibGVDdHJsKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFmdGVyIG9wZW4gdGhlIGZvcm0gbmVlZCB0byBtb3ZlIGl0IGFjY29yZGluZyB0byB0aGUgc3RhcnR1cCBwb3NpdGlvbiBwcm9wZXJ0eSBvbiB0aGUgZm9ybVxyXG4gIC8vLyAgIFBST1BfVFlQRV9TVEFSVFVQX1BPU0lUSU9OXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TWFpbkNvbnRyb2woKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVNZ0NvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBnZXRDdHJsQnlOYW1lKGN0cmxOYW1lOiBzdHJpbmcsIGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldEN0cmxCeU5hbWUoY3RybE5hbWUsIGN0cmxUeXBlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFBvaW50ICxjZW50ZXIgdG8gdGhlIGdpdmluZyByZWxhdGl2ZVJlY3RcclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIGNoZWNrQW5kQ3JlYXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXRoaXMuaXNSb3dDcmVhdGVkKGlkeCkpXHJcbiAgICAgIHRoaXMuY3JlYXRlUm93KGlkeCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICBJc1ZhbGlkUm93KGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsaWRSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgaWR4ID49IDAgJiYgaWR4IDwgdGhpcy5Sb3dzLmxlbmd0aCkge1xyXG4gICAgICBsZXQgcm93OiBSb3cgPSB0aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgICAgdmFsaWRSb3cgPSAocm93ICE9PSBudWxsICYmIHJvdy5WYWxpZGF0ZWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkUm93O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0YWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cmVlIG9yIHRhYmxlIGNvbnRyb2wgb2YgdGhlIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hQcm9wcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hPZlByb3BzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USVRMRV9CQVIpO1xyXG5cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuX3Byb3BUYWIuUmVmcmVzaERpc3BsYXkoZmFsc2UsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcylcclxuICAgICAgdGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCAod2hpY2ggaXMgbm90IHRoZSBmcmFtZSBmb3JtKSB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxUeXBlXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXBlYXRhYmxlT25seVwiPnNob3VsZCBiZSB0cnVlIGluIG9yZGVyIHRvIHJlZnJlc2ggb25seSB0aGUgY29udHJvbHMgdGhhdCBiZWxvbmcgdG8gYSB0YWJsZTwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaENvbnRyb2xzKHJlcGVhdGFibGVPbmx5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZTtcclxuICAgIC8vIHJlY29yZCBkb2VzIG5vdCBleGlzdFxyXG4gICAgaWYgKHRoaXMuRGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gcmVmcmVzaCB0aGUgdGFibGUgZmlyc3RcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCAmJiAhcmVwZWF0YWJsZU9ubHkpXHJcbiAgICAgIGF3YWl0IHRoaXMuX3RhYmxlTWdDb250cm9sLlJlZnJlc2hEaXNwbGF5KCk7XHJcblxyXG4gICAgLy8gcmVmcmVzaCBhbGwgQ09MVU1OUyAocmVmcmVzaCBmb3IgZWFjaCBjb250cm9sIGJhc2Ugb24gdGhlIHJlZnJlc2ggb2YgdGhlIGNvbHVtbiAoZS5nOmNvbHVtbiB3aWR0aClcclxuICAgIC8vIHNvIHdlIG11c3QgcmVmcmVzaCB0aGUgY29sdW1uIGZpcnN0XHJcbiAgICBpZiAodGhpcy5fdGFibGVDb2x1bW5zICE9PSBudWxsICYmICFyZXBlYXRhYmxlT25seSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fdGFibGVDb2x1bW5zLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IG1nQ29udHJvbEJhc2U6IE1nQ29udHJvbEJhc2UgPSB0aGlzLl90YWJsZUNvbHVtbnMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgYXdhaXQgbWdDb250cm9sQmFzZS5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGVja0FuZENyZWF0ZVJvdyh0aGlzLkRpc3BsYXlMaW5lKTtcclxuXHJcbiAgICAvLyBRQ1IgIzcwOTU2MyBNdXN0IHJlZnJlc2ggZnJhbWVzZXQncyBzdWJmcm9tcyBiZWZvcmUgd2UgcmVmcmVzaCBmcmFtZXNldCBpdHNlbGYuXHJcbiAgICAvLyBEdXJpbmcgcmVmcmVzaCBvZiB0aGUgZnJhbWVzZXQgbmVzdGVkIHN1YmZvcm1zIHdpdGggUmVmcmVzaFdoZW5IaWRkZW4gbWlnaHQgYmUgYnJvdWdodCB0byBzZXJ2ZXJcclxuICAgIC8vIGJ1dCB0aGVpciBzdWJmb3JtJ3MgY29udHJvbHMgaGF2ZSBub3QgYmVlbiBzZXQgd2l0aCBjb3JyZWN0IGJvdW5kcy4gVGhpcyBjYXVzZXMgaWxsZWdhbCBwbGFjZW1lbnRcclxuICAgIC8vIGFuZCBpbmNvcnJlY3QgZmluYWwgbG9jYXRpb24gb2YgY29udHJvbHMgb24gbmVzdGVkIHN1YmZvcm1zXHJcbiAgICBsZXQgdGFiQW5kR3JvdXBDb250cm9sczogU3RhY2s8TWdDb250cm9sQmFzZT4gPSBuZXcgU3RhY2s8TWdDb250cm9sQmFzZT4oKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGN0cmwgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgaWYgKChjdHJsLmlzVGFiQ29udHJvbCgpIHx8IGN0cmwuaXNHcm91cCgpKSAmJiAhcmVwZWF0YWJsZU9ubHkpIHtcclxuICAgICAgICB0YWJBbmRHcm91cENvbnRyb2xzLnB1c2goY3RybCk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTikge1xyXG4gICAgICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSB8fCAhcmVwZWF0YWJsZU9ubHkpXHJcbiAgICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiByZXBlYXRhYmxlT25seSlcclxuICAgICAgICBhd2FpdCBjdHJsLlJlZnJlc2hEaXNwbGF5KHJlcGVhdGFibGVPbmx5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcbiAgbWFya1Jvd05PVENyZWF0ZWQoaWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuVU5ET19DUkVBVEVfVEFCTEVfUk9XLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgaWR4KTtcclxuXHJcbiAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgdGhpcy5Sb3dzLmxlbmd0aClcclxuICAgICAgdGhpcy5Sb3dzLnNldF9JdGVtKGlkeCwgbmV3IFJvdyhmYWxzZSwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIFNlbGVjdFJvdygpOiB2b2lkO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgcm93IGlzIG5vdCBjcmVhdGVkIHlldCBjcmVhdGVzIHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIFNlbGVjdFJvdyhzZW5kQWx3YXlzOiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1hcmtzIHJvdyBjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgU2VsZWN0Um93KHJvd0lkeDogbnVtYmVyLCBzZW5kQWx3YXlzOiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHZhbGlkYXRlIHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIFNlbGVjdFJvdyhzZW5kQWx3YXlzT3JSb3dJZHg/OiBhbnksIHNlbmRBbHdheXM/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcclxuICAgICAgdGhpcy5TZWxlY3RSb3dfMCgpO1xyXG5cclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93XzEoc2VuZEFsd2F5c09yUm93SWR4KTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93XzIoc2VuZEFsd2F5c09yUm93SWR4LCBzZW5kQWx3YXlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHVibGljKVxyXG4gIC8vLyBjaGVjayBpZiBzcGVjaWZpZWQgcm93IGlzIHZhbGlkIHJvdyBpbiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGNvbnRyb2xzIG9mIHRoZSBjdXJyZW50IHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaW50IGlzIHRoZSB0YWJsZSBzaXplPC9yZXR1cm5zPlxyXG4gIGdldFJvd3NJblBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgaXMgdGhlIHRhYmxlIHNpemU8L3JldHVybnM+XHJcbiAgZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgUm93IGlzIGNyZWF0ZWQgb24gR1VJIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2l6ZVwiPnRoZSB0YWJsZSBzaXplPC9wYXJhbT5cclxuICBzZXRSb3dzSW5QYWdlKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcm93c0luUGFnZSA9IHNpemU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbWFya3MgdGhpcyByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbHVtbnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvbHVtbnNDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5DdHJsVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgICAgIGNvbHVtbnNDb3VudCA9IGNvbHVtbnNDb3VudCArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uc0NvdW50O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5SZWZyZXNoRGlzcGxheSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlZnJlc2hEaXNwO1xyXG4gIH1cclxuXHJcbiAgc2V0VGl0bGUobmV3VGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuc2V0VGl0bGUodGhpcywgbmV3VGl0bGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiByZWZyZXNoIGRpc3BsYXlcIiBmbGFnXHJcblxyXG4gIGdldENvbnRyb2xJZHgoY3RybDogTWdDb250cm9sQmFzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldENvbnRyb2xJZHgoY3RybCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEV4ZWN1dGUgdGhlIGxheW91dCBhbmQgYWxsIGl0cyBjaGlsZHJlblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuaGFzVGFibGUoKSlcclxuICAgICAgdG9wRGlzcGxheUxpbmUgPSBDb21tYW5kcy5nZXRUb3BJbmRleCh0aGlzLmdldE1haW5Db250cm9sKCkpO1xyXG4gICAgcmV0dXJuIHRvcERpc3BsYXlMaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoaXMgZ3JvdXAgaXMgdGhlIGxhc3QgZ3JvdXAgaW4gdGhlIHRvb2xiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ3JvdXBOdW1iZXJcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+IHRhYmxlIGl0ZW1zIGNvdW50PC9yZXR1cm5zPlxyXG4gIGdldFRhYmxlSXRlbXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSXRlbXNDb3VudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGFibGUgY29udHJvbCBpcyBhbHdheXMgZmlyc3Qgb24gdGhlIGZvcm1cclxuICAvLy8gV2hlbiB0YWJsZSBpcyBhIGNoaWxkIG9mIHRhYiwgaXQgaXMgY3JlYXRlZCBiZWZvcmUgdGFiJ3MgbGF5ZXJzKFRhYlBhZ2VzKSBhcmUgY3JlYXRlZC5cclxuICAvLy8gQ29tcHV0aW5nIFRhYidzIGNoaWxkcmVuIGNvb3JkaW5hdGVzIGRlcGVuZHMgb24gdGhlIFRhYlBhZ2VzIGJlaW5nIGNyZWF0ZWRcclxuICAvLy8gU28sIHdlIG11c3QgZml4IHRhYmxlJ3MgbG9jYXRpb24gYWZ0ZXIgVGFiIGlzIGNyZWF0ZWRcclxuICAvLy8gUUNSICMyODk5NjZcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZzVG9DdHJscygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgdGhpcy5DdHJsVGFiLmdldEN0cmwoaSkucmVtb3ZlUmVmRnJvbUZpZWxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoaXMgZm9ybSBtYXkgaGF2ZSBBY3RpdmVSb3dIaWdodGxpZ2h0U3RhdGVcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFRhYmxlQ2hpbGRyZW4oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVDaGlsZHJlbiA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YWJsZUNoaWxkcmVuID0gbmV3IExpc3Q8TWdDb250cm9sQmFzZT4oKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN0cmxUYWIgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgbWluVGFiT3JkZXI6IG51bWJlciA9IDIxNDc0ODM2NDc7XHJcbiAgICAgICAgbGV0IGF1dG9tYXRpY1RhYmJpbmdPcmRlcjogYm9vbGVhbiA9IHRoaXMuaXNBdXRvbWF0aWNUYWJiaW5nT3JkZXIoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuXHJcbiAgICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgfHwgY3RybC5Jc1RhYmxlSGVhZGVyQ2hpbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDaGlsZHJlbi5wdXNoKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF1dG9tYXRpY1RhYmJpbmdPcmRlcikge1xyXG4gICAgICAgICAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IGN0cmwuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVIpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlSW50OiBudW1iZXIgPSBwcm9wLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPCBtaW5UYWJPcmRlcilcclxuICAgICAgICAgICAgICAgICAgbWluVGFiT3JkZXIgPSB2YWx1ZUludDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtaW5UYWJPcmRlciAhPT0gSW50MzIuTWF4VmFsdWUgJiYgYXV0b21hdGljVGFiYmluZ09yZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9maXJzdFRhYmxlVGFiT3JkZXIgPSBtaW5UYWJPcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHByZXYgZ3JvdXAgaW5kZXggaWYgZXhpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3Vyckdyb3VwXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YWJsZUN0cmxcIj50aGUgdGFibGVDdHJsIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VGFibGVDdHJsKHRhYmxlQ3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFibGVNZ0NvbnRyb2wgPSB0YWJsZUN0cmw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcblxyXG4gIGdldEN0cmxDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xzQ291bnRFeGNsdWRpbmdTdGF0dXNCYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BzT25FeHByZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAodGhpcy5fcHJvcFRhYiA9PSBudWxsID8gMCA6IHRoaXMuX3Byb3BUYWIuZ2V0U2l6ZSgpKTtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eTtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAmJiAhcmVmcmVzaDsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3AoaSk7XHJcbiAgICAgIGlmIChwcm9wLmlzRXhwcmVzc2lvbigpKSB7XHJcbiAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoUHJvcHMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUYWJDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGxldCBvYmo6IE9iamVjdDtcclxuICAgIGxldCByZXN1bHQ6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICAgIG9iaiA9IGN0cmw7XHJcbiAgICB3aGlsZSAob2JqIGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkge1xyXG4gICAgICBsZXQgY3VyckN0cmwgPSA8TWdDb250cm9sQmFzZT5vYmo7XHJcbiAgICAgIGlmIChjdXJyQ3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIHJlc3VsdCA9IGN1cnJDdHJsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG9iaiA9IGN1cnJDdHJsLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGN0cmwgaXMgbm90IHRhYiBhbmQgbm90IHRhYidzIGNoaWxkIC0gZmluZCBmaXJzdCB0YWIgaW4gdGhlIGZvcm1cclxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgb2JqID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgICAgaWYgKCg8TWdDb250cm9sQmFzZT5vYmopLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSA8TWdDb250cm9sQmFzZT5vYmo7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9scyBvZiB0aGlzIGZvcm1cclxuXHJcbiAgSXNJbnB1dFR5cGUoY3RybDogTWdDb250cm9sQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgc3dpdGNoIChjdHJsLlR5cGUpIHtcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1Q6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU86XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIHRhYmxlIGNoaWxkcmVuXHJcblxyXG4gIHB1YmxpYyBHZXRMaXN0T2ZJbnB1dENvbnRyb2xzKCk6IGFueSB7XHJcbiAgICBsZXQgZmlsdGVydGVyTGlzdCA9IHRoaXMuQ3RybFRhYi5maWx0ZXIoKChjLCBpbmRleCwgYXJyYXkpID0+IHRoaXMuSXNJbnB1dFR5cGUoYykpKTtcclxuICAgIGxldCBuYW1lcyA9IGZpbHRlcnRlckxpc3QucmVkdWNlKChwcmUsIGN0cmwsIGkpID0+IHtcclxuICAgICAgcHJlW2N0cmwuVW5pcXVlTmFtZV0gPSBjdHJsLklzUmVwZWF0YWJsZSA/ICcxJyA6ICcwJztcclxuICAgICAgcmV0dXJuIHByZTtcclxuICAgIH0sIHt9KTtcclxuICAgIHJldHVybiBuYW1lcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFic3RyYWN0IENvbnN0cnVjdE1nQ29udHJvbCgpOiBNZ0NvbnRyb2xCYXNlO1xyXG5cclxuICAvLyBnZXRHdWlUYWJsZUNoaWxkcmVuKCk6IExpc3Q8R3VpTWdDb250cm9sPiB7XHJcbiAgLy8gICBsZXQgZmxhZzogYm9vbGVhbiA9IHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW4gPT09IG51bGw7XHJcbiAgLy8gICBpZiAoZmxhZykge1xyXG4gIC8vICAgICB0aGlzLl9ndWlUYWJsZUNoaWxkcmVuID0gbmV3IExpc3Q8R3VpTWdDb250cm9sPigpO1xyXG4gIC8vICAgICBsZXQgdGFibGVDaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAvLyAgICAgbGV0IGVudW1lcmF0b3I6IExpc3RfRW51bWVyYXRvcjxNZ0NvbnRyb2xCYXNlPiA9IHRhYmxlQ2hpbGRyZW4uR2V0RW51bWVyYXRvcigpO1xyXG4gIC8vICAgICB0cnkge1xyXG4gIC8vICAgICAgIHdoaWxlIChlbnVtZXJhdG9yLk1vdmVOZXh0KCkpIHtcclxuICAvLyAgICAgICAgIGxldCBjdXJyZW50OiBNZ0NvbnRyb2xCYXNlID0gZW51bWVyYXRvci5DdXJyZW50O1xyXG4gIC8vICAgICAgICAgdGhpcy5fZ3VpVGFibGVDaGlsZHJlbi5BZGQoY3VycmVudCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGZpbmFsbHkge1xyXG4gIC8vICAgICAgICg8SURpc3Bvc2FibGU+ZW51bWVyYXRvcikuRGlzcG9zZSgpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fZ3VpVGFibGVDaGlsZHJlbjtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXRzIHRoZSB0YWJsZSBjb250cm9sIHJlbGF0ZWQgdG8gdGhpcyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWZyZXNoIGZvcm0gZGlzcGxheSBpZiBpdCBoYXMgYSBwcm9wZXJ0eSB3aGljaCBpcyBhbiBleHByZXNzaW9uXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlyc3RUYWJsZVJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcm93c0luUGFnZSA9IENvbW1hbmRzLmdldFJvd3NJblBhZ2UodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgICB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRhYmxlIGl0ZW0ncyBjb3VudCBhY2NvcmRpbmcgdG8gcGFyYW1ldGVyIHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZHZzaXplXCI+bmV3IGR2c2l6ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YWJsZUl0ZW1zQ291bnRcIj5uZXcgdGFibGVJdGVtc0NvdW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlbW92ZUFsbFwiPnJlbW92ZSBhbGwgZWxlbWVudHMgZm9ybSB0aGUgdGFibGUgaW5jbHVkaW5nIGZpcnN0IGFuZCBsYXN0IGR1bW15IGVsZW1lbnRzPC9wYXJhbT5cclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWRcclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIFNldFRhYmxlSXRlbXNDb3VudChkdnNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGw6IGFueSwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgIGlmICh0eXBlb2YgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGwgPT0gJ2Jvb2xlYW4nKXtcclxuICAgICAgdGhpcy5TZXRUYWJsZUl0ZW1zQ291bnRfMChkdnNpemUsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsKTtcclxuICAgIH0gZWxzZVxyXG4gICAgICB0aGlzLlNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZSwgdGFibGVJdGVtc0NvdW50T3JSZW1vdmVBbGwsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFRhYmxlSXRlbXNDb3VudF8wKGR2c2l6ZTogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuU2V0VGFibGVJdGVtc0NvdW50XzEoZHZzaXplLCBkdnNpemUsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2woZHZzaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRzIHRoZSB0YWJsZSBjb250cm9sXHJcbiAgLy8vIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciBkdnNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXRUYWJsZUNvbnRyb2woKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBJbml0VGFibGVDb250cm9sKGR2U2l6ZT86IG51bWJlciwgdGFibGVJdGVtc0NvdW50PzogbnVtYmVyLCByZW1vdmVBbGw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2xfMShkdlNpemUsIHRhYmxlSXRlbXNDb3VudCwgcmVtb3ZlQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIGFycmF5cyBvZiB0YWJsZSBjaGlsZHJlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2l6ZVwiPjwvcGFyYW0+XHJcbiAgVXBkYXRlVGFibGVDaGlsZHJlbkFycmF5c1NpemUoc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgY2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IGNoaWxkcmVuLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGNvbnRyb2wudXBkYXRlQXJyYXlzKHNpemUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFibGVNZ0NvbnRyb2wudXBkYXRlQXJyYXlzKHNpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgdGFiIGNvbnRyb2wgZm9yIHBlcmZvcm1pbmcgQ1RSTCtUQUIgJiYgQ1RSTCtTSElGVCtUQUIgYWN0aW9uc1xyXG4gIC8vLyAgIHRoZSBjb2RlIG9yaWdpbmFsIGlzIGluIFJUOjpza2lwX3RvX3RhYl9jb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jdXJyZW50IGNvbnRyb2w8L3BhcmFtPlxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICd7R3VpTWdGb3JtJyArICc6IElkPScgKyB0aGlzLl91c2VyU3RhdGVJZCArICd9JztcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSW5jbHVkZUNvbnRyb2xJblRhYmJpbmdPcmRlcihjb250cm9sOiBNZ0NvbnRyb2xCYXNlLCBpbmNsdWRlQ29udHJvbENoaWxkT2ZGcmFtZUZvcm06IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmICghY29udHJvbC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIEdldEhhc2hDb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybUlzbjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoTWdGb3JtQmFzZS5Jc0Zvcm1UYWcoZm91bmRUYWdOYW1lKSlcclxuICAgICAgdGhpcy5maWxsTmFtZShmb3VuZFRhZ05hbWUpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApXHJcbiAgICAgIGF3YWl0IHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ0YnLCBwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgYXdhaXQgdGhpcy5DdHJsVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgIC8vdGhpcy5pbml0Q29udGV4dFByb3BGb3JDb250cm9scygpO1xyXG4gICAgICBpZiAoIXRoaXMuSGFzVGFibGUoKSlcclxuICAgICAgICB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKE1nRm9ybUJhc2UuSXNFbmRGb3JtVGFnKGZvdW5kVGFnTmFtZSkpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc1Jvd0NyZWF0ZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeCB8fCBpZHggPCAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm93OiBSb3cgPSB0aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgIGlmIChyb3cgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gcm93LkNyZWF0ZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkTGlua2VkQ29udHJvbHNMaXN0cygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgbGV0IGxpbmtlZFBhcmVudDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPmN0cmwuZ2V0TGlua2VkUGFyZW50KGZhbHNlKTtcclxuICAgICAgaWYgKGxpbmtlZFBhcmVudCAhPT0gbnVsbClcclxuICAgICAgICBsaW5rZWRQYXJlbnQubGlua0N0cmwoY3RybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGxpc3Qgb2YgYWxsIGNvbHVtbnMgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYnVpbGRUYWJsZUNvbHVtbnNMaXN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3RhYmxlQ29sdW1ucyA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgICAgIHRoaXMuX3RhYmxlQ29sdW1ucy5wdXNoKGNvbnRyb2wpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYXJyYXlzIG9mIHRhYmxlIGNoaWxkcmVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY3JlYXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLkNSRUFURV9UQUJMRV9ST1csIHRoaXMuX3RhYmxlTWdDb250cm9sLCBpZHgpO1xyXG5cclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeClcclxuICAgICAgdGhpcy5Sb3dzLlNldFNpemUoaWR4ICsgMSk7XHJcblxyXG4gICAgdGhpcy5Sb3dzLnNldF9JdGVtKGlkeCwgbmV3IFJvdyh0cnVlLCB0cnVlKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBTZWxlY3RSb3dfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuU2VsZWN0Um93KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSB3aW5kb3cgdHlwZSBmb3IgYSBEZWZhdWx0IHdpbmRvdyB0eXBlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2luZG93VHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBTZWxlY3RSb3dfMShzZW5kQWx3YXlzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlNlbGVjdFJvdyh0aGlzLkRpc3BsYXlMaW5lLCBzZW5kQWx3YXlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRm9yIG9ubGluZSB3ZSBuZWVkIHRvIHBpdCAnQUNUX0hJVCcgd2hlbiB0aGUgZm9ybSB3YXMgY2xvc2VkIGZyb20gc3lzdGVtIG1lbnVcclxuICAvLy8gaWYgdGhlIHRhc2sgaGFzIG9ubHkgc3ViZm9ybSBjb250cm9sIG9uIGl0LlxyXG4gIC8vLyBGb3IgUkMgYWx3YXlzIHJldHVybiBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2VuZEFsd2F5c1wiPnNlbmQgc2VsZWN0aW9uIGNvbW1hbmQgZGVwZW5kaW5nIG9uIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIFNlbGVjdFJvd18yKHJvd0lkeDogbnVtYmVyLCBzZW5kQWx3YXlzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyBjb250cm9sRm9yU2VsZWN0IGNhbiBiZSB0YWJsZSBjb250cm9sIG9yIHRyZWUgY29udHJvbFxyXG4gICAgbGV0IG1haW5Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5nZXRNYWluQ29udHJvbCgpO1xyXG5cclxuICAgIGlmIChtYWluQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHJvd0lkeDtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgaW5kZXggPSBHdWlDb25zdGFudHMuTk9fUk9XX1NFTEVDVEVEO1xyXG5cclxuICAgICAgaWYgKHNlbmRBbHdheXMgfHwgaW5kZXggIT09IHRoaXMuX3ByZXZTZWxJbmRleCkge1xyXG4gICAgICAgIC8vIGZvciB0cmVlIGNvbnRyb2wgd2UgYWx3YXlzIHNlbmQgc2VsZWN0aW9uLCBzaW5jZSBzb21ldGltZXMgd2UgbmVlZCB0byB1bmRvIHRyZWUgZGVmYXVsIHNlbGVjdGlvblxyXG4gICAgICAgIHRoaXMuX3ByZXZTZWxJbmRleCA9IGluZGV4O1xyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgbWFpbkNvbnRyb2wsIDAsIEh0bWxQcm9wZXJ0aWVzLlNlbGVjdGVkUm93LCBpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGZvcmNlIGFsbCBNZ0NvbnRyb2xzIHRvIHVwZGF0ZSB0aGUgY29sb3JzIHVzZWQgb24gdGhlIGNvbnRyb2xzXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0VGFibGVDb250cm9sXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLkluaXRUYWJsZUNvbnRyb2woMSwgMSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZW1vdmVBbGxcIj5yZW1vdmUgYWxsIGVsZW1lbnRzIGZvcm0gdGhlIHRhYmxlIGluY2x1ZGluZyBmaXJzdCBhbmQgbGFzdCBkdW1teSBlbGVtZW50czwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBJbml0VGFibGVDb250cm9sXzEoZHZTaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudDogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIENvbW1hbmRzLmFkZFdpdGhOdW1iZXIoQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lURU1TX0NPVU5ULCB0aGlzLl90YWJsZU1nQ29udHJvbCwgdGFibGVJdGVtc0NvdW50KTtcclxuICAgICAgdGhpcy5fdGFibGVJdGVtc0NvdW50ID0gdGFibGVJdGVtc0NvdW50O1xyXG4gICAgICB0aGlzLlJvd3MuU2V0U2l6ZShkdlNpemUpO1xyXG4gICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSAtMjtcclxuICAgICAgdGhpcy5fcHJldlNlbEluZGV4ID0gLTI7XHJcbiAgICAgIHRoaXMuVXBkYXRlVGFibGVDaGlsZHJlbkFycmF5c1NpemUoZHZTaXplKTtcclxuICAgICAgdGhpcy5fbWF4Um93c0luUGFnaW5hdGVkVGFibGUgPSBDb21tYW5kcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSh0aGlzLl90YWJsZU1nQ29udHJvbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBJbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBjaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgY29udHJvbC5JbnNlcnRBcnJheXMoaWR4LCBjb3VudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2xhc3MgZGVzY3JpYmluZyByb3dcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxhdXRob3I+cmluYXY8L2F1dGhvcj5cclxuZXhwb3J0IGNsYXNzIFJvdyB7XHJcbiAgQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgLy8gaXMgcm93IGNyZWF0ZWQgb24gZ3VpIGxldmVsXHJcbiAgVmFsaWRhdGVkOiBib29sZWFuID0gZmFsc2U7ICAgLy8gaXMgcm93IFZhbGlkYXRlZFxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNyZWF0ZWQ6IGJvb2xlYW4sIHZhbGlkYXRlZDogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IoY3JlYXRlZD86IGJvb2xlYW4sIHZhbGlkYXRlZD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY3JlYXRlZCwgdmFsaWRhdGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuVmFsaWRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjcmVhdGVkOiBib29sZWFuLCB2YWxpZGF0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQ3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICB0aGlzLlZhbGlkYXRlZCA9IHZhbGlkYXRlZDtcclxuICB9XHJcbn1cclxuIl19
|
|
763
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBYSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBWSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFD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SUFNZCxZQUFZLE9BQWlCLEVBQUUsU0FBbUI7UUFMbEQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBS3pCLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZ0IsRUFBRSxTQUFrQjtRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wUGFyZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFRhYmJpbmdPcmRlclR5cGUsXHJcbiAgV2luZG93VHlwZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IERlYnVnLCBJSGFzaENvZGUsIEludDMyLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXIgfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBQcm9wVGFibGUgfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBDb250cm9sVGFibGUgfSBmcm9tICcuL0NvbnRyb2xUYWJsZSc7XHJcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tICcuLi8uLi9NYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuL1Byb3BlcnR5JztcclxuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHsgR3VpRmllbGRCYXNlIH0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5pbXBvcnQgeyBQcm9wSW50ZXJmYWNlIH0gZnJvbSAnLi9Qcm9wSW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgR3VpRm9ybVByb3BlcnR5QWRhcHRlciB9IGZyb20gJy4vR3VpRm9ybVByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgfSBmcm9tICcuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXInO1xyXG5cclxuXHJcbmNvbnN0IGRlbGltaXRlcjogc3RyaW5nID0gJywgJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIGRhdGEgZm9yIDxmb3JtPi4uLjwvZm9ybT5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nRm9ybUJhc2UgZXh0ZW5kcyBHdWlGb3JtUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSwgSUhhc2hDb2RlIHtcclxuICBJbkluaXRGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEN0cmxUYWI6IENvbnRyb2xUYWJsZSA9IG51bGw7XHJcbiAgLy8gdW50aWwgdGhlIGZvcm0gaXMgcmVmcmVzaGVkIGluIHRoZSBmaXJzdCB0aW1lXHJcbiAgRm9ybVJlZnJlc2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJvd3M6IExpc3Q8Um93PiA9IG51bGw7XHJcbiAgTW9kYWxGb3Jtc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIEVycm9yT2NjdXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEZvcm1Jc246IG51bWJlciA9IDA7XHJcbiAgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBPcGVuZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0xlZ2FsRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFBCSW1hZ2VzTnVtYmVyOiBudW1iZXIgPSAwO1xyXG4gIGlnbm9yZUZpcnN0UmVmcmVzaFRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBQYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByb3RlY3RlZCBfZGVzdFRibFJvdzogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJvdGVjdGVkIF9maXJzdFRhYmxlVGFiT3JkZXI6IG51bWJlciA9IDA7ICAgICAgICAgICAgLy8gdGFiIG9yZGVyIG9mIGZpcnN0IGNoaWxkIG9mIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF9pblJlZnJlc2hEaXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9pblJlc3RvcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2xhc3RSb3dTZW50OiBudW1iZXIgPSAtMTsgICAgICAgICAgICAgICAgICAvLyBsYXN0IHJvdyBzZW50IHJvIGd1aSB0aHJlYWRcclxuICBwcm90ZWN0ZWQgX3ByZXZHdWlUb3BJbmRleDogbnVtYmVyID0gLTE7ICAgICAgICAgICAgICAvLyBGb3IgcGFnaW5hdGVkIHRhYmxlIGl0J3MgR3VpVG9wSW5kZXggZWxzZSBpdCdzIGR2VG9wSW5kZXhcclxuICBwcm90ZWN0ZWQgX3Byb3BUYWI6IFByb3BUYWJsZSA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF9yb3dzSW5QYWdlOiBudW1iZXIgPSAxO1xyXG4gIHByb3RlY3RlZCBfbWF4Um93c0luUGFnaW5hdGVkVGFibGU6IG51bWJlciA9IDA7ICAgICAgIC8vIG1heCBubyBvZiByb3dzIGluIHBhZ2luYXRlZCB0YWJsZVxyXG4gIHByb3RlY3RlZCBfc3ViRm9ybUN0cmw6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdGFibGVNZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdGFibGVJdGVtc0NvdW50OiBudW1iZXIgPSAwOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZVxyXG4gIHByb3RlY3RlZCBfdGFibGVSZWZyZXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3Rhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFzayB0byB3aGljaCB0aGUgY3VycmVudCBmb3JtIGJlbG9uZ3NcclxuICBwcm90ZWN0ZWQgX3RvcEluZGV4VXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyB0cnVlIGlmIGEgdG9wIGluZGV4IHdhcyB1cGRhdGVkXHJcblxyXG4gIC8vIEZvcm0gcmVwcmVzZW50aW5nIHRoZSBpbnRlcm5hbCBoZWxwIHdpbmRvdy5IZXJlIHRoZSBpbnRlcm5hbCBmb3JtIG9iamVjdCBpcyBrZXB0IG9uIHRoZSBmb3JtIG9iamVjdCBpdHNlbGYuXHJcbiAgcHJvdGVjdGVkIF90cmFuc2ZlcmluZ0RhdGE6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gcm93cyBhcmUgcmVxdWVzdGVkIGZvciBhIEdVSSB0aHJlYWRcclxuICAvLyBwcmV2ZW50cyByZWZyZXNoIG9mIERpc3BsYXlMaXN0IGZvciB0aGUgY29ycmVzcG9uZGluZyBjb250cm9scyBhbmQgY3VyclJlY0NvbXB1dGUoUkMpXHJcbiAgcHJpdmF0ZSBfYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2NvbmNyZXRlV2luZG93VHlwZTogV2luZG93VHlwZSA9IDA7XHJcbiAgcHJpdmF0ZSBfY29udGFpbmVyQ3RybDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWZyZXNoT2ZQcm9wczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgX3ByZXZTZWxJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfc2hvdWxkQ3JlYXRlVG9vbGJhcjogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgLy8gaWYgdG8gY3JlYXRlIHRvb2xiYXJcclxuICBwcml2YXRlIF90YWJsZUNoaWxkcmVuOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gbnVsbDsgICAvLyBDYW4ndCB1c2UgTGlzdDxUPlxyXG4gIHByaXZhdGUgX3RhYmxlQ29sdW1uczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF91c2VyU3RhdGVJZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheUxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcbiAgICB0aGlzLkN0cmxUYWIgPSBuZXcgQ29udHJvbFRhYmxlKCk7XHJcbiAgICB0aGlzLlJvd3MgPSBuZXcgTGlzdCgpO1xyXG4gICAgdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID0gPFdpbmRvd1R5cGU+MDtcclxuICAgIHRoaXMuUGFyZW50Rm9ybSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgRGlzcGxheUxpbmUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaW5lO1xyXG4gIH1cclxuXHJcbiAgc2V0IERpc3BsYXlMaW5lKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlzcGxheUxpbmUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBVbmlxdWVOYW1lKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1fTkFNRSkgIT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUUpLkdldENvbXB1dGVkVmFsdWUoKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgVGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKTtcclxuICB9XHJcblxyXG5cclxuICBnZXQgVGFibGVDaGlsZHJlbigpOiBMaXN0PE1nQ29udHJvbEJhc2U+IHtcclxuICAgIGlmICh0aGlzLl90YWJsZUNoaWxkcmVuID09PSBudWxsKVxyXG4gICAgICB0aGlzLmJ1aWxkVGFibGVDaGlsZHJlbigpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlQ2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBzZXQgVGFibGVDaGlsZHJlbih2YWx1ZTogTGlzdDxNZ0NvbnRyb2xCYXNlPikge1xyXG4gICAgdGhpcy5fdGFibGVDaGlsZHJlbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFNob3VsZENyZWF0ZVRvb2xiYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hvdWxkQ3JlYXRlVG9vbGJhcjtcclxuICB9XHJcblxyXG4gIGdldCBBbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd2VkU3ViZm9ybVJlY29tcHV0ZTtcclxuICB9XHJcblxyXG4gIHNldCBBbGxvd2VkU3ViZm9ybVJlY29tcHV0ZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgYSBGaXRUb01kaSB3aW5kb3cuXHJcblxyXG4gIGdldCBDb25jcmV0ZVdpbmRvd1R5cGUoKTogV2luZG93VHlwZSB7XHJcbiAgICBpZiAodGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID09PSA8V2luZG93VHlwZT4wKSB7XHJcbiAgICAgIGxldCB3aW5kb3dUeXBlOiBXaW5kb3dUeXBlID0gPFdpbmRvd1R5cGU+dGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFKS5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICBpZiAodGhpcy5QYXJlbnRGb3JtID09PSBudWxsIHx8IHdpbmRvd1R5cGUgIT09IFdpbmRvd1R5cGUuT3ZlcmxheSlcclxuICAgICAgICB3aW5kb3dUeXBlID0gV2luZG93VHlwZS5EZWZhdWx0O1xyXG5cclxuICAgICAgdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlID0gd2luZG93VHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9jb25jcmV0ZVdpbmRvd1R5cGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBmb3IgRmxvYXRpbmcsIFRvb2wgb3IgTW9kYWwuXHJcblxyXG4gIHNldCBDb25jcmV0ZVdpbmRvd1R5cGUodmFsdWU6IFdpbmRvd1R5cGUpIHtcclxuICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIG1ldGhvZCBlbmFibGVzIGEgc3BlY2lmaWMgYWN0aW9uIG9uIGFsbCB0aGUgbWVudSBvYmplY3RzIG9mIHRoZSBmb3JtIGFuZCBpdHMgY2hpbGRyZW4nc1xyXG4gIC8vLyBtZW51cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0aW9uXCI+YWN0aW9uIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkPC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkUHV0QWN0T25Gb3JtQ2xvc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgZm9ybSB0aGF0IGFscmVhZHkgd2FzIGNvbXB1dGVkIGJ5IGl0cyBJZFxyXG4gIC8vLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBpZiBpdCBpc24ndCBleGlzdC5cclxuICAvLy8gTWF5IHdlIG5lZWQgdG8gY3JlYXRlIGEgcHJvcGVydHkgYW5kIHVzZSBpdHMgZGVmYXVsdCB2YWx1ZS5cclxuICAvLy8gSW4gUGhhc2UgMiBpbiBSZWZyZXNoUHJvcGVydGllcyBtZXRob2Qgd2UnbGwgY3JlYXRlIGFuZCBjb21wdXRlIHByb3BlcnRpZXMsXHJcbiAgLy8vIHBlcmhhcHMgd2UgbmVlZCBjcmVhdGUgYWxsIHByb3BlcnRpZXMgbm90IG9ubHkgdGhvc2UgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gZGVmYXVsdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBzdGF0aWMgU2hvdWxkQmVoYXZlQXNNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIGlmIHByb3BlcnR5IGhhcyBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9wSWRcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIENvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtczogTGlzdDxzdHJpbmc+LCBpc0l0ZW1OdW1UeXBlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmcm9tOiBzdHJpbmdbXSA9IFsnXFxcXCcsICctJywgJywnXTtcclxuICAgIGxldCB0bzogc3RyaW5nW10gPSBbJ1xcXFxcXFxcJywgJ1xcXFwtJywgJ1xcXFwsJ107XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgblVNX1RZUEU6IE5VTV9UWVBFO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4OiBudW1iZXIgPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDEpIHtcclxuICAgICAgaWYgKGlzSXRlbU51bVR5cGUpIHtcclxuICAgICAgICBuVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSg8c3RyaW5nPml0ZW1zLmdldF9JdGVtKGluZGV4KSk7XHJcbiAgICAgICAgaXRlbXMuc2V0X0l0ZW0oaW5kZXgsIG5VTV9UWVBFLnRvX2RvdWJsZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoPHN0cmluZz5pdGVtcy5nZXRfSXRlbShpbmRleCksIGZyb20sIHRvKSk7XHJcblxyXG4gICAgICBpZiAoaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKVxyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKGRlbGltaXRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcGFyc2UgdGhlIGZvcm0gc3RydWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbmNyZWFzZVwiPjwvcGFyYW0+XHJcbiAgVXBkYXRlTW9kYWxGb3Jtc0NvdW50KG1nRm9ybUJhc2U6IE1nRm9ybUJhc2UsIGluY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKGluY3JlYXNlKVxyXG4gICAgICB0aGlzLk1vZGFsRm9ybXNDb3VudCArPSAxO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLk1vZGFsRm9ybXNDb3VudCAtPSAxO1xyXG5cclxuICAgIEV2ZW50cy5TZXRNb2RhbChtZ0Zvcm1CYXNlLCBpbmNyZWFzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3VuZFRhZ05hbWVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV2YWx1YXRlRXhwcmVzc2lvbihleHBJZDogbnVtYmVyLCByZXNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBsZW5ndGg6IG51bWJlciwgY29udGVudFR5cGVVbmljb2RlOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXNDZWxsVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgYWx3YXlzRXZhbHVhdGU6IGJvb2xlYW4sIHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Rhc2suRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkLCByZXNUeXBlLCBsZW5ndGgsIGNvbnRlbnRUeXBlVW5pY29kZSwgcmVzQ2VsbFR5cGUsIHRydWUsIHdhc0V2YWx1YXRlZCk7XHJcbiAgfVxyXG5cclxuICBHZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZDogbnVtYmVyKTogU3RvcmFnZUF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzay5HZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0aWFsaXphdGlvbi5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwcm9wQnlJZDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3BCeUlkICE9PSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBleGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGaWxsIG5hbWUgbWVtYmVyIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcChwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IHRoZW4gY3JlYXRlIGEgbmV3IHByb3BlcnR5IGFuZCBnaXZlIGl0IHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIC8vIGluIGFkZGl0aW9uIGFkZCB0aGlzIHByb3BlcnR5IHRvIHRoZSBwcm9wZXJ0aWVzIHRhYmxlXHJcbiAgICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgICAgcHJvcCA9IFByb3BlcnR5LmdldERlZmF1bHRQcm9wKHByb3BJZCwgR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0sIHRoaXMpO1xyXG4gICAgICAgIGlmIChwcm9wICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fcHJvcFRhYi5hZGRQcm9wKHByb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmb3IgZWFjaCBjb250cm9sIGJ1aWxkIHRoZSBsaXN0IG9mIGFsbCB0aGUgY29udHJvbHMgdGhhdCBhcmUgbGlua2VkIHRvIGl0XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBQcm9wZXJ0eUhhc0V4cHJlc3Npb24ocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIHJldHVybiBwcm9wICE9PSBudWxsICYmIHByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5nZXRUYXNrKCkgPT09IG51bGwpID8gMCA6IHRoaXMuZ2V0VGFzaygpLmdldENvbXBJZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhcnJhbmdlIHpvcmRlciBmb3IgY29udHJvbHMuIHJlY3Vyc2l2ZSBmdW5jdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRmlyc3RSZWZyZXNoT2ZQcm9wcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlZnJlc2hPZlByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGxpc3Qgb2YgYWxsIGNvbHVtbnMgY29udHJvbHNcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrcyBpZiBhbiBpbnRlcm5hbCBGaXQgdG8gTURJIGZvcm0gbmVlZHMgdG8gYmUgY3JlYXRlZCB0byBob2xkIHRoZSBNYWluIFByb2dyYW0gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tSZWZcIj5yZWZlcmVuY2UgdG8gdGhlIG93bmVyVGFzayBvZiB0aGlzIGZvcm08L3BhcmFtPlxyXG4gIGZpbGxEYXRhKHRhc2tSZWY6IEd1aVRhc2tCYXNlKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuXHJcbiAgICBpZiAodGhpcy5fdGFzayA9PT0gbnVsbCAmJiB0YXNrUmVmICE9PSBudWxsKVxyXG4gICAgICB0aGlzLl90YXNrID0gdGFza1JlZjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCkpKSB7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5pdCgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgLy8gaW5pdGlhbGl6ZXMgdGhlIHN1YmZvcm0gY29udHJvbHNcclxuICAgICAgY3RybC5Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYnVpbGQgbGlzdHMgb2YgbGlua2VkIGNvbnRyb2xzIG9uIHRoZWlyIHBhcmVudHNcclxuICAgIHRoaXMuYnVpbGRMaW5rZWRDb250cm9sc0xpc3RzKCk7XHJcblxyXG4gICAgLy8gYnVpbGQgbGlzdCBvZiBjb2x1bW5zIGFuZCBub24gY29sdW1uc1xyXG4gICAgdGhpcy5idWlsZFRhYmxlQ29sdW1uc0xpc3QoKTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG5cclxuICAgIHRoaXMuX3Rhc2suc2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoQ29uc3RhbnRzLkFDVF9TVFRfVEJMX1NDUkVFTl9NT0RFLCB0aGlzLmlzU2NyZWVuTW9kZSgpKTtcclxuICAgIHRoaXMuX3Rhc2suc2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoQ29uc3RhbnRzLkFDVF9TVFRfVEJMX0xFRlRfVE9fUklHSFQsICF0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVCUkVXKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcmRlciB0aGUgc3BsaXR0ZXIgY29udGFpbmVyIGNoaWxkcmVuLiBUaGUgY2hpbGQgdGhhdCBpcyBkb2NrZWQgdG8gZmlsbCBpcyBhZGRlZCBmaXJzdCwgdGhlblxyXG4gIC8vLyAgIHRoZSBzcGxpdHRlciBjb250cm9sIGFuZCBmaW5hbGx5IHRoZSBjaGlsZCB0aGF0IGlzIGRvY2tlZCBlaXRoZXIgdG8gdGhlIHRvcCBvciB0byB0aGUgbGVmdFxyXG5cclxuICAvLy8gPHJldHVybnM+IGVuZCBJbmRleCBvZiB0aGU8Zm9ybSAuLi4+IHN1YnRhZzwvcmV0dXJucz5cclxuICBmaWxsTmFtZShmb3JtVGFnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKGZvcm1UYWcpICsgZm9ybVRhZy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBpID0gaSArIDIpIHtcclxuICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaSArIDEpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgICB0aGlzLk5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuR3VpKSlcclxuICAgICAgICAgICAgICBFdmVudHMuV3JpdGVHdWlUb0xvZyhOU3RyaW5nLkZvcm1hdCgnUGFyc2luZyBmb3JtIFwiezB9XCInLCB0aGlzLk5hbWUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX0ZSQU1FU0VUOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSVNfTElHQUxfUkNfRk9STTpcclxuICAgICAgICAgICAgdGhpcy5pc0xlZ2FsRm9ybSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BCX0lNQUdFU19OVU1CRVI6XHJcbiAgICAgICAgICAgIHRoaXMuUEJJbWFnZXNOdW1iZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0ZPUk1fSVNOOlxyXG4gICAgICAgICAgICB0aGlzLkZvcm1Jc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1VTRVJTVEFURV9JRDpcclxuICAgICAgICAgICAgdGhpcy5fdXNlclN0YXRlSWQgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ1VuaGFuZGxlZCBhdHRyaWJ1dGUgXFwnezB9XFwnLicsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coJ2luIEZvcm0uRmlsbE5hbWUoKSBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYWJzdHJhY3QgYnVpbGRGb3JtTmFtZSgpOiBzdHJpbmc7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0cnVlIGZvciBtZGkgY2hpbGQgYW5kIGZpdCB0byBtZGlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIndpbmRvd1R5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNyZWF0ZUZvcm0oKTogdm9pZCB7XHJcbiAgICBsZXQgaW5wdXRDb250cm9scyA9IHRoaXMuR2V0TGlzdE9mSW5wdXRDb250cm9scygpO1xyXG4gICAgbGV0IGZvcm1OYW1lOiBzdHJpbmcgPSB0aGlzLmJ1aWxkRm9ybU5hbWUoKTtcclxuICAgIGlmICghdGhpcy5pc1N1YkZvcm0oKSkge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVuRm9ybSh0aGlzLCBmb3JtTmFtZSwgJzAnLCB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCksIGlucHV0Q29udHJvbHMsIHRoaXMuaXNEaWFsb2coKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBDb21tYW5kcy5hZGRPcGVuc3ViZm9ybShDb21tYW5kVHlwZS5DUkVBVEVfU1VCX0ZPUk0sIHRoaXMuZ2V0U3ViRm9ybUN0cmwoKSwgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza1RhZygpLCAoPE1nQ29udHJvbEJhc2U+dGhpcy5nZXRTdWJGb3JtQ3RybCgpKS5nZXROYW1lKCksXHJcbiAgICAgICAgZm9ybU5hbWUsIGlucHV0Q29udHJvbHMsIHRoaXMuZ2V0VGFzaygpLlJvdXRlclBhdGgsIHRoaXMuZ2V0VGFzaygpLkdldFJvdXRlclBhcmFtcygpLCB0aGlzLmdldFRhc2soKS5JbkRlZmF1bHRSb3V0ZXJPdXRsZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlZmF1bHQgY3JlYXRlIG9uZSByb3cgaW4gdGFibGUgY29udHJvbC4gRE9OJ1Qgc2V0IGl0ZW1zIGNvdW50IGR1cmluZyBmb3JtIG9wZW4uXHJcbiAgICAvLyBmaXJzdFRhYmxlUmVmcmVzaCgpIHdpbGwgY3JlYXRlIHRoZSBhY3R1YWwgcm93cywgYW5kIHJlZnJlc2ggdGhlIHRhYmxlLlxyXG4gICAgaWYgKHRoaXMuSGFzVGFibGUoKSlcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sKCk7XHJcblxyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIGFkZCB0aGUgY2FsbCBqcyBjb21tYW5kIGFuZCBnZXQgdGhlIHJldHVybiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDYWxsSlMobWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxhbnk+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBDb21tYW5kcy5hZGRDYWxsSlModGhpcywgdGhpcy5VbmlxdWVOYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiBmb3JtIGhhcyBhdXRvbWF0aWMgdGFiYmluZyBvcmRlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0F1dG9tYXRpY1RhYmJpbmdPcmRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19PUkRFUikuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKSA9PT0gVGFiYmluZ09yZGVyVHlwZS5BdXRvbWF0aWNhbGx5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUgaWYgd2UgY2FuIHJlZnJlc2ggcmVwZWF0YWJsZSBjb250cm9sc1xyXG4gIC8vLyAgIFFDUiAjNDM0NjQ5LCB3ZSBwcmV2ZW50IHBhaW50aW5nIHRhYmxlJ3MgY29udHJvbCB1bnRpbGwgc2hlbGwgaXMgb3BlbmVkIGFuZCB3ZSBrbm93IGhvdyBtYW55IHJvd3MgdG8gcGFpbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNSZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHNjcmVlbiBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1NjcmVlbk1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNMaW5lTW9kZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBsaW5lIG1vZGVcclxuICAvLy8gICBpZiB3ZSBoYXZlIGEgdHJlZSBvciBhIHRhYmxlIG9uIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0xpbmVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFpbkNvbnRyb2woKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0YXNrIGhhcyB0YWJsZSBvciB0cmVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGhhc1RhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIGZvcm0gc2hvdWxkIGJlIG9wZW5lZCBhcyBtb2RhbCB3aW5kb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEaWFsb2coKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCB3aW5kb3dUeXBlOiBXaW5kb3dUeXBlID0gdGhpcy5Db25jcmV0ZVdpbmRvd1R5cGU7XHJcbiAgICBpZiAod2luZG93VHlwZSA9PT0gV2luZG93VHlwZS5PdmVybGF5KVxyXG4gICAgICBpc0RpYWxvZyA9IHRydWU7XHJcbiAgICBlbHNlIGlmIChNZ0Zvcm1CYXNlLlNob3VsZEJlaGF2ZUFzTW9kYWwoKSlcclxuICAgICAgaXNEaWFsb2cgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGlzRGlhbG9nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG91bGQgdGhpcyBmb3JtIGJlaGF2ZSBhcyBNb2RhbCBhbHRob3VnaCBpdHMgV2luZG93VHlwZSAhPSBNb2RhbD9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW48L3JldHVybnM+XHJcbiAgaXNTdWJGb3JtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1YkZvcm1DdHJsICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGZvcm0gaXMgc3ViZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSGFzVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUb3BNb3N0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCB0b3BNb3N0Rm9ybTogTWdGb3JtQmFzZSA9IHRoaXM7XHJcblxyXG4gICAgLy8gVGhlIGZvcm0gb2YgdGhlIHN1YiBmb3JtIGNvbnRyb2xcclxuICAgIHdoaWxlICh0b3BNb3N0Rm9ybS5pc1N1YkZvcm0oKSAmJiB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtICE9PSBudWxsKVxyXG4gICAgICB0b3BNb3N0Rm9ybSA9IHRvcE1vc3RGb3JtLlBhcmVudEZvcm07XHJcblxyXG4gICAgcmV0dXJuIHRvcE1vc3RGb3JtO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgZnJhbWUgZm9ybSBmb3IgbWVudSByZWZyZXNoLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZyYW1lRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCB0b3BNb3N0Rm9ybTogTWdGb3JtQmFzZSA9IHRoaXM7XHJcblxyXG4gICAgd2hpbGUgKHRvcE1vc3RGb3JtICE9PSBudWxsKVxyXG4gICAgICB0b3BNb3N0Rm9ybSA9ICgodG9wTW9zdEZvcm0uUGFyZW50Rm9ybSAhPT0gbnVsbCkgPyB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtIDogbnVsbCk7XHJcblxyXG4gICAgcmV0dXJuIHRvcE1vc3RGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBtZ2Zvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFN1YkZvcm1DdHJsKCk6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1YkZvcm1DdHJsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgZm9ybSBtYXBwaW5nIGluIGNvbnRyb2wncyBtYXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxJZHhcIj50aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICBnZXRDdHJsKGN0cmxJZHg6IG51bWJlcik6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsKGN0cmxJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlJldHVybnMgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgbnVsbCBpZiBkb2VzIG5vdCBleGlzdDwvcmV0dXJucz5cclxuICBHZXRDdHJsKGN0cmxOYW1lOiBzdHJpbmcpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZmF1bHRSb3V0ZXJPdXRsZXQ6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICBnZXQgRGVmYXVsdFJvdXRlck91dGxldCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGlmICh0aGlzLmRlZmF1bHRSb3V0ZXJPdXRsZXQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRSb3V0ZXJPdXRsZXQgPSB0aGlzLkN0cmxUYWIuR2V0Q29udHJvbCgoeDogTWdDb250cm9sQmFzZSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB4LklzRGVmYXVsdFJvdXRlck91dGxldCgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiB0aGUgY29udHJvbCB3aXRoIGEgZ2l2ZW4gbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsTmFtZVwiPnRoZSBvZiB0aGUgcmVxdWVzdGVkIGNvbnRyb2w8L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldENob2ljZUNvbnRyb2xJdGVtTGlzdChtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KG1nQ29udHJvbC5pc0Nob2ljZUNvbnRyb2woKSk7XHJcblxyXG4gICAgbGV0IGl0ZW1zOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdCgpO1xyXG4gICAgbGV0IGZsZDogR3VpRmllbGRCYXNlID0gbWdDb250cm9sLmdldEZpZWxkKCk7XHJcbiAgICBsZXQgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICBpZiAoc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICBpZiAobWdDb250cm9sLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGQuR2V0UmFkaW9DdHJscygpLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcmFkaW9Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gZmxkLkdldFJhZGlvQ3RybHMoKS5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IHJhZGlvQ29udHJvbC5HZXRJdGVtc1JhbmdlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCBtZ0NvbnRyb2wuR2V0SXRlbXNSYW5nZSgpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gTWdGb3JtQmFzZS5Db252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXMsIHN0b3JhZ2VBdHRyaWJ1dGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgaXRlbXMgbGlzdCBvZiBjaG9pY2UgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ0NvbnRyb2xcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEdldENob2ljZUNvbnRyb2xEaXNwbGF5TGlzdChtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KG1nQ29udHJvbC5pc0Nob2ljZUNvbnRyb2woKSk7XHJcblxyXG4gICAgbGV0IGl0ZW1zOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdCgpO1xyXG4gICAgbGV0IGZsZDogR3VpRmllbGRCYXNlID0gbWdDb250cm9sLmdldEZpZWxkKCk7XHJcbiAgICBsZXQgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICBpZiAoc3RvcmFnZUF0dHJpYnV0ZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFICYmIHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICBpZiAobWdDb250cm9sLmlzUmFkaW8oKSkge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmbGQuR2V0UmFkaW9DdHJscygpLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcmFkaW9Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gZmxkLkdldFJhZGlvQ3RybHMoKS5nZXRfSXRlbShpKTtcclxuICAgICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IHJhZGlvQ29udHJvbC5HZXREaXNwbGF5UmFuZ2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1zLkFkZFJhbmdlKGF3YWl0IG1nQ29udHJvbC5HZXRJdGVtc1JhbmdlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBNZ0Zvcm1CYXNlLkNvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtcywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY29tbWEgY29uY2F0ZW5hdGVkIHN0cmluZyBmcm9tIGFycmF5IGxpc3QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNJdGVtTnVtVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbENvbHVtbihjdHJsOiBNZ0NvbnRyb2xCYXNlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY29sdW1uOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAoKGN0cmwuSXNSZXBlYXRhYmxlIHx8IGN0cmwuSXNUYWJsZUhlYWRlckNoaWxkKSAmJiB0aGlzLl90YWJsZUNvbHVtbnMgIT09IG51bGwpXHJcbiAgICAgIGNvbHVtbiA9IHRoaXMuX3RhYmxlQ29sdW1ucy5nZXRfSXRlbShjdHJsLmdldExheWVyKCkgLSAxKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY29udGFpbmVyIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgZ2V0Q29udGFpbmVyQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBjb250cm9sJ3MgY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbHVtbkNvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgbGV0IGNvbHVtbkNvbnRyb2xzTGlzdDogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICAgIGlmIChjb2x1bW5Db250cm9sc0xpc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbnRyb2xzTGlzdCA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICAgICAgICBjb2x1bW5Db250cm9sc0xpc3QucHVzaChjdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW5Db250cm9sc0xpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogR3VpVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBjb252ZXJ0cyBmcm9tIGRvdWJsZSBwaXhlbHMgdG8gdW9tXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwaXhWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzWGF4aXNcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRhYmxlQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZnRlciBvcGVuIHRoZSBmb3JtIG5lZWQgdG8gbW92ZSBpdCBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0dXAgcG9zaXRpb24gcHJvcGVydHkgb24gdGhlIGZvcm1cclxuICAvLy8gICBQUk9QX1RZUEVfU1RBUlRVUF9QT1NJVElPTlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1haW5Db250cm9sKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nLCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBjdHJsVHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBQb2ludCAsY2VudGVyIHRvIHRoZSBnaXZpbmcgcmVsYXRpdmVSZWN0XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBjaGVja0FuZENyZWF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICB0aGlzLmNyZWF0ZVJvdyhpZHgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgSXNWYWxpZFJvdyhpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbGlkUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHJvdzogUm93ID0gdGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICAgIHZhbGlkUm93ID0gKHJvdyAhPT0gbnVsbCAmJiByb3cuVmFsaWRhdGVkKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZFJvdztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJlZSBvciB0YWJsZSBjb250cm9sIG9mIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoUHJvcHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcykge1xyXG4gICAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfQkFSKTtcclxuXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMpXHJcbiAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgKHdoaWNoIGlzIG5vdCB0aGUgZnJhbWUgZm9ybSkgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVwZWF0YWJsZU9ubHlcIj5zaG91bGQgYmUgdHJ1ZSBpbiBvcmRlciB0byByZWZyZXNoIG9ubHkgdGhlIGNvbnRyb2xzIHRoYXQgYmVsb25nIHRvIGEgdGFibGU8L3BhcmFtPlxyXG4gIGFzeW5jIHJlZnJlc2hDb250cm9scyhyZXBlYXRhYmxlT25seTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2U7XHJcbiAgICAvLyByZWNvcmQgZG9lcyBub3QgZXhpc3RcclxuICAgIGlmICh0aGlzLkRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIHRhYmxlIGZpcnN0XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICBhd2FpdCB0aGlzLl90YWJsZU1nQ29udHJvbC5SZWZyZXNoRGlzcGxheSgpO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggYWxsIENPTFVNTlMgKHJlZnJlc2ggZm9yIGVhY2ggY29udHJvbCBiYXNlIG9uIHRoZSByZWZyZXNoIG9mIHRoZSBjb2x1bW4gKGUuZzpjb2x1bW4gd2lkdGgpXHJcbiAgICAvLyBzbyB3ZSBtdXN0IHJlZnJlc2ggdGhlIGNvbHVtbiBmaXJzdFxyXG4gICAgaWYgKHRoaXMuX3RhYmxlQ29sdW1ucyAhPT0gbnVsbCAmJiAhcmVwZWF0YWJsZU9ubHkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3RhYmxlQ29sdW1ucy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdGFibGVDb2x1bW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbEJhc2UuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5EaXNwbGF5TGluZSk7XHJcblxyXG4gICAgLy8gUUNSICM3MDk1NjMgTXVzdCByZWZyZXNoIGZyYW1lc2V0J3Mgc3ViZnJvbXMgYmVmb3JlIHdlIHJlZnJlc2ggZnJhbWVzZXQgaXRzZWxmLlxyXG4gICAgLy8gRHVyaW5nIHJlZnJlc2ggb2YgdGhlIGZyYW1lc2V0IG5lc3RlZCBzdWJmb3JtcyB3aXRoIFJlZnJlc2hXaGVuSGlkZGVuIG1pZ2h0IGJlIGJyb3VnaHQgdG8gc2VydmVyXHJcbiAgICAvLyBidXQgdGhlaXIgc3ViZm9ybSdzIGNvbnRyb2xzIGhhdmUgbm90IGJlZW4gc2V0IHdpdGggY29ycmVjdCBib3VuZHMuIFRoaXMgY2F1c2VzIGlsbGVnYWwgcGxhY2VtZW50XHJcbiAgICAvLyBhbmQgaW5jb3JyZWN0IGZpbmFsIGxvY2F0aW9uIG9mIGNvbnRyb2xzIG9uIG5lc3RlZCBzdWJmb3Jtc1xyXG4gICAgbGV0IHRhYkFuZEdyb3VwQ29udHJvbHM6IFN0YWNrPE1nQ29udHJvbEJhc2U+ID0gbmV3IFN0YWNrPE1nQ29udHJvbEJhc2U+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBjdHJsID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIGlmICgoY3RybC5pc1RhYkNvbnRyb2woKSB8fCBjdHJsLmlzR3JvdXAoKSkgJiYgIXJlcGVhdGFibGVPbmx5KSB7XHJcbiAgICAgICAgdGFiQW5kR3JvdXBDb250cm9scy5wdXNoKGN0cmwpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgfHwgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgcmVwZWF0YWJsZU9ubHkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheShyZXBlYXRhYmxlT25seSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIG1hcmtSb3dOT1RDcmVhdGVkKGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlVORE9fQ1JFQVRFX1RBQkxFX1JPVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGlkeCk7XHJcblxyXG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpXHJcbiAgICAgIHRoaXMuUm93cy5zZXRfSXRlbShpZHgsIG5ldyBSb3coZmFsc2UsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBTZWxlY3RSb3coKTogdm9pZDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIHJvdyBpcyBub3QgY3JlYXRlZCB5ZXQgY3JlYXRlcyByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBTZWxlY3RSb3coc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtYXJrcyByb3cgY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIFNlbGVjdFJvdyhyb3dJZHg6IG51bWJlciwgc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBTZWxlY3RSb3coc2VuZEFsd2F5c09yUm93SWR4PzogYW55LCBzZW5kQWx3YXlzPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXHJcbiAgICAgIHRoaXMuU2VsZWN0Um93XzAoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICB0aGlzLlNlbGVjdFJvd18xKHNlbmRBbHdheXNPclJvd0lkeCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLlNlbGVjdFJvd18yKHNlbmRBbHdheXNPclJvd0lkeCwgc2VuZEFsd2F5cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHB1YmxpYylcclxuICAvLy8gY2hlY2sgaWYgc3BlY2lmaWVkIHJvdyBpcyB2YWxpZCByb3cgaW4gcGFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCByb3dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+IGludCBpcyB0aGUgdGFibGUgc2l6ZTwvcmV0dXJucz5cclxuICBnZXRSb3dzSW5QYWdlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm93c0luUGFnZTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaW50IGlzIHRoZSB0YWJsZSBzaXplPC9yZXR1cm5zPlxyXG4gIGdldE1heFJvd3NJblBhZ2luYXRlZFRhYmxlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4Um93c0luUGFnaW5hdGVkVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIFJvdyBpcyBjcmVhdGVkIG9uIEdVSSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNpemVcIj50aGUgdGFibGUgc2l6ZTwvcGFyYW0+XHJcbiAgc2V0Um93c0luUGFnZShzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Jvd3NJblBhZ2UgPSBzaXplO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1hcmtzIHRoaXMgcm93IGFzIG5vdCBjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb2x1bW5zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIGxldCBjb2x1bW5zQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgICAgICBjb2x1bW5zQ291bnQgPSBjb2x1bW5zQ291bnQgKyAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnNDb3VudDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluUmVmcmVzaERpc3BsYXkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5SZWZyZXNoRGlzcDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKG5ld1RpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLnNldFRpdGxlKHRoaXMsIG5ld1RpdGxlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiaW4gcmVmcmVzaCBkaXNwbGF5XCIgZmxhZ1xyXG5cclxuICBnZXRDb250cm9sSWR4KGN0cmw6IE1nQ29udHJvbEJhc2UpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDb250cm9sSWR4KGN0cmwsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFeGVjdXRlIHRoZSBsYXlvdXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BJbmRleEZyb21HVUkoKTogbnVtYmVyIHtcclxuICAgIGxldCB0b3BEaXNwbGF5TGluZTogbnVtYmVyID0gMDtcclxuICAgIGlmICh0aGlzLmhhc1RhYmxlKCkpXHJcbiAgICAgIHRvcERpc3BsYXlMaW5lID0gQ29tbWFuZHMuZ2V0VG9wSW5kZXgodGhpcy5nZXRNYWluQ29udHJvbCgpKTtcclxuICAgIHJldHVybiB0b3BEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGlzIGdyb3VwIGlzIHRoZSBsYXN0IGdyb3VwIGluIHRoZSB0b29sYmFyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdyb3VwTnVtYmVyXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0YWJsZSBpdGVtcyBjb3VudDwvcmV0dXJucz5cclxuICBnZXRUYWJsZUl0ZW1zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUl0ZW1zQ291bnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRhYmxlIGNvbnRyb2wgaXMgYWx3YXlzIGZpcnN0IG9uIHRoZSBmb3JtXHJcbiAgLy8vIFdoZW4gdGFibGUgaXMgYSBjaGlsZCBvZiB0YWIsIGl0IGlzIGNyZWF0ZWQgYmVmb3JlIHRhYidzIGxheWVycyhUYWJQYWdlcykgYXJlIGNyZWF0ZWQuXHJcbiAgLy8vIENvbXB1dGluZyBUYWIncyBjaGlsZHJlbiBjb29yZGluYXRlcyBkZXBlbmRzIG9uIHRoZSBUYWJQYWdlcyBiZWluZyBjcmVhdGVkXHJcbiAgLy8vIFNvLCB3ZSBtdXN0IGZpeCB0YWJsZSdzIGxvY2F0aW9uIGFmdGVyIFRhYiBpcyBjcmVhdGVkXHJcbiAgLy8vIFFDUiAjMjg5OTY2XHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVtb3ZlUmVmc1RvQ3RybHMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpLnJlbW92ZVJlZkZyb21GaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0aGlzIGZvcm0gbWF5IGhhdmUgQWN0aXZlUm93SGlnaHRsaWdodFN0YXRlXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRUYWJsZUNoaWxkcmVuKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlQ2hpbGRyZW4gPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFibGVDaGlsZHJlbiA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdHJsVGFiICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IG1pblRhYk9yZGVyOiBudW1iZXIgPSAyMTQ3NDgzNjQ3O1xyXG4gICAgICAgIGxldCBhdXRvbWF0aWNUYWJiaW5nT3JkZXI6IGJvb2xlYW4gPSB0aGlzLmlzQXV0b21hdGljVGFiYmluZ09yZGVyKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcblxyXG4gICAgICAgICAgaWYgKGN0cmwuSXNSZXBlYXRhYmxlIHx8IGN0cmwuSXNUYWJsZUhlYWRlckNoaWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4ucHVzaChjdHJsKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdXRvbWF0aWNUYWJiaW5nT3JkZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBjdHJsLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZUludDogbnVtYmVyID0gcHJvcC5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50IDwgbWluVGFiT3JkZXIpXHJcbiAgICAgICAgICAgICAgICAgIG1pblRhYk9yZGVyID0gdmFsdWVJbnQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWluVGFiT3JkZXIgIT09IEludDMyLk1heFZhbHVlICYmIGF1dG9tYXRpY1RhYmJpbmdPcmRlcikge1xyXG4gICAgICAgICAgdGhpcy5fZmlyc3RUYWJsZVRhYk9yZGVyID0gbWluVGFiT3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBwcmV2IGdyb3VwIGluZGV4IGlmIGV4aXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJHcm91cFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFibGVDdHJsXCI+dGhlIHRhYmxlQ3RybCB0byBzZXQ8L3BhcmFtPlxyXG4gIHNldFRhYmxlQ3RybCh0YWJsZUN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RhYmxlTWdDb250cm9sID0gdGFibGVDdHJsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG5cclxuICBnZXRDdHJsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDb250cm9sc0NvdW50RXhjbHVkaW5nU3RhdHVzQmFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldFNpemUoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hQcm9wc09uRXhwcmVzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gKHRoaXMuX3Byb3BUYWIgPT0gbnVsbCA/IDAgOiB0aGlzLl9wcm9wVGFiLmdldFNpemUoKSk7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgIXJlZnJlc2g7IGkrKykge1xyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wKGkpO1xyXG4gICAgICBpZiAocHJvcC5pc0V4cHJlc3Npb24oKSkge1xyXG4gICAgICAgIHJlZnJlc2ggPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VGFiQ29udHJvbChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgb2JqOiBPYmplY3Q7XHJcbiAgICBsZXQgcmVzdWx0OiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBvYmogPSBjdHJsO1xyXG4gICAgd2hpbGUgKG9iaiBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpIHtcclxuICAgICAgbGV0IGN1cnJDdHJsID0gPE1nQ29udHJvbEJhc2U+b2JqO1xyXG4gICAgICBpZiAoY3VyckN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICByZXN1bHQgPSBjdXJyQ3RybDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBvYmogPSBjdXJyQ3RybC5nZXRQYXJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBjdHJsIGlzIG5vdCB0YWIgYW5kIG5vdCB0YWIncyBjaGlsZCAtIGZpbmQgZmlyc3QgdGFiIGluIHRoZSBmb3JtXHJcbiAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIG9iaiA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmICgoPE1nQ29udHJvbEJhc2U+b2JqKS5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gPE1nQ29udHJvbEJhc2U+b2JqO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgY29udHJvbHMgb2YgdGhpcyBmb3JtXHJcblxyXG4gIElzSW5wdXRUeXBlKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAoY3RybC5UeXBlKSB7XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1g6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEVYVDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTzpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgbGlzdCBvZiB0YWJsZSBjaGlsZHJlblxyXG5cclxuICBwdWJsaWMgR2V0TGlzdE9mSW5wdXRDb250cm9scygpOiBhbnkge1xyXG4gICAgbGV0IGZpbHRlcnRlckxpc3QgPSB0aGlzLkN0cmxUYWIuZmlsdGVyKCgoYywgaW5kZXgsIGFycmF5KSA9PiB0aGlzLklzSW5wdXRUeXBlKGMpKSk7XHJcbiAgICBsZXQgbmFtZXMgPSBmaWx0ZXJ0ZXJMaXN0LnJlZHVjZSgocHJlLCBjdHJsLCBpKSA9PiB7XHJcbiAgICAgIHByZVtjdHJsLlVuaXF1ZU5hbWVdID0gY3RybC5Jc1JlcGVhdGFibGUgPyAnMScgOiAnMCc7XHJcbiAgICAgIHJldHVybiBwcmU7XHJcbiAgICB9LCB7fSk7XHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuXHJcbiAgLy8gZ2V0R3VpVGFibGVDaGlsZHJlbigpOiBMaXN0PEd1aU1nQ29udHJvbD4ge1xyXG4gIC8vICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0aGlzLl9ndWlUYWJsZUNoaWxkcmVuID09PSBudWxsO1xyXG4gIC8vICAgaWYgKGZsYWcpIHtcclxuICAvLyAgICAgdGhpcy5fZ3VpVGFibGVDaGlsZHJlbiA9IG5ldyBMaXN0PEd1aU1nQ29udHJvbD4oKTtcclxuICAvLyAgICAgbGV0IHRhYmxlQ2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gICAgIGxldCBlbnVtZXJhdG9yOiBMaXN0X0VudW1lcmF0b3I8TWdDb250cm9sQmFzZT4gPSB0YWJsZUNoaWxkcmVuLkdldEVudW1lcmF0b3IoKTtcclxuICAvLyAgICAgdHJ5IHtcclxuICAvLyAgICAgICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgICAgICBsZXQgY3VycmVudDogTWdDb250cm9sQmFzZSA9IGVudW1lcmF0b3IuQ3VycmVudDtcclxuICAvLyAgICAgICAgIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW4uQWRkKGN1cnJlbnQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmaW5hbGx5IHtcclxuICAvLyAgICAgICAoPElEaXNwb3NhYmxlPmVudW1lcmF0b3IpLkRpc3Bvc2UoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0cyB0aGUgdGFibGUgY29udHJvbCByZWxhdGVkIHRvIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVmcmVzaCBmb3JtIGRpc3BsYXkgaWYgaXQgaGFzIGEgcHJvcGVydHkgd2hpY2ggaXMgYW4gZXhwcmVzc2lvblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpcnN0VGFibGVSZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Jvd3NJblBhZ2UgPSBDb21tYW5kcy5nZXRSb3dzSW5QYWdlKHRoaXMuX3RhYmxlTWdDb250cm9sKTtcclxuICAgICAgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImR2c2l6ZVwiPm5ldyBkdnNpemU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFibGVJdGVtc0NvdW50XCI+bmV3IHRhYmxlSXRlbXNDb3VudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZW1vdmVBbGxcIj5yZW1vdmUgYWxsIGVsZW1lbnRzIGZvcm0gdGhlIHRhYmxlIGluY2x1ZGluZyBmaXJzdCBhbmQgbGFzdCBkdW1teSBlbGVtZW50czwvcGFyYW0+XHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkXHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsOiBhbnksIHJlbW92ZUFsbD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICBpZiAodHlwZW9mIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsID09ICdib29sZWFuJyl7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVJdGVtc0NvdW50XzAoZHZzaXplLCB0YWJsZUl0ZW1zQ291bnRPclJlbW92ZUFsbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhpcy5TZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemUsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMChkdnNpemU6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZSwgZHZzaXplLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2c2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0cyB0aGUgdGFibGUgY29udHJvbFxyXG4gIC8vLyB1cGRhdGUgdGFibGUgaXRlbSdzIGNvdW50IGFjY29yZGluZyB0byBwYXJhbWV0ZXIgZHZzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzEoZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQsIHJlbW92ZUFsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZVRhYmxlQ2hpbGRyZW5BcnJheXNTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGNoaWxkcmVuOiBMaXN0PE1nQ29udHJvbEJhc2U+ID0gdGhpcy5UYWJsZUNoaWxkcmVuO1xyXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBjaGlsZHJlbi5nZXRfSXRlbShpKTtcclxuICAgICAgICBjb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgIHRoaXMuX3RhYmxlTWdDb250cm9sLnVwZGF0ZUFycmF5cyhzaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaW5kIHRhYiBjb250cm9sIGZvciBwZXJmb3JtaW5nIENUUkwrVEFCICYmIENUUkwrU0hJRlQrVEFCIGFjdGlvbnNcclxuICAvLy8gICB0aGUgY29kZSBvcmlnaW5hbCBpcyBpbiBSVDo6c2tpcF90b190YWJfY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y3VycmVudCBjb250cm9sPC9wYXJhbT5cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAne0d1aU1nRm9ybScgKyAnOiBJZD0nICsgdGhpcy5fdXNlclN0YXRlSWQgKyAnfSc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVDb250cm9sSW5UYWJiaW5nT3JkZXIoY29udHJvbDogTWdDb250cm9sQmFzZSwgaW5jbHVkZUNvbnRyb2xDaGlsZE9mRnJhbWVGb3JtOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNvbnRyb2wuUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCX09SREVSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBHZXRIYXNoQ29kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLkZvcm1Jc247XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuUGFyc2VyO1xyXG4gICAgaWYgKE1nRm9ybUJhc2UuSXNGb3JtVGFnKGZvdW5kVGFnTmFtZSkpXHJcbiAgICAgIHRoaXMuZmlsbE5hbWUoZm91bmRUYWdOYW1lKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKVxyXG4gICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdGJywgcGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgIHRoaXMuQ3RybFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAvL3RoaXMuaW5pdENvbnRleHRQcm9wRm9yQ29udHJvbHMoKTtcclxuICAgICAgaWYgKCF0aGlzLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChNZ0Zvcm1CYXNlLklzRW5kRm9ybVRhZyhmb3VuZFRhZ05hbWUpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY29uc3RydWN0cyBhbiBvYmplY3Qgb2YgTWdDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0eXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRDb250cm9sXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgaXNSb3dDcmVhdGVkKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHggfHwgaWR4IDwgMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJvdzogUm93ID0gdGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICBpZiAocm93ID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHJvdy5DcmVhdGVkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBidWlsZExpbmtlZENvbnRyb2xzTGlzdHMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIGxldCBsaW5rZWRQYXJlbnQ6IE1nQ29udHJvbEJhc2UgPSA8TWdDb250cm9sQmFzZT5jdHJsLmdldExpbmtlZFBhcmVudChmYWxzZSk7XHJcbiAgICAgIGlmIChsaW5rZWRQYXJlbnQgIT09IG51bGwpXHJcbiAgICAgICAgbGlua2VkUGFyZW50LmxpbmtDdHJsKGN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIGFsbCBjb2x1bW5zIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkVGFibGVDb2x1bW5zTGlzdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YWJsZUNvbHVtbnMgPSBuZXcgTGlzdDxNZ0NvbnRyb2xCYXNlPigpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pXHJcbiAgICAgICAgICB0aGlzLl90YWJsZUNvbHVtbnMucHVzaChjb250cm9sKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIGFycmF5cyBvZiB0YWJsZSBjaGlsZHJlbiBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5DUkVBVEVfVEFCTEVfUk9XLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgaWR4KTtcclxuXHJcbiAgICBpZiAodGhpcy5Sb3dzLmxlbmd0aCA8PSBpZHgpXHJcbiAgICAgIHRoaXMuUm93cy5TZXRTaXplKGlkeCArIDEpO1xyXG5cclxuICAgIHRoaXMuUm93cy5zZXRfSXRlbShpZHgsIG5ldyBSb3codHJ1ZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgU2VsZWN0Um93XzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLlNlbGVjdFJvdyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgYXBwcm9wcmlhdGUgd2luZG93IHR5cGUgZm9yIGEgRGVmYXVsdCB3aW5kb3cgdHlwZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIndpbmRvd1R5cGVcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgU2VsZWN0Um93XzEoc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5TZWxlY3RSb3codGhpcy5EaXNwbGF5TGluZSwgc2VuZEFsd2F5cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBvbmxpbmUgd2UgbmVlZCB0byBwaXQgJ0FDVF9ISVQnIHdoZW4gdGhlIGZvcm0gd2FzIGNsb3NlZCBmcm9tIHN5c3RlbSBtZW51XHJcbiAgLy8vIGlmIHRoZSB0YXNrIGhhcyBvbmx5IHN1YmZvcm0gY29udHJvbCBvbiBpdC5cclxuICAvLy8gRm9yIFJDIGFsd2F5cyByZXR1cm4gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbHdheXNcIj5zZW5kIHNlbGVjdGlvbiBjb21tYW5kIGRlcGVuZGluZyBvbiBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZWxlY3RSb3dfMihyb3dJZHg6IG51bWJlciwgc2VuZEFsd2F5czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgLy8gY29udHJvbEZvclNlbGVjdCBjYW4gYmUgdGFibGUgY29udHJvbCBvciB0cmVlIGNvbnRyb2xcclxuICAgIGxldCBtYWluQ29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuZ2V0TWFpbkNvbnRyb2woKTtcclxuXHJcbiAgICBpZiAobWFpbkNvbnRyb2wgIT09IG51bGwgJiYgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQpIHtcclxuICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSByb3dJZHg7XHJcbiAgICAgIGlmICh0aGlzLl90YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgIGluZGV4ID0gR3VpQ29uc3RhbnRzLk5PX1JPV19TRUxFQ1RFRDtcclxuXHJcbiAgICAgIGlmIChzZW5kQWx3YXlzIHx8IGluZGV4ICE9PSB0aGlzLl9wcmV2U2VsSW5kZXgpIHtcclxuICAgICAgICAvLyBmb3IgdHJlZSBjb250cm9sIHdlIGFsd2F5cyBzZW5kIHNlbGVjdGlvbiwgc2luY2Ugc29tZXRpbWVzIHdlIG5lZWQgdG8gdW5kbyB0cmVlIGRlZmF1bCBzZWxlY3Rpb25cclxuICAgICAgICB0aGlzLl9wcmV2U2VsSW5kZXggPSBpbmRleDtcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIG1haW5Db250cm9sLCAwLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFJvdywgaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmb3JjZSBhbGwgTWdDb250cm9scyB0byB1cGRhdGUgdGhlIGNvbG9ycyB1c2VkIG9uIHRoZSBjb250cm9sc1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKDEsIDEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVtb3ZlQWxsXCI+cmVtb3ZlIGFsbCBlbGVtZW50cyBmb3JtIHRoZSB0YWJsZSBpbmNsdWRpbmcgZmlyc3QgYW5kIGxhc3QgZHVtbXkgZWxlbWVudHM8L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8xKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JVEVNU19DT1VOVCwgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIHRhYmxlSXRlbXNDb3VudCk7XHJcbiAgICAgIHRoaXMuX3RhYmxlSXRlbXNDb3VudCA9IHRhYmxlSXRlbXNDb3VudDtcclxuICAgICAgdGhpcy5Sb3dzLlNldFNpemUoZHZTaXplKTtcclxuICAgICAgdGhpcy5fcHJldkd1aVRvcEluZGV4ID0gLTI7XHJcbiAgICAgIHRoaXMuX3ByZXZTZWxJbmRleCA9IC0yO1xyXG4gICAgICB0aGlzLlVwZGF0ZVRhYmxlQ2hpbGRyZW5BcnJheXNTaXplKGR2U2l6ZSk7XHJcbiAgICAgIHRoaXMuX21heFJvd3NJblBhZ2luYXRlZFRhYmxlID0gQ29tbWFuZHMuZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUodGhpcy5fdGFibGVNZ0NvbnRyb2wpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYXJyYXlzIG9mIHRhYmxlIGNoaWxkcmVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzaXplXCI+PC9wYXJhbT5cclxuICBwdWJsaWMgSW5zZXJ0VGFibGVDaGlsZHJlbkFycmF5cyhpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICBsZXQgY2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgIGNvbnRyb2wuSW5zZXJ0QXJyYXlzKGlkeCwgY291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGNsYXNzIGRlc2NyaWJpbmcgcm93XHJcbi8vLyA8L3N1bW1hcnk+XHJcbi8vLyA8YXV0aG9yPnJpbmF2PC9hdXRob3I+XHJcbmV4cG9ydCBjbGFzcyBSb3cge1xyXG4gIENyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgICAgIC8vIGlzIHJvdyBjcmVhdGVkIG9uIGd1aSBsZXZlbFxyXG4gIFZhbGlkYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgIC8vIGlzIHJvdyBWYWxpZGF0ZWRcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihjcmVhdGVkOiBib29sZWFuLCB2YWxpZGF0ZWQ6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKGNyZWF0ZWQ/OiBib29sZWFuLCB2YWxpZGF0ZWQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNyZWF0ZWQsIHZhbGlkYXRlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLlZhbGlkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoY3JlYXRlZDogYm9vbGVhbiwgdmFsaWRhdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkNyZWF0ZWQgPSBjcmVhdGVkO1xyXG4gICAgdGhpcy5WYWxpZGF0ZWQgPSB2YWxpZGF0ZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|