@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.
Files changed (105) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1050 -7528
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +1 -1
  4. package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
  5. package/esm2015/index.js +1 -1
  6. package/esm2015/magic-xpa-gui.js +1 -4
  7. package/esm2015/src/Commands.js +11 -114
  8. package/esm2015/src/Events.js +1 -517
  9. package/esm2015/src/EventsProcessor.js +1 -51
  10. package/esm2015/src/FocusManager.js +1 -13
  11. package/esm2015/src/GuiConstants.js +2 -11
  12. package/esm2015/src/GuiEnums.js +126 -130
  13. package/esm2015/src/GuiEnvironment.js +1 -1
  14. package/esm2015/src/IFlowMonitorQueue.js +1 -1
  15. package/esm2015/src/Manager.js +10 -148
  16. package/esm2015/src/UIBridge.js +1 -6
  17. package/esm2015/src/env/IEnvironment.js +1 -1
  18. package/esm2015/src/gui/ControlBase.js +1 -1
  19. package/esm2015/src/gui/GuiMgControl.js +1 -94
  20. package/esm2015/src/gui/GuiMgForm.js +1 -1
  21. package/esm2015/src/gui/KeyboardItem.js +5 -46
  22. package/esm2015/src/gui/LastFocusedVal.js +1 -5
  23. package/esm2015/src/gui/MgValue.js +1 -1
  24. package/esm2015/src/gui/PropParentInterface.js +1 -1
  25. package/esm2015/src/gui/low/DialogHandler.js +1 -10
  26. package/esm2015/src/gui/low/GuiCommand.js +1 -12
  27. package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
  28. package/esm2015/src/gui/low/GuiInteractive.js +8 -465
  29. package/esm2015/src/gui/low/Style.js +1 -9
  30. package/esm2015/src/management/RuntimeContextBase.js +11 -14
  31. package/esm2015/src/management/data/BlobType.js +0 -0
  32. package/esm2015/src/management/data/DcValues.js +8 -67
  33. package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
  34. package/esm2015/src/management/data/FieldDef.js +1 -95
  35. package/esm2015/src/management/data/FieldsTable.js +2 -28
  36. package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
  37. package/esm2015/src/management/data/GuiFieldBase.js +4 -39
  38. package/esm2015/src/management/data/IRecord.js +1 -1
  39. package/esm2015/src/management/data/IReferencedObject.js +1 -8
  40. package/esm2015/src/management/data/NUM_TYPE.js +14 -485
  41. package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
  42. package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
  43. package/esm2015/src/management/data/RecordUtils.js +6 -112
  44. package/esm2015/src/management/data/VectorType.js +17 -252
  45. package/esm2015/src/management/data/VectorTypeBase.js +1 -35
  46. package/esm2015/src/management/events/IActionManager.js +1 -1
  47. package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
  48. package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
  49. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
  50. package/esm2015/src/management/gui/ControlTable.js +18 -72
  51. package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
  52. package/esm2015/src/management/gui/FieldValidator.js +58 -339
  53. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
  54. package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
  55. package/esm2015/src/management/gui/HebrewDate.js +3 -140
  56. package/esm2015/src/management/gui/Helps.js +2 -48
  57. package/esm2015/src/management/gui/MgControlBase.js +143 -876
  58. package/esm2015/src/management/gui/MgFormBase.js +68 -407
  59. package/esm2015/src/management/gui/PIC.js +58 -285
  60. package/esm2015/src/management/gui/PropDefaults.js +13 -48
  61. package/esm2015/src/management/gui/PropInterface.js +2 -4
  62. package/esm2015/src/management/gui/PropTable.js +72 -183
  63. package/esm2015/src/management/gui/Property.js +35 -372
  64. package/esm2015/src/management/gui/ValidationDetails.js +10 -52
  65. package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
  66. package/esm2015/src/management/gui/WrongFormatException.js +1 -15
  67. package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
  68. package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
  69. package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
  70. package/esm2015/src/management/tasks/ITask.js +1 -1
  71. package/esm2015/src/management/tasks/MgTimer.js +1 -16
  72. package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
  73. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
  74. package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
  75. package/esm2015/src/util/MemoryUtil.js +1 -41
  76. package/esm2015/src/util/ObjectReference.js +1 -8
  77. package/esm2015/src/util/ProcessLauncher.js +3 -21
  78. package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
  79. package/fesm2015/magic-xpa-gui.js +857 -7052
  80. package/fesm2015/magic-xpa-gui.js.map +1 -1
  81. package/magic-xpa-gui.d.ts +0 -3
  82. package/package.json +2 -2
  83. package/src/Commands.d.ts +2 -0
  84. package/src/Events.d.ts +0 -2
  85. package/src/GuiEnums.d.ts +125 -128
  86. package/src/env/IEnvironment.d.ts +3 -0
  87. package/src/gui/PropParentInterface.d.ts +1 -1
  88. package/src/gui/low/GuiInteractive.d.ts +3 -1
  89. package/src/gui/low/Style.d.ts +0 -3
  90. package/src/management/RuntimeContextBase.d.ts +2 -0
  91. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  92. package/src/management/data/IRecord.d.ts +1 -1
  93. package/src/management/exp/ExpressionInterface.d.ts +4 -0
  94. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  95. package/src/management/gui/ControlTable.d.ts +1 -1
  96. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  97. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  98. package/src/management/gui/MgControlBase.d.ts +7 -7
  99. package/src/management/gui/MgFormBase.d.ts +6 -6
  100. package/src/management/gui/PIC.d.ts +1 -0
  101. package/src/management/gui/PropInterface.d.ts +2 -4
  102. package/src/management/gui/PropTable.d.ts +4 -5
  103. package/src/management/gui/Property.d.ts +1 -1
  104. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
  105. 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; // tab order of first child of table
35
+ this._firstTableTabOrder = 0;
43
36
  this._inRefreshDisp = false;
44
37
  this._inRestore = false;
45
- this._lastRowSent = -1; // last row sent ro gui thread
46
- this._prevGuiTopIndex = -1; // For paginated table it's GuiTopIndex else it's dvTopIndex
38
+ this._lastRowSent = -1;
39
+ this._prevGuiTopIndex = -1;
47
40
  this._propTab = null;
48
41
  this._rowsInPage = 1;
49
- this._maxRowsInPaginatedTable = 0; // max no of rows in paginated table
42
+ this._maxRowsInPaginatedTable = 0;
50
43
  this._subFormCtrl = null;
51
44
  this._tableMgControl = null;
52
- this._tableItemsCount = 0; // number of rows in the table
45
+ this._tableItemsCount = 0;
53
46
  this._tableRefreshed = false;
54
- this._task = null; // the task to which the current form belongs
55
- this._topIndexUpdated = false; // true if a top index was updated
56
- // Form representing the internal help window.Here the internal form object is kept on the form object itself.
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; // if to create toolbar
65
- this._tableChildren = null; // Can't use List<T>
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
- return __awaiter(this, void 0, void 0, function* () {
206
- let prop = null;
207
- if (this._propTab !== null) {
208
- prop = this._propTab.getPropById(propId);
209
- // if the property doesn't exist then create a new property and give it the default value
210
- // in addition add this property to the properties table
211
- if (prop === null) {
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
- return prop;
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
- return __awaiter(this, void 0, void 0, function* () {
258
- let parser = Manager.GetCurrentRuntimeContext().Parser;
259
- if (this._task === null && taskRef !== null)
260
- this._task = taskRef;
261
- while (yield this.initInnerObjects(parser.getNextTag())) {
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
- return __awaiter(this, void 0, void 0, function* () {
268
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
269
- let ctrl = this.CtrlTab.getCtrl(i);
270
- // initializes the subform controls
271
- ctrl.Init();
272
- }
273
- // build lists of linked controls on their parents
274
- this.buildLinkedControlsLists();
275
- // build list of columns and non columns
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); // to delete ">" too
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
- return __awaiter(this, void 0, void 0, function* () {
336
- let inputControls = this.GetListOfInputControls();
337
- let formName = yield this.buildFormName();
338
- if (!this.isSubForm()) {
339
- Commands.addOpenForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
340
- }
341
- else {
342
- 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);
343
- }
344
- // default create one row in table control. DON'T set items count during form open.
345
- // firstTableRefresh() will create the actual rows, and refresh the table.
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
- yield this.getProp(PropInterface.PROP_TYPE_TITLE_BAR);
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
- return __awaiter(this, void 0, void 0, function* () {
947
- if (foundTagName === null)
948
- return false;
949
- let parser = Manager.GetCurrentRuntimeContext().Parser;
950
- if (MgFormBase.IsFormTag(foundTagName))
951
- this.fillName(foundTagName);
952
- else if (foundTagName === XMLConstants.MG_TAG_PROP)
953
- yield this._propTab.fillData(this, 'F', parser);
954
- else if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
955
- yield this.CtrlTab.fillData(this, parser);
956
- //this.initContextPropForControls();
957
- if (!this.HasTable())
958
- this.RefreshRepeatableAllowed = true;
959
- }
960
- else if (MgFormBase.IsEndFormTag(foundTagName)) {
961
- parser.setCurrIndex2EndOfTag();
962
- return false;
963
- }
964
- else
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; // is row created on gui level
1087
- this.Validated = false; // is row Validated
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==