@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
@@ -1,4 +1,3 @@
1
- import { __awaiter } from "tslib";
2
1
  import { ApplicationException, NString } from '@magic-xpa/mscorelib';
3
2
  import { Rtf, StorageAttribute, StorageAttributeCheck, StrUtil } from '@magic-xpa/utils';
4
3
  import { Manager } from '../../Manager';
@@ -11,36 +10,27 @@ export class GuiExpressionEvaluator {
11
10
  this.ExpTask = null;
12
11
  this.Events = null;
13
12
  }
14
- /// <summary>(protected)
15
- /// sets the status bar text with the given text and
16
- /// sets the result with the last text that was set to the status bar by the use of this function
17
- /// </summary>
18
- /// <param name = "resVal">last text of status bar</param>
19
- /// <param name = "statusBarText">the text to be set at status bar</param>
20
13
  eval_op_statusbar_set_text(resVal, statusBarText) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- resVal.Attr = StorageAttribute.UNICODE;
14
+ resVal.Attr = StorageAttribute.UNICODE;
15
+ resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
16
+ if (Manager.GetCurrentRuntimeContext().DefaultStatusMsg === null) {
17
+ resVal.StrVal = '';
18
+ }
19
+ else {
23
20
  resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
24
- if (Manager.GetCurrentRuntimeContext().DefaultStatusMsg === null) {
25
- resVal.StrVal = '';
26
- }
27
- else {
28
- resVal.StrVal = Manager.GetCurrentRuntimeContext().DefaultStatusMsg;
29
- }
30
- resVal.IsNull = false;
31
- if (!(statusBarText.Attr !== StorageAttribute.ALPHA && statusBarText.Attr !== StorageAttribute.UNICODE)) {
32
- if (!statusBarText.IsNull) {
33
- let text = statusBarText.StrVal;
34
- let task = yield this.ExpTask.GetContextTask();
35
- // In case of non interactive tasks, it is possible that task has open window = No, So display the status bar msg on frame window.
36
- if (task.getForm() === null && Manager.GetCurrentRuntimeContext().FrameForm !== null) {
37
- task = Manager.GetCurrentRuntimeContext().FrameForm.getTask();
38
- }
39
- task.WriteToMessagePane(text, false);
40
- Manager.GetCurrentRuntimeContext().DefaultStatusMsg = text;
21
+ }
22
+ resVal.IsNull = false;
23
+ if (!(statusBarText.Attr !== StorageAttribute.ALPHA && statusBarText.Attr !== StorageAttribute.UNICODE)) {
24
+ if (!statusBarText.IsNull) {
25
+ let text = statusBarText.StrVal;
26
+ let task = this.ExpTask.GetContextTask();
27
+ if (task.getForm() === null && Manager.GetCurrentRuntimeContext().FrameForm !== null) {
28
+ task = Manager.GetCurrentRuntimeContext().FrameForm.getTask();
41
29
  }
30
+ task.WriteToMessagePane(text, false);
31
+ Manager.GetCurrentRuntimeContext().DefaultStatusMsg = text;
42
32
  }
43
- });
33
+ }
44
34
  }
45
35
  IsParallel(task) {
46
36
  return false;
@@ -48,7 +38,6 @@ export class GuiExpressionEvaluator {
48
38
  eval_op_browserExecute_DO(resVal, controlName, text, sync, language) {
49
39
  resVal.Attr = StorageAttribute.BOOLEAN;
50
40
  resVal.BoolVal = false;
51
- // Find the browser control by the control name
52
41
  let form = this.ExpTask.getForm();
53
42
  let sCtrlName = StrUtil.rtrim(controlName.StrVal);
54
43
  let control = this.ExpTask.getForm().GetCtrl(sCtrlName);
@@ -56,85 +45,45 @@ export class GuiExpressionEvaluator {
56
45
  resVal.BoolVal = Commands.browserExecute(control, text.StrVal, sync.BoolVal, language);
57
46
  }
58
47
  }
59
- /// <summary>(protected)
60
- /// return the control name of last clicked control
61
- /// </summary>
62
48
  eval_op_ctrl_name(resVal) {
63
49
  let lastClickedCtrlName = Manager.GetCurrentRuntimeContext().LastClickedCtrlName;
64
50
  resVal.StrVal = (NString.IsNullOrEmpty(lastClickedCtrlName) ? '' : lastClickedCtrlName);
65
51
  resVal.Attr = StorageAttribute.ALPHA;
66
52
  }
67
- /// <summary>(protected)
68
- /// Clears the form user state
69
- /// </summary>
70
- /// <param name="formName">form name (current form('') /all forms(*)) </param>
71
- /// <param name="resVal">succeed or failed</param>
72
53
  eval_op_formStateClear(formName, resVal) {
73
54
  }
74
- /// <summary>(protected)
75
- /// Moves the caret to specified control
76
- /// </summary>
77
- /// <param name = "ctrlName">the name of the destination control</param>
78
- /// <param name = "rowNum">the row in the table 0 represents current row</param>
79
- /// <param name = "generation">the task generation</param>
80
- /// <param name = "retVal">the result</param>
81
55
  eval_op_gotoCtrl(ctrlName, rowNum, generation, retVal) {
82
- return __awaiter(this, void 0, void 0, function* () {
83
- retVal.Attr = StorageAttribute.BOOLEAN;
84
- retVal.BoolVal = false;
85
- let task = yield this.GetContextTask(generation.MgNumVal.NUM_2_LONG());
86
- if (task === null || task.getForm() === null)
87
- return;
88
- let iRowNum = rowNum.MgNumVal.NUM_2_LONG();
89
- let sCtrlName = StrUtil.rtrim(ctrlName.StrVal);
90
- let ctrl = task.getForm().GetCtrl(sCtrlName);
91
- retVal.BoolVal = this.HandleControlGoto(task, ctrl, iRowNum);
92
- });
56
+ retVal.Attr = StorageAttribute.BOOLEAN;
57
+ retVal.BoolVal = false;
58
+ let task = this.GetContextTask(generation.MgNumVal.NUM_2_LONG());
59
+ if (task === null || task.getForm() === null)
60
+ return;
61
+ let iRowNum = rowNum.MgNumVal.NUM_2_LONG();
62
+ let sCtrlName = StrUtil.rtrim(ctrlName.StrVal);
63
+ let ctrl = task.getForm().GetCtrl(sCtrlName);
64
+ retVal.BoolVal = this.HandleControlGoto(task, ctrl, iRowNum);
93
65
  }
94
- /// <summary>(protected)
95
- /// get context task by a specified generation
96
- /// </summary>
97
- /// <param name = "currTask">current task</param>
98
- /// <param name = "generation">task generation</param>
99
- /// <returns> task at specified generation</returns>
100
66
  static GetContextTask(currTask, generation) {
101
- return __awaiter(this, void 0, void 0, function* () {
102
- let task = null;
103
- let taskBase = yield currTask.GetContextTask();
104
- if (generation === GuiExpressionEvaluator.TRIGGER_TASK) {
105
- task = taskBase;
106
- }
107
- else {
108
- if (generation < (yield taskBase.GetTaskDepth())) {
109
- task = taskBase.GetTaskAncestor(generation);
110
- }
67
+ let task = null;
68
+ let taskBase = currTask.GetContextTask();
69
+ if (generation === GuiExpressionEvaluator.TRIGGER_TASK) {
70
+ task = taskBase;
71
+ }
72
+ else {
73
+ if (generation < taskBase.GetTaskDepth()) {
74
+ task = taskBase.GetTaskAncestor(generation);
111
75
  }
112
- return task;
113
- });
76
+ }
77
+ return task;
114
78
  }
115
- /// <summary>(protected)
116
- /// get context task by a specified generation
117
- /// </summary>
118
- /// <param name = "generation">task generation</param>
119
- /// <returns> task at specified generation</returns>
120
79
  GetContextTask(generation) {
121
- return __awaiter(this, void 0, void 0, function* () {
122
- return yield GuiExpressionEvaluator.GetContextTask(this.ExpTask, generation);
123
- });
80
+ return GuiExpressionEvaluator.GetContextTask(this.ExpTask, generation);
124
81
  }
125
- /// <summary>(protected)
126
- /// Create a NUM_TYPE with the value of i and set the ExpVal with it
127
- /// </summary>
128
82
  ConstructMagicNum(resVal, i, attr) {
129
83
  resVal.MgNumVal = new NUM_TYPE();
130
84
  resVal.MgNumVal.NUM_4_LONG(i);
131
85
  resVal.Attr = attr;
132
86
  }
133
- /// <summary>(public)
134
- /// set null value to Expression Evaluator
135
- /// </summary>
136
- /// <param name = "resVal">to set it NULL</param>
137
- /// <param name = "attr">attribute of ExpValue</param>
138
87
  SetNULL(resVal, attr) {
139
88
  resVal.IsNull = true;
140
89
  resVal.Attr = attr;
@@ -155,12 +104,6 @@ export class GuiExpressionEvaluator {
155
104
  break;
156
105
  }
157
106
  }
158
- /// <summary>
159
- /// validate value of the control
160
- /// </summary>
161
- /// <param name = "currCtrl">control whose value need to be evaluated</param>
162
- /// <param name = "oldValue">old value of the control</param>
163
- /// <param name = "newValue">new value of the control</param>
164
107
  GetValidatedValue(currCtrl, oldValue, newValue) {
165
108
  let vd = currCtrl.buildCopyPicture(oldValue, newValue);
166
109
  vd.evaluate();
@@ -175,13 +118,6 @@ export class GuiExpressionEvaluator {
175
118
  }
176
119
  return ctrlValue;
177
120
  }
178
- /// <summary>
179
- /// set expValue of needed type . the value is inited by value
180
- /// </summary>
181
- /// <param name = "resVal">need be evaluated/initialized</param>
182
- /// <param name = "type">of resVal (Alpha|Numeric|Logical|Date|Time|Blob|Vector)</param>
183
- /// <param name = "val">string/hexa string</param>
184
- /// <param name = "pic">for string evaluation</param>
185
121
  SetVal(resVal, type, val, pic) {
186
122
  switch (type) {
187
123
  case StorageAttribute.ALPHA:
@@ -211,15 +147,9 @@ export class GuiExpressionEvaluator {
211
147
  default:
212
148
  this.SetNULL(resVal, type);
213
149
  this.Events.WriteExceptionToLog('ExpressionEvaluator.SetVal() there is no such type : ' + type);
214
- // ClientManager.Instance.WriteErrorToLog("ExpressionEvaluator.SetVal() there is no such type : " + type);
215
150
  break;
216
151
  }
217
152
  }
218
- /// <summary>(protected)
219
- /// trims and returns the string.
220
- /// </summary>
221
- /// <param name = "val">containing string to be trimmed (strVal_ member of ExpVal)</param>
222
- /// <returns>trimmed string</returns>
223
153
  static exp_build_string(val) {
224
154
  let name = '';
225
155
  if (val.StrVal !== null) {
@@ -230,37 +160,9 @@ export class GuiExpressionEvaluator {
230
160
  }
231
161
  return name;
232
162
  }
233
- /// <summary>(protected)
234
- /// translates a filepath (supports logical name)
235
- /// </summary>
236
- /// <param name = "val">containing filepath (strVal_ member of ExpVal)</param>
237
- /// <returns> trimmed and translated string.</returns>
238
- exp_build_ioname(val) {
239
- return __awaiter(this, void 0, void 0, function* () {
240
- let name = '';
241
- if (val.StrVal !== null) {
242
- let len = Math.min(val.StrVal.length, 260);
243
- if (len > 0) {
244
- let tempName = StrUtil.ZstringMake(val.StrVal, len);
245
- name = yield this.Translate(tempName);
246
- }
247
- }
248
- return name;
249
- });
250
- }
251
- /// <summary>
252
- /// checks if the object is instance of ExpVal
253
- /// </summary>
254
- /// <param name="obj"></param>
255
- /// <returns></returns>
256
163
  static isExpVal(obj) {
257
164
  return obj instanceof ExpVal;
258
165
  }
259
- /// <summary>(private)
260
- /// handle conversions between blob and unicode/alpha
261
- /// </summary>
262
- /// <param name="val"></param>
263
- /// <param name="expectedType"></param>
264
166
  BlobStringConversion(val, expectedType) {
265
167
  if (StorageAttributeCheck.IsTypeAlphaOrUnicode(expectedType)) {
266
168
  if (val.Attr === StorageAttribute.BLOB) {
@@ -328,10 +230,6 @@ export class GuiExpressionEvaluator {
328
230
  }
329
231
  }
330
232
  GuiExpressionEvaluator.TRIGGER_TASK = 500000;
331
- /// <summary>
332
- /// The class holds data of a basic element (constant or variable) that
333
- /// appears or are result of execution of operator
334
- /// </summary>
335
233
  export class ExpVal {
336
234
  constructor(attr, isNull, mgVal) {
337
235
  this.Attr = StorageAttribute.NONE;
@@ -364,15 +262,9 @@ export class ExpVal {
364
262
  this.VectorField = src.VectorField;
365
263
  this.OriginalNull = src.OriginalNull;
366
264
  }
367
- /// <summary>
368
- /// nullify
369
- /// </summary>
370
265
  Nullify() {
371
266
  this.Init(StorageAttribute.NONE, true, null);
372
267
  }
373
- /// <summary>
374
- /// initialize
375
- /// </summary>
376
268
  Init(attr, isNull, mgVal) {
377
269
  this.Attr = attr;
378
270
  this.IsNull = isNull;
@@ -403,17 +295,12 @@ export class ExpVal {
403
295
  this.IncludeBlobPrefix = false;
404
296
  break;
405
297
  case StorageAttribute.DOTNET:
406
- // For dotnet objects, ExpVal should be constructed using overloaded Constructor.
407
- // If it is a blobPrefix, it should be done here.
408
298
  this.StrVal = mgVal;
409
299
  break;
410
300
  default:
411
301
  throw new ApplicationException('in ExpVal.ExpVal() illegal attribute: \'' + this.Attr + '\'');
412
302
  }
413
303
  }
414
- /// <summary>
415
- /// Gets the string form of the value in the ExpVal class
416
- /// </summary>
417
304
  ToMgVal() {
418
305
  let str;
419
306
  switch (this.Attr) {
@@ -439,12 +326,8 @@ export class ExpVal {
439
326
  }
440
327
  return str;
441
328
  }
442
- /// <summary>
443
- /// return true if the value is an empty string
444
- /// </summary>
445
- /// <returns></returns>
446
329
  isEmptyString() {
447
330
  return (this.Attr === StorageAttribute.ALPHA || this.Attr === StorageAttribute.UNICODE) && this.StrVal === '';
448
331
  }
449
332
  }
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9leHAvR3VpRXhwcmVzc2lvbkV2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFRLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBZSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFHbEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUczRCxNQUFNLE9BQWdCLHNCQUFzQjtJQThWMUM7UUE1VkEsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDcEIsV0FBTSxHQUFRLElBQUksQ0FBQztJQTZWM0IsQ0FBQztJQXBWRCx3QkFBd0I7SUFDeEIsb0RBQW9EO0lBQ3BELGlHQUFpRztJQUNqRyxjQUFjO0lBQ2QsMERBQTBEO0lBQzFELDBFQUEwRTtJQUNwRSwwQkFBMEIsQ0FBQyxNQUFjLEVBQUUsYUFBcUI7O1lBQ3BFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsZ0JBQWdCLENBQUM7WUFFcEUsSUFBSSxPQUFPLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVB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R0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNO1lBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU87b0JBQ2hCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1IsTUFBTTtZQUVSO2dCQUNFLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDL0MsTUFBTTtTQUNUO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsYUFBYTtJQUNiLCtDQUErQztJQUMvQyxjQUFjO0lBQ2QsdUJBQXVCO0lBQ3ZCLGFBQWE7UUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUNoSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgTGlzdCwgTlN0cmluZyB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgSGVscENvbW1hbmQsIFJ0ZiwgU3RvcmFnZUF0dHJpYnV0ZSwgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLCBTdHJVdGlsLCBVdGlsSW1lSnBuIH0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBJVGFzayB9IGZyb20gJy4uL3Rhc2tzL0lUYXNrJztcclxuaW1wb3J0IHsgTWFuYWdlciB9IGZyb20gJy4uLy4uL01hbmFnZXInO1xyXG5pbXBvcnQgeyBNZ0Zvcm1CYXNlIH0gZnJvbSAnLi4vZ3VpL01nRm9ybUJhc2UnO1xyXG5pbXBvcnQgeyBNZ0NvbnRyb2xCYXNlIH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHsgTlVNX1RZUEUgfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHsgR3VpRmllbGRCYXNlIH0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5cclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkRldGFpbHMgfSBmcm9tICcuLi9ndWkvVmFsaWRhdGlvbkRldGFpbHMnO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuLi9ndWkvUElDJztcclxuaW1wb3J0IHsgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4uL2d1aS9EaXNwbGF5Q29udmVydG9yJztcclxuXHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3VpRXhwcmVzc2lvbkV2YWx1YXRvciB7XHJcbiAgc3RhdGljIFRSSUdHRVJfVEFTSzogbnVtYmVyID0gNTAwMDAwO1xyXG4gIEV4cFRhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIEV2ZW50czogYW55ID0gbnVsbDtcclxuXHJcbiAgYWJzdHJhY3QgR2V0VG9wTW9zdEZvcm1zKGNvbnRleHRJZDogbnVtYmVyKTogTGlzdDxNZ0Zvcm1CYXNlPjtcclxuXHJcbiAgYWJzdHJhY3QgSGFuZGxlQ29udHJvbEdvdG8odGFzazogSVRhc2ssIGN0cmw6IE1nQ29udHJvbEJhc2UsIHJvd05vOiBudW1iZXIpOiBib29sZWFuO1xyXG5cclxuICBhYnN0cmFjdCBhc3luYyBUcmFuc2xhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBzZXRzIHRoZSBzdGF0dXMgYmFyIHRleHQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBhbmRcclxuICAvLy8gc2V0cyB0aGUgcmVzdWx0IHdpdGggdGhlIGxhc3QgdGV4dCB0aGF0IHdhcyBzZXQgdG8gdGhlIHN0YXR1cyBiYXIgYnkgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc1ZhbFwiPmxhc3QgdGV4dCBvZiBzdGF0dXMgYmFyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXR1c0JhclRleHRcIj50aGUgdGV4dCB0byBiZSBzZXQgYXQgc3RhdHVzIGJhcjwvcGFyYW0+XHJcbiAgYXN5bmMgZXZhbF9vcF9zdGF0dXNiYXJfc2V0X3RleHQocmVzVmFsOiBFeHBWYWwsIHN0YXR1c0JhclRleHQ6IEV4cFZhbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU7XHJcbiAgICByZXNWYWwuU3RyVmFsID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5EZWZhdWx0U3RhdHVzTXNnO1xyXG5cclxuICAgIGlmIChNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkRlZmF1bHRTdGF0dXNNc2cgPT09IG51bGwpIHtcclxuICAgICAgcmVzVmFsLlN0clZhbCA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzVmFsLlN0clZhbCA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZztcclxuICAgIH1cclxuICAgIHJlc1ZhbC5Jc051bGwgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIShzdGF0dXNCYXJUZXh0LkF0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgJiYgc3RhdHVzQmFyVGV4dC5BdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpKSB7XHJcbiAgICAgIGlmICghc3RhdHVzQmFyVGV4dC5Jc051bGwpIHtcclxuICAgICAgICBsZXQgdGV4dDogc3RyaW5nID0gc3RhdHVzQmFyVGV4dC5TdHJWYWw7XHJcbiAgICAgICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPmF3YWl0IHRoaXMuRXhwVGFzay5HZXRDb250ZXh0VGFzaygpO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcywgaXQgaXMgcG9zc2libGUgdGhhdCB0YXNrIGhhcyBvcGVuIHdpbmRvdyA9IE5vLCBTbyBkaXNwbGF5IHRoZSBzdGF0dXMgYmFyIG1zZyBvbiBmcmFtZSB3aW5kb3cuXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpID09PSBudWxsICYmIE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRnJhbWVGb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0YXNrID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5GcmFtZUZvcm0uZ2V0VGFzaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZSh0ZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5EZWZhdWx0U3RhdHVzTXNnID0gdGV4dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIElzUGFyYWxsZWwodGFzazogR3VpVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBldmFsX29wX2Jyb3dzZXJFeGVjdXRlX0RPKHJlc1ZhbDogRXhwVmFsLCBjb250cm9sTmFtZTogRXhwVmFsLCB0ZXh0OiBFeHBWYWwsIHN5bmM6IEV4cFZhbCwgbGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU47XHJcbiAgICByZXNWYWwuQm9vbFZhbCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIEZpbmQgdGhlIGJyb3dzZXIgY29udHJvbCBieSB0aGUgY29udHJvbCBuYW1lXHJcbiAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IHRoaXMuRXhwVGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgc0N0cmxOYW1lOiBzdHJpbmcgPSBTdHJVdGlsLnJ0cmltKGNvbnRyb2xOYW1lLlN0clZhbCk7XHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuRXhwVGFzay5nZXRGb3JtKCkuR2V0Q3RybChzQ3RybE5hbWUpO1xyXG4gICAgaWYgKGNvbnRyb2wgIT09IG51bGwgJiYgY29udHJvbC5pc0Jyb3dzZXJDb250cm9sKCkpIHtcclxuICAgICAgcmVzVmFsLkJvb2xWYWwgPSBDb21tYW5kcy5icm93c2VyRXhlY3V0ZShjb250cm9sLCB0ZXh0LlN0clZhbCwgc3luYy5Cb29sVmFsLCBsYW5ndWFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gcmV0dXJuIHRoZSBjb250cm9sIG5hbWUgb2YgbGFzdCBjbGlja2VkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGV2YWxfb3BfY3RybF9uYW1lKHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICBsZXQgbGFzdENsaWNrZWRDdHJsTmFtZTogc3RyaW5nID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5MYXN0Q2xpY2tlZEN0cmxOYW1lO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9IChOU3RyaW5nLklzTnVsbE9yRW1wdHkobGFzdENsaWNrZWRDdHJsTmFtZSkgPyAnJyA6IGxhc3RDbGlja2VkQ3RybE5hbWUpO1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vICAgQ2xlYXJzIHRoZSBmb3JtIHVzZXIgc3RhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1OYW1lXCI+Zm9ybSBuYW1lIChjdXJyZW50IGZvcm0oJycpIC9hbGwgZm9ybXMoKikpIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzVmFsXCI+c3VjY2VlZCBvciBmYWlsZWQ8L3BhcmFtPlxyXG4gIGV2YWxfb3BfZm9ybVN0YXRlQ2xlYXIoZm9ybU5hbWU6IEV4cFZhbCwgcmVzVmFsOiBFeHBWYWwpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBNb3ZlcyB0aGUgY2FyZXQgdG8gc3BlY2lmaWVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dOdW1cIj50aGUgcm93IGluIHRoZSB0YWJsZSAgMCByZXByZXNlbnRzIGN1cnJlbnQgcm93PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj50aGUgdGFzayBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldFZhbFwiPnRoZSByZXN1bHQ8L3BhcmFtPlxyXG4gIGFzeW5jIGV2YWxfb3BfZ290b0N0cmwoY3RybE5hbWU6IEV4cFZhbCwgcm93TnVtOiBFeHBWYWwsIGdlbmVyYXRpb246IEV4cFZhbCwgcmV0VmFsOiBFeHBWYWwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldFZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG4gICAgcmV0VmFsLkJvb2xWYWwgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IGF3YWl0IHRoaXMuR2V0Q29udGV4dFRhc2soZ2VuZXJhdGlvbi5NZ051bVZhbC5OVU1fMl9MT05HKCkpO1xyXG4gICAgaWYgKHRhc2sgPT09IG51bGwgfHwgdGFzay5nZXRGb3JtKCkgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgaVJvd051bTogbnVtYmVyID0gcm93TnVtLk1nTnVtVmFsLk5VTV8yX0xPTkcoKTtcclxuICAgIGxldCBzQ3RybE5hbWU6IHN0cmluZyA9IFN0clV0aWwucnRyaW0oY3RybE5hbWUuU3RyVmFsKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGFzay5nZXRGb3JtKCkuR2V0Q3RybChzQ3RybE5hbWUpO1xyXG4gICAgcmV0VmFsLkJvb2xWYWwgPSB0aGlzLkhhbmRsZUNvbnRyb2xHb3RvKHRhc2ssIGN0cmwsIGlSb3dOdW0pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIGdldCBjb250ZXh0IHRhc2sgYnkgYSBzcGVjaWZpZWQgZ2VuZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+dGFzayBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRhc2sgYXQgc3BlY2lmaWVkIGdlbmVyYXRpb248L3JldHVybnM+XHJcbiAgc3RhdGljIGFzeW5jIEdldENvbnRleHRUYXNrKGN1cnJUYXNrOiBHdWlUYXNrQmFzZSwgZ2VuZXJhdGlvbjogbnVtYmVyKTogUHJvbWlzZTxHdWlUYXNrQmFzZT4ge1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuICAgIGxldCB0YXNrQmFzZTogR3VpVGFza0Jhc2UgPSA8R3VpVGFza0Jhc2U+YXdhaXQgY3VyclRhc2suR2V0Q29udGV4dFRhc2soKTtcclxuICAgIGlmIChnZW5lcmF0aW9uID09PSBHdWlFeHByZXNzaW9uRXZhbHVhdG9yLlRSSUdHRVJfVEFTSykge1xyXG4gICAgICB0YXNrID0gdGFza0Jhc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZ2VuZXJhdGlvbiA8IGF3YWl0IHRhc2tCYXNlLkdldFRhc2tEZXB0aCgpKSB7XHJcbiAgICAgICAgdGFzayA9IDxHdWlUYXNrQmFzZT50YXNrQmFzZS5HZXRUYXNrQW5jZXN0b3IoZ2VuZXJhdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIGdldCBjb250ZXh0IHRhc2sgYnkgYSBzcGVjaWZpZWQgZ2VuZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+dGFzayBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRhc2sgYXQgc3BlY2lmaWVkIGdlbmVyYXRpb248L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0Q29udGV4dFRhc2soZ2VuZXJhdGlvbjogbnVtYmVyKTogUHJvbWlzZTxHdWlUYXNrQmFzZT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IEd1aUV4cHJlc3Npb25FdmFsdWF0b3IuR2V0Q29udGV4dFRhc2sodGhpcy5FeHBUYXNrLCBnZW5lcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBDcmVhdGUgYSBOVU1fVFlQRSB3aXRoIHRoZSB2YWx1ZSBvZiBpIGFuZCBzZXQgdGhlIEV4cFZhbCB3aXRoIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBDb25zdHJ1Y3RNYWdpY051bShyZXNWYWw6IEV4cFZhbCwgaTogbnVtYmVyLCBhdHRyOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICByZXNWYWwuTWdOdW1WYWwgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIHJlc1ZhbC5NZ051bVZhbC5OVU1fNF9MT05HKGkpO1xyXG4gICAgcmVzVmFsLkF0dHIgPSBhdHRyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihwdWJsaWMpXHJcbiAgLy8vIHNldCBudWxsIHZhbHVlIHRvIEV4cHJlc3Npb24gRXZhbHVhdG9yXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlc1ZhbFwiPnRvIHNldCBpdCBOVUxMPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImF0dHJcIj5hdHRyaWJ1dGUgb2YgRXhwVmFsdWU8L3BhcmFtPlxyXG4gIFNldE5VTEwocmVzVmFsOiBFeHBWYWwsIGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5Jc051bGwgPSB0cnVlO1xyXG4gICAgcmVzVmFsLkF0dHIgPSBhdHRyO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cikge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHJlc1ZhbC5TdHJWYWwgPSBudWxsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBudWxsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgcmVzVmFsLkJvb2xWYWwgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdmFsdWUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyckN0cmxcIj5jb250cm9sIHdob3NlIHZhbHVlIG5lZWQgdG8gYmUgZXZhbHVhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZFZhbHVlXCI+b2xkIHZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+bmV3IHZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBHZXRWYWxpZGF0ZWRWYWx1ZShjdXJyQ3RybDogTWdDb250cm9sQmFzZSwgb2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzID0gY3VyckN0cmwuYnVpbGRDb3B5UGljdHVyZShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuICAgIGxldCB2YWxpZGF0aW9uRmFpbGVkOiBib29sZWFuID0gdmQuVmFsaWRhdGlvbkZhaWxlZDtcclxuICAgIGxldCBjdHJsVmFsdWU6IHN0cmluZztcclxuICAgIGlmICh2YWxpZGF0aW9uRmFpbGVkKSB7XHJcbiAgICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gY3VyckN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgY3RybFZhbHVlID0gKChmaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gZmllbGQuZ2V0Q2VsbERlZnVhbHRWYWx1ZSgpIDogZmllbGQuZ2V0RGVmYXVsdFZhbHVlKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3RybFZhbHVlID0gdmQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3RybFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBleHBWYWx1ZSBvZiBuZWVkZWQgdHlwZSAuIHRoZSB2YWx1ZSBpcyBpbml0ZWQgYnkgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzVmFsXCI+bmVlZCBiZSBldmFsdWF0ZWQvaW5pdGlhbGl6ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHlwZVwiPm9mIHJlc1ZhbCAoQWxwaGF8TnVtZXJpY3xMb2dpY2FsfERhdGV8VGltZXxCbG9ifFZlY3Rvcik8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+c3RyaW5nL2hleGEgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPmZvciBzdHJpbmcgZXZhbHVhdGlvbjwvcGFyYW0+XHJcbiAgU2V0VmFsKHJlc1ZhbDogRXhwVmFsLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCB2YWw6IHN0cmluZywgcGljOiBQSUMpOiB2b2lkIHtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgcmVzVmFsLkF0dHIgPSB0eXBlO1xyXG4gICAgICAgIHJlc1ZhbC5TdHJWYWwgPSB2YWw7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICAgIHJlc1ZhbC5JbmNsdWRlQmxvYlByZWZpeCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHJlc1ZhbC5BdHRyID0gdHlwZTtcclxuICAgICAgICBpZiAodmFsID09IG51bGwpXHJcbiAgICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBudWxsO1xyXG4gICAgICAgIGVsc2UgaWYgKHBpYyA9PSBudWxsKVxyXG4gICAgICAgICAgcmVzVmFsLk1nTnVtVmFsID0gbmV3IE5VTV9UWVBFKHZhbCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVzVmFsLk1nTnVtVmFsID0gbmV3IE5VTV9UWVBFKHZhbCwgcGljLCAodGhpcy5FeHBUYXNrKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgcmVzVmFsLkF0dHIgPSB0eXBlO1xyXG4gICAgICAgIHJlc1ZhbC5Cb29sVmFsID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4odmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5TZXROVUxMKHJlc1ZhbCwgdHlwZSk7XHJcblxyXG4gICAgICAgIHRoaXMuRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coJ0V4cHJlc3Npb25FdmFsdWF0b3IuU2V0VmFsKCkgdGhlcmUgaXMgbm8gc3VjaCB0eXBlIDogJyArIHR5cGUpO1xyXG5cclxuICAgICAgICAvLyBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhcIkV4cHJlc3Npb25FdmFsdWF0b3IuU2V0VmFsKCkgdGhlcmUgaXMgbm8gc3VjaCB0eXBlIDogXCIgKyB0eXBlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyB0cmltcyBhbmQgcmV0dXJucyB0aGUgc3RyaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5jb250YWluaW5nIHN0cmluZyB0byBiZSB0cmltbWVkIChzdHJWYWxfIG1lbWJlciBvZiBFeHBWYWwpPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dHJpbW1lZCBzdHJpbmc8L3JldHVybnM+XHJcbiAgc3RhdGljIGV4cF9idWlsZF9zdHJpbmcodmFsOiBFeHBWYWwpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9ICcnO1xyXG4gICAgaWYgKHZhbC5TdHJWYWwgIT09IG51bGwpIHtcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gPG51bWJlcj52YWwuU3RyVmFsLmxlbmd0aDtcclxuICAgICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgICBuYW1lID0gU3RyVXRpbC5ac3RyaW5nTWFrZSh2YWwuU3RyVmFsLCA8bnVtYmVyPmxlbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIHRyYW5zbGF0ZXMgYSBmaWxlcGF0aCAoc3VwcG9ydHMgbG9naWNhbCBuYW1lKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5jb250YWluaW5nIGZpbGVwYXRoIChzdHJWYWxfIG1lbWJlciBvZiBFeHBWYWwpPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRyaW1tZWQgYW5kIHRyYW5zbGF0ZWQgc3RyaW5nLjwvcmV0dXJucz5cclxuICBhc3luYyBleHBfYnVpbGRfaW9uYW1lKHZhbDogRXhwVmFsKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSAnJztcclxuICAgIGlmICh2YWwuU3RyVmFsICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IDxudW1iZXI+TWF0aC5taW4odmFsLlN0clZhbC5sZW5ndGgsIDI2MCk7XHJcbiAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgbGV0IHRlbXBOYW1lOiBzdHJpbmcgPSBTdHJVdGlsLlpzdHJpbmdNYWtlKHZhbC5TdHJWYWwsIDxudW1iZXI+bGVuKTtcclxuICAgICAgICBuYW1lID0gYXdhaXQgdGhpcy5UcmFuc2xhdGUodGVtcE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2tzIGlmIHRoZSBvYmplY3QgaXMgaW5zdGFuY2Ugb2YgRXhwVmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvYmpcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGlzRXhwVmFsKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRXhwVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcml2YXRlKVxyXG4gIC8vLyBoYW5kbGUgY29udmVyc2lvbnMgYmV0d2VlbiBibG9iIGFuZCB1bmljb2RlL2FscGhhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cGVjdGVkVHlwZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBCbG9iU3RyaW5nQ29udmVyc2lvbih2YWw6IEV4cFZhbCwgZXhwZWN0ZWRUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKGV4cGVjdGVkVHlwZSkpIHtcclxuICAgICAgaWYgKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgICBsZXQgaW5jbHVkZUJsb2JQcmVmaXg6IGJvb2xlYW4gPSB2YWwuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICAgICAgaWYgKGluY2x1ZGVCbG9iUHJlZml4KSB7XHJcbiAgICAgICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9IEJsb2JUeXBlLmdldENvbnRlbnRUeXBlKHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgdmFsLlN0clZhbCA9IEJsb2JUeXBlLmdldFN0cmluZyh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIHZhbC5JbmNsdWRlQmxvYlByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQklOQVJZICYmIFJ0Zi5pc1J0Zih2YWwuU3RyVmFsKSkge1xyXG4gICAgICAgICAgICB2YWwuU3RyVmFsID0gU3RyVXRpbC5HZXRQbGFpblRleHRmcm9tUnRmKHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwuQXR0ciA9IGV4cGVjdGVkVHlwZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodmFsLkF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGxldCBpbmNsdWRlQmxvYlByZWZpeDI6IGJvb2xlYW4gPSB2YWwuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICAgICAgICBpZiAoaW5jbHVkZUJsb2JQcmVmaXgyKSB7XHJcbiAgICAgICAgICAgIHZhbC5TdHJWYWwgPSBCbG9iVHlwZS5yZW1vdmVCbG9iUHJlZml4KHZhbC5TdHJWYWwpO1xyXG4gICAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbC5BdHRyID0gZXhwZWN0ZWRUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZSh2YWwuQXR0cikpIHtcclxuICAgICAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSA/IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJIDogQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREU7XHJcbiAgICAgICAgICB2YWwuU3RyVmFsID0gQmxvYlR5cGUuY3JlYXRlRnJvbVN0cmluZyh2YWwuU3RyVmFsLCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSB0cnVlO1xyXG4gICAgICAgICAgdmFsLkF0dHIgPSBleHBlY3RlZFR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBldmFsX29wX3ppbWVyZWFkKHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICByZXNWYWwuQXR0ciA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICByZXNWYWwuU3RyVmFsID0gJyc7XHJcbiAgICBsZXQgdXRpbEltZUpwbjogVXRpbEltZUpwbiA9IE1hbmFnZXIuVXRpbEltZUpwbjtcclxuICAgIGlmICh1dGlsSW1lSnBuICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBzdHJJbWVSZWFkOiBzdHJpbmcgPSB1dGlsSW1lSnBuLlN0ckltZVJlYWQ7XHJcbiAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHV0aWxJbWVKcG4uU3RySW1lUmVhZCkpIHtcclxuICAgICAgICByZXNWYWwuU3RyVmFsID0gc3RySW1lUmVhZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbF9vcF93aW5faGVscChleHBGaWxlUGF0aDogRXhwVmFsLCBleHBIZWxwQ21kOiBFeHBWYWwsIGV4cEhlbHBLZXk6IEV4cFZhbCwgcmVzVmFsOiBFeHBWYWwpOiB2b2lkIHtcclxuICAgIGxldCBmaWxlUGF0aDogc3RyaW5nID0gZXhwRmlsZVBhdGguU3RyVmFsO1xyXG4gICAgbGV0IGhlbHBDbWQ6IEhlbHBDb21tYW5kID0gPEhlbHBDb21tYW5kPmV4cEhlbHBDbWQuTWdOdW1WYWwuTlVNXzJfTE9ORygpO1xyXG4gICAgbGV0IGhlbHBLZXk6IHN0cmluZyA9IGV4cEhlbHBLZXkuU3RyVmFsO1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgTWFuYWdlci5TaG93V2luZG93SGVscChmaWxlUGF0aCwgaGVscENtZCwgaGVscEtleSk7XHJcbiAgICAgIHJlc1ZhbC5Cb29sVmFsID0gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIHJlc1ZhbC5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBDb252ZXJ0RXhwVmFsKHZhbDogRXhwVmFsLCBleHBlY3RlZFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suU3RvcmFnZUZsZEFscGhhVW5pY29kZU9yQmxvYih2YWwuQXR0ciwgZXhwZWN0ZWRUeXBlKSkge1xyXG4gICAgICB0aGlzLkJsb2JTdHJpbmdDb252ZXJzaW9uKHZhbCwgZXhwZWN0ZWRUeXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgVGhlIGNsYXNzIGhvbGRzIGRhdGEgb2YgYSBiYXNpYyBlbGVtZW50IChjb25zdGFudCBvciB2YXJpYWJsZSkgdGhhdFxyXG4vLy8gICBhcHBlYXJzIG9yIGFyZSByZXN1bHQgb2YgZXhlY3V0aW9uIG9mIG9wZXJhdG9yXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFeHBWYWwge1xyXG4gIEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgSXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTWdOdW1WYWw6IE5VTV9UWVBFID0gbnVsbDtcclxuICBTdHJWYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgQm9vbFZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEluY2x1ZGVCbG9iUHJlZml4OiBib29sZWFuID0gZmFsc2U7XHJcbiAgT3JpZ2luYWxOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgVmVjdG9yRmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IoYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgaXNOdWxsOiBib29sZWFuLCBtZ1ZhbDogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihhdHRyPzogU3RvcmFnZUF0dHJpYnV0ZSwgaXNOdWxsPzogYm9vbGVhbiwgbWdWYWw/OiBzdHJpbmcpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoYXR0ciwgaXNOdWxsLCBtZ1ZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgaXNOdWxsOiBib29sZWFuLCBtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLkluaXQoYXR0ciwgaXNOdWxsLCBtZ1ZhbCk7XHJcbiAgfVxyXG5cclxuICBDb3B5KHNyYzogRXhwVmFsKTogdm9pZCB7XHJcbiAgICB0aGlzLkF0dHIgPSBzcmMuQXR0cjtcclxuICAgIHRoaXMuQm9vbFZhbCA9IHNyYy5Cb29sVmFsO1xyXG4gICAgdGhpcy5JbmNsdWRlQmxvYlByZWZpeCA9IHNyYy5JbmNsdWRlQmxvYlByZWZpeDtcclxuICAgIHRoaXMuSXNOdWxsID0gc3JjLklzTnVsbDtcclxuICAgIHRoaXMuTWdOdW1WYWwgPSBzcmMuTWdOdW1WYWw7XHJcbiAgICB0aGlzLlN0clZhbCA9IHNyYy5TdHJWYWw7XHJcbiAgICB0aGlzLlZlY3RvckZpZWxkID0gc3JjLlZlY3RvckZpZWxkO1xyXG4gICAgdGhpcy5PcmlnaW5hbE51bGwgPSBzcmMuT3JpZ2luYWxOdWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBudWxsaWZ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBOdWxsaWZ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0KFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSwgdHJ1ZSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdChhdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBpc051bGw6IGJvb2xlYW4sIG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuQXR0ciA9IGF0dHI7XHJcbiAgICB0aGlzLklzTnVsbCA9IGlzTnVsbDtcclxuXHJcblxyXG4gICAgc3dpdGNoICh0aGlzLkF0dHIpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICB0aGlzLlN0clZhbCA9IG1nVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICB0aGlzLlN0clZhbCA9IG1nVmFsO1xyXG4gICAgICAgIHRoaXMuSW5jbHVkZUJsb2JQcmVmaXggPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICB0aGlzLk1nTnVtVmFsID0gKChtZ1ZhbCAhPT0gbnVsbCkgPyBuZXcgTlVNX1RZUEUobWdWYWwpIDogbnVsbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICB0aGlzLkJvb2xWYWwgPSAobWdWYWwgIT09IG51bGwgJiYgbWdWYWwgPT09ICcxJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICB0aGlzLkJvb2xWYWwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlN0clZhbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5NZ051bVZhbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5PcmlnaW5hbE51bGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuVmVjdG9yRmllbGQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuSW5jbHVkZUJsb2JQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQ6XHJcbiAgICAgICAgLy8gRm9yIGRvdG5ldCBvYmplY3RzLCBFeHBWYWwgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHVzaW5nIG92ZXJsb2FkZWQgQ29uc3RydWN0b3IuXHJcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBibG9iUHJlZml4LCBpdCBzaG91bGQgYmUgZG9uZSBoZXJlLlxyXG4gICAgICAgIHRoaXMuU3RyVmFsID0gbWdWYWw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbignaW4gRXhwVmFsLkV4cFZhbCgpIGlsbGVnYWwgYXR0cmlidXRlOiBcXCcnICsgdGhpcy5BdHRyICsgJ1xcJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldHMgdGhlIHN0cmluZyBmb3JtIG9mIHRoZSB2YWx1ZSBpbiB0aGUgRXhwVmFsIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUb01nVmFsKCk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHN0cjogc3RyaW5nO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5BdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy5TdHJWYWw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuTWdOdW1WYWwudG9YTUxyZWNvcmQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuQm9vbFZhbFxyXG4gICAgICAgICAgPyAnMSdcclxuICAgICAgICAgIDogJzAnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzdHIgPSAnW2lsbGVnYWwgYXR0cmlidXRlOiAnICsgdGhpcy5BdHRyICsgJ10nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VtcHR5U3RyaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLkF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpICYmIHRoaXMuU3RyVmFsID09PSAnJztcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9leHAvR3VpRXhwcmVzc2lvbkV2YWx1YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQVEsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFlLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUdsSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzNELE1BQU0sT0FBZ0Isc0JBQXNCO0lBMlUxQztRQXpVQSxZQUFPLEdBQWdCLElBQUksQ0FBQztRQUNwQixXQUFNLEdBQVEsSUFBSSxDQUFDO0lBMFUzQixDQUFDO0lBN1RELDBCQUEwQixDQUFDLE1BQWMsRUFBRSxhQUFxQjtRQUM5RCxNQUFNLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUN2QyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1FBRXBFLElBQUksT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ2hFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxNQUFNLENBQUMsTUFBTSxHQUFH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QWdCLENBQUMsSUFBSSxDQUFDO1lBQzNCLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsT0FBTztnQkFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLE1BQU07WUFFUixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztZQUM5QixLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMzQixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNO1lBRVIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU87b0JBQ2hCLENBQUMsQ0FBQyxHQUFHO29CQUNMLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ1IsTUFBTTtZQUVSO2dCQUNFLEdBQUcsR0FBRyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDL0MsTUFBTTtTQUNUO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBTUQsYUFBYTtRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQ2hILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBMaXN0LCBOU3RyaW5nIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBIZWxwQ29tbWFuZCwgUnRmLCBTdG9yYWdlQXR0cmlidXRlLCBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssIFN0clV0aWwsIFV0aWxJbWVKcG4gfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgR3VpVGFza0Jhc2UgfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7IElUYXNrIH0gZnJvbSAnLi4vdGFza3MvSVRhc2snO1xyXG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7IE1nRm9ybUJhc2UgfSBmcm9tICcuLi9ndWkvTWdGb3JtQmFzZSc7XHJcbmltcG9ydCB7IE1nQ29udHJvbEJhc2UgfSBmcm9tICcuLi9ndWkvTWdDb250cm9sQmFzZSc7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi4vLi4vQ29tbWFuZHMnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBHdWlGaWVsZEJhc2UgfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcblxyXG5pbXBvcnQgeyBCbG9iVHlwZSB9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRGV0YWlscyB9IGZyb20gJy4uL2d1aS9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7IFBJQyB9IGZyb20gJy4uL2d1aS9QSUMnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi4vZ3VpL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHdWlFeHByZXNzaW9uRXZhbHVhdG9yIHtcclxuICBzdGF0aWMgVFJJR0dFUl9UQVNLOiBudW1iZXIgPSA1MDAwMDA7XHJcbiAgRXhwVGFzazogR3VpVGFza0Jhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgRXZlbnRzOiBhbnkgPSBudWxsO1xyXG5cclxuICBhYnN0cmFjdCBHZXRUb3BNb3N0Rm9ybXMoY29udGV4dElkOiBudW1iZXIpOiBMaXN0PE1nRm9ybUJhc2U+O1xyXG5cclxuICBhYnN0cmFjdCBIYW5kbGVDb250cm9sR290byh0YXNrOiBJVGFzaywgY3RybDogTWdDb250cm9sQmFzZSwgcm93Tm86IG51bWJlcik6IGJvb2xlYW47XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gc2V0cyB0aGUgc3RhdHVzIGJhciB0ZXh0IHdpdGggdGhlIGdpdmVuIHRleHQgYW5kXHJcbiAgLy8vIHNldHMgdGhlIHJlc3VsdCB3aXRoIHRoZSBsYXN0IHRleHQgdGhhdCB3YXMgc2V0IHRvIHRoZSBzdGF0dXMgYmFyIGJ5IHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXNWYWxcIj5sYXN0IHRleHQgb2Ygc3RhdHVzIGJhcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0dXNCYXJUZXh0XCI+dGhlIHRleHQgdG8gYmUgc2V0IGF0IHN0YXR1cyBiYXI8L3BhcmFtPlxyXG4gIGV2YWxfb3Bfc3RhdHVzYmFyX3NldF90ZXh0KHJlc1ZhbDogRXhwVmFsLCBzdGF0dXNCYXJUZXh0OiBFeHBWYWwpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZztcclxuXHJcbiAgICBpZiAoTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5EZWZhdWx0U3RhdHVzTXNnID09PSBudWxsKSB7XHJcbiAgICAgIHJlc1ZhbC5TdHJWYWwgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc1ZhbC5TdHJWYWwgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkRlZmF1bHRTdGF0dXNNc2c7XHJcbiAgICB9XHJcbiAgICByZXNWYWwuSXNOdWxsID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCEoc3RhdHVzQmFyVGV4dC5BdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHN0YXR1c0JhclRleHQuQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSkge1xyXG4gICAgICBpZiAoIXN0YXR1c0JhclRleHQuSXNOdWxsKSB7XHJcbiAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IHN0YXR1c0JhclRleHQuU3RyVmFsO1xyXG4gICAgICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT50aGlzLkV4cFRhc2suR2V0Q29udGV4dFRhc2soKTtcclxuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBub24gaW50ZXJhY3RpdmUgdGFza3MsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGFzayBoYXMgb3BlbiB3aW5kb3cgPSBObywgU28gZGlzcGxheSB0aGUgc3RhdHVzIGJhciBtc2cgb24gZnJhbWUgd2luZG93LlxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbCAmJiBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLkZyYW1lRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGFzayA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRnJhbWVGb3JtLmdldFRhc2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmUodGV4dCwgZmFsc2UpO1xyXG4gICAgICAgIE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuRGVmYXVsdFN0YXR1c01zZyA9IHRleHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBJc1BhcmFsbGVsKHRhc2s6IEd1aVRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXZhbF9vcF9icm93c2VyRXhlY3V0ZV9ETyhyZXNWYWw6IEV4cFZhbCwgY29udHJvbE5hbWU6IEV4cFZhbCwgdGV4dDogRXhwVmFsLCBzeW5jOiBFeHBWYWwsIGxhbmd1YWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG4gICAgcmVzVmFsLkJvb2xWYWwgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBGaW5kIHRoZSBicm93c2VyIGNvbnRyb2wgYnkgdGhlIGNvbnRyb2wgbmFtZVxyXG4gICAgbGV0IGZvcm06IE1nRm9ybUJhc2UgPSB0aGlzLkV4cFRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IHNDdHJsTmFtZTogc3RyaW5nID0gU3RyVXRpbC5ydHJpbShjb250cm9sTmFtZS5TdHJWYWwpO1xyXG4gICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkV4cFRhc2suZ2V0Rm9ybSgpLkdldEN0cmwoc0N0cmxOYW1lKTtcclxuICAgIGlmIChjb250cm9sICE9PSBudWxsICYmIGNvbnRyb2wuaXNCcm93c2VyQ29udHJvbCgpKSB7XHJcbiAgICAgIHJlc1ZhbC5Cb29sVmFsID0gQ29tbWFuZHMuYnJvd3NlckV4ZWN1dGUoY29udHJvbCwgdGV4dC5TdHJWYWwsIHN5bmMuQm9vbFZhbCwgbGFuZ3VhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIHJldHVybiB0aGUgY29udHJvbCBuYW1lIG9mIGxhc3QgY2xpY2tlZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBldmFsX29wX2N0cmxfbmFtZShyZXNWYWw6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgbGV0IGxhc3RDbGlja2VkQ3RybE5hbWU6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3VycmVudFJ1bnRpbWVDb250ZXh0KCkuTGFzdENsaWNrZWRDdHJsTmFtZTtcclxuICAgIHJlc1ZhbC5TdHJWYWwgPSAoTlN0cmluZy5Jc051bGxPckVtcHR5KGxhc3RDbGlja2VkQ3RybE5hbWUpID8gJycgOiBsYXN0Q2xpY2tlZEN0cmxOYW1lKTtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyAgIENsZWFycyB0aGUgZm9ybSB1c2VyIHN0YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtTmFtZVwiPmZvcm0gbmFtZSAoY3VycmVudCBmb3JtKCcnKSAvYWxsIGZvcm1zKCopKSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1ZhbFwiPnN1Y2NlZWQgb3IgZmFpbGVkPC9wYXJhbT5cclxuICBldmFsX29wX2Zvcm1TdGF0ZUNsZWFyKGZvcm1OYW1lOiBFeHBWYWwsIHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gTW92ZXMgdGhlIGNhcmV0IHRvIHNwZWNpZmllZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+dGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93TnVtXCI+dGhlIHJvdyBpbiB0aGUgdGFibGUgIDAgcmVwcmVzZW50cyBjdXJyZW50IHJvdzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+dGhlIHRhc2sgZ2VuZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXRWYWxcIj50aGUgcmVzdWx0PC9wYXJhbT5cclxuICBldmFsX29wX2dvdG9DdHJsKGN0cmxOYW1lOiBFeHBWYWwsIHJvd051bTogRXhwVmFsLCBnZW5lcmF0aW9uOiBFeHBWYWwsIHJldFZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICByZXRWYWwuQXR0ciA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgIHJldFZhbC5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldENvbnRleHRUYXNrKGdlbmVyYXRpb24uTWdOdW1WYWwuTlVNXzJfTE9ORygpKTtcclxuICAgIGlmICh0YXNrID09PSBudWxsIHx8IHRhc2suZ2V0Rm9ybSgpID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGlSb3dOdW06IG51bWJlciA9IHJvd051bS5NZ051bVZhbC5OVU1fMl9MT05HKCk7XHJcbiAgICBsZXQgc0N0cmxOYW1lOiBzdHJpbmcgPSBTdHJVdGlsLnJ0cmltKGN0cmxOYW1lLlN0clZhbCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHRhc2suZ2V0Rm9ybSgpLkdldEN0cmwoc0N0cmxOYW1lKTtcclxuICAgIHJldFZhbC5Cb29sVmFsID0gdGhpcy5IYW5kbGVDb250cm9sR290byh0YXNrLCBjdHJsLCBpUm93TnVtKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJvdGVjdGVkKVxyXG4gIC8vLyBnZXQgY29udGV4dCB0YXNrIGJ5IGEgc3BlY2lmaWVkIGdlbmVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclRhc2tcIj5jdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ2VuZXJhdGlvblwiPnRhc2sgZ2VuZXJhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0YXNrIGF0IHNwZWNpZmllZCBnZW5lcmF0aW9uPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDb250ZXh0VGFzayhjdXJyVGFzazogR3VpVGFza0Jhc2UsIGdlbmVyYXRpb246IG51bWJlcik6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7XHJcbiAgICBsZXQgdGFza0Jhc2U6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPiBjdXJyVGFzay5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgaWYgKGdlbmVyYXRpb24gPT09IEd1aUV4cHJlc3Npb25FdmFsdWF0b3IuVFJJR0dFUl9UQVNLKSB7XHJcbiAgICAgIHRhc2sgPSB0YXNrQmFzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChnZW5lcmF0aW9uIDwgdGFza0Jhc2UuR2V0VGFza0RlcHRoKCkpIHtcclxuICAgICAgICB0YXNrID0gPEd1aVRhc2tCYXNlPnRhc2tCYXNlLkdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHByb3RlY3RlZClcclxuICAvLy8gZ2V0IGNvbnRleHQgdGFzayBieSBhIHNwZWNpZmllZCBnZW5lcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj50YXNrIGdlbmVyYXRpb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGFzayBhdCBzcGVjaWZpZWQgZ2VuZXJhdGlvbjwvcmV0dXJucz5cclxuICBHZXRDb250ZXh0VGFzayhnZW5lcmF0aW9uOiBudW1iZXIpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICByZXR1cm4gR3VpRXhwcmVzc2lvbkV2YWx1YXRvci5HZXRDb250ZXh0VGFzayh0aGlzLkV4cFRhc2ssIGdlbmVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIENyZWF0ZSBhIE5VTV9UWVBFIHdpdGggdGhlIHZhbHVlIG9mIGkgYW5kIHNldCB0aGUgRXhwVmFsIHdpdGggaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIENvbnN0cnVjdE1hZ2ljTnVtKHJlc1ZhbDogRXhwVmFsLCBpOiBudW1iZXIsIGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHJlc1ZhbC5NZ051bVZhbCA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgcmVzVmFsLk1nTnVtVmFsLk5VTV80X0xPTkcoaSk7XHJcbiAgICByZXNWYWwuQXR0ciA9IGF0dHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KHB1YmxpYylcclxuICAvLy8gc2V0IG51bGwgdmFsdWUgdG8gRXhwcmVzc2lvbiBFdmFsdWF0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzVmFsXCI+dG8gc2V0IGl0IE5VTEw8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXR0clwiPmF0dHJpYnV0ZSBvZiBFeHBWYWx1ZTwvcGFyYW0+XHJcbiAgU2V0TlVMTChyZXNWYWw6IEV4cFZhbCwgYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSk6IHZvaWQge1xyXG4gICAgcmVzVmFsLklzTnVsbCA9IHRydWU7XHJcbiAgICByZXNWYWwuQXR0ciA9IGF0dHI7XHJcblxyXG4gICAgc3dpdGNoIChhdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICByZXNWYWwuQm9vbFZhbCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB2YWxpZGF0ZSB2YWx1ZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyQ3RybFwiPmNvbnRyb2wgd2hvc2UgdmFsdWUgbmVlZCB0byBiZSBldmFsdWF0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkVmFsdWVcIj5vbGQgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj5uZXcgdmFsdWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIEdldFZhbGlkYXRlZFZhbHVlKGN1cnJDdHJsOiBNZ0NvbnRyb2xCYXNlLCBvbGRWYWx1ZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHMgPSBjdXJyQ3RybC5idWlsZENvcHlQaWN0dXJlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICB2ZC5ldmFsdWF0ZSgpO1xyXG4gICAgbGV0IHZhbGlkYXRpb25GYWlsZWQ6IGJvb2xlYW4gPSB2ZC5WYWxpZGF0aW9uRmFpbGVkO1xyXG4gICAgbGV0IGN0cmxWYWx1ZTogc3RyaW5nO1xyXG4gICAgaWYgKHZhbGlkYXRpb25GYWlsZWQpIHtcclxuICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdXJyQ3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICBjdHJsVmFsdWUgPSAoKGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBmaWVsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCkgOiBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdHJsVmFsdWUgPSB2ZC5nZXREaXNwVmFsdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdHJsVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV4cFZhbHVlIG9mIG5lZWRlZCB0eXBlIC4gdGhlIHZhbHVlIGlzIGluaXRlZCBieSB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXNWYWxcIj5uZWVkIGJlIGV2YWx1YXRlZC9pbml0aWFsaXplZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0eXBlXCI+b2YgcmVzVmFsIChBbHBoYXxOdW1lcmljfExvZ2ljYWx8RGF0ZXxUaW1lfEJsb2J8VmVjdG9yKTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5zdHJpbmcvaGV4YSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+Zm9yIHN0cmluZyBldmFsdWF0aW9uPC9wYXJhbT5cclxuICBTZXRWYWwocmVzVmFsOiBFeHBWYWwsIHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHZhbDogc3RyaW5nLCBwaWM6IFBJQyk6IHZvaWQge1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICByZXNWYWwuQXR0ciA9IHR5cGU7XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IHZhbDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmVzVmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgcmVzVmFsLkF0dHIgPSB0eXBlO1xyXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbClcclxuICAgICAgICAgIHJlc1ZhbC5NZ051bVZhbCA9IG51bGw7XHJcbiAgICAgICAgZWxzZSBpZiAocGljID09IG51bGwpXHJcbiAgICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBuZXcgTlVNX1RZUEUodmFsKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXNWYWwuTWdOdW1WYWwgPSBuZXcgTlVNX1RZUEUodmFsLCBwaWMsICh0aGlzLkV4cFRhc2spLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICByZXNWYWwuQXR0ciA9IHR5cGU7XHJcbiAgICAgICAgcmVzVmFsLkJvb2xWYWwgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLlNldE5VTEwocmVzVmFsLCB0eXBlKTtcclxuXHJcbiAgICAgICAgdGhpcy5FdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZygnRXhwcmVzc2lvbkV2YWx1YXRvci5TZXRWYWwoKSB0aGVyZSBpcyBubyBzdWNoIHR5cGUgOiAnICsgdHlwZSk7XHJcblxyXG4gICAgICAgIC8vIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuV3JpdGVFcnJvclRvTG9nKFwiRXhwcmVzc2lvbkV2YWx1YXRvci5TZXRWYWwoKSB0aGVyZSBpcyBubyBzdWNoIHR5cGUgOiBcIiArIHR5cGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pihwcm90ZWN0ZWQpXHJcbiAgLy8vIHRyaW1zIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPmNvbnRhaW5pbmcgc3RyaW5nIHRvIGJlIHRyaW1tZWQgKHN0clZhbF8gbWVtYmVyIG9mIEV4cFZhbCk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cmltbWVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgZXhwX2J1aWxkX3N0cmluZyh2YWw6IEV4cFZhbCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICBpZiAodmFsLlN0clZhbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSA8bnVtYmVyPnZhbC5TdHJWYWwubGVuZ3RoO1xyXG4gICAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICAgIG5hbWUgPSBTdHJVdGlsLlpzdHJpbmdNYWtlKHZhbC5TdHJWYWwsIDxudW1iZXI+bGVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyBpZiB0aGUgb2JqZWN0IGlzIGluc3RhbmNlIG9mIEV4cFZhbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2JqXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc0V4cFZhbChvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEV4cFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHJpdmF0ZSlcclxuICAvLy8gaGFuZGxlIGNvbnZlcnNpb25zIGJldHdlZW4gYmxvYiBhbmQgdW5pY29kZS9hbHBoYVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBlY3RlZFR5cGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQmxvYlN0cmluZ0NvbnZlcnNpb24odmFsOiBFeHBWYWwsIGV4cGVjdGVkVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSk6IHZvaWQge1xyXG4gICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShleHBlY3RlZFR5cGUpKSB7XHJcbiAgICAgIGlmICh2YWwuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVCbG9iUHJlZml4OiBib29sZWFuID0gdmFsLkluY2x1ZGVCbG9iUHJlZml4O1xyXG4gICAgICAgIGlmIChpbmNsdWRlQmxvYlByZWZpeCkge1xyXG4gICAgICAgICAgbGV0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZSh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIHZhbC5TdHJWYWwgPSBCbG9iVHlwZS5nZXRTdHJpbmcodmFsLlN0clZhbCk7XHJcbiAgICAgICAgICB2YWwuSW5jbHVkZUJsb2JQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0JJTkFSWSAmJiBSdGYuaXNSdGYodmFsLlN0clZhbCkpIHtcclxuICAgICAgICAgICAgdmFsLlN0clZhbCA9IFN0clV0aWwuR2V0UGxhaW5UZXh0ZnJvbVJ0Zih2YWwuU3RyVmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsLkF0dHIgPSBleHBlY3RlZFR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbC5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICBsZXQgaW5jbHVkZUJsb2JQcmVmaXgyOiBib29sZWFuID0gdmFsLkluY2x1ZGVCbG9iUHJlZml4O1xyXG4gICAgICAgICAgaWYgKGluY2x1ZGVCbG9iUHJlZml4Mikge1xyXG4gICAgICAgICAgICB2YWwuU3RyVmFsID0gQmxvYlR5cGUucmVtb3ZlQmxvYlByZWZpeCh2YWwuU3RyVmFsKTtcclxuICAgICAgICAgICAgdmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YWwuQXR0ciA9IGV4cGVjdGVkVHlwZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChleHBlY3RlZFR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suSXNUeXBlQWxwaGFPclVuaWNvZGUodmFsLkF0dHIpKSB7XHJcbiAgICAgICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9ICh2YWwuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkgPyBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSSA6IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFO1xyXG4gICAgICAgICAgdmFsLlN0clZhbCA9IEJsb2JUeXBlLmNyZWF0ZUZyb21TdHJpbmcodmFsLlN0clZhbCwgY29udGVudFR5cGUpO1xyXG4gICAgICAgICAgdmFsLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICAgIHZhbC5BdHRyID0gZXhwZWN0ZWRUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbF9vcF96aW1lcmVhZChyZXNWYWw6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgcmVzVmFsLkF0dHIgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgcmVzVmFsLlN0clZhbCA9ICcnO1xyXG4gICAgbGV0IHV0aWxJbWVKcG46IFV0aWxJbWVKcG4gPSBNYW5hZ2VyLlV0aWxJbWVKcG47XHJcbiAgICBpZiAodXRpbEltZUpwbiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgc3RySW1lUmVhZDogc3RyaW5nID0gdXRpbEltZUpwbi5TdHJJbWVSZWFkO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh1dGlsSW1lSnBuLlN0ckltZVJlYWQpKSB7XHJcbiAgICAgICAgcmVzVmFsLlN0clZhbCA9IHN0ckltZVJlYWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV2YWxfb3Bfd2luX2hlbHAoZXhwRmlsZVBhdGg6IEV4cFZhbCwgZXhwSGVscENtZDogRXhwVmFsLCBleHBIZWxwS2V5OiBFeHBWYWwsIHJlc1ZhbDogRXhwVmFsKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsZVBhdGg6IHN0cmluZyA9IGV4cEZpbGVQYXRoLlN0clZhbDtcclxuICAgIGxldCBoZWxwQ21kOiBIZWxwQ29tbWFuZCA9IDxIZWxwQ29tbWFuZD5leHBIZWxwQ21kLk1nTnVtVmFsLk5VTV8yX0xPTkcoKTtcclxuICAgIGxldCBoZWxwS2V5OiBzdHJpbmcgPSBleHBIZWxwS2V5LlN0clZhbDtcclxuICAgIHJlc1ZhbC5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIE1hbmFnZXIuU2hvd1dpbmRvd0hlbHAoZmlsZVBhdGgsIGhlbHBDbWQsIGhlbHBLZXkpO1xyXG4gICAgICByZXNWYWwuQm9vbFZhbCA9IHRydWU7XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICByZXNWYWwuQm9vbFZhbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQ29udmVydEV4cFZhbCh2YWw6IEV4cFZhbCwgZXhwZWN0ZWRUeXBlOiBTdG9yYWdlQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLlN0b3JhZ2VGbGRBbHBoYVVuaWNvZGVPckJsb2IodmFsLkF0dHIsIGV4cGVjdGVkVHlwZSkpIHtcclxuICAgICAgdGhpcy5CbG9iU3RyaW5nQ29udmVyc2lvbih2YWwsIGV4cGVjdGVkVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIFRoZSBjbGFzcyBob2xkcyBkYXRhIG9mIGEgYmFzaWMgZWxlbWVudCAoY29uc3RhbnQgb3IgdmFyaWFibGUpIHRoYXRcclxuLy8vICAgYXBwZWFycyBvciBhcmUgcmVzdWx0IG9mIGV4ZWN1dGlvbiBvZiBvcGVyYXRvclxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRXhwVmFsIHtcclxuICBBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIElzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE1nTnVtVmFsOiBOVU1fVFlQRSA9IG51bGw7XHJcbiAgU3RyVmFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIEJvb2xWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBJbmNsdWRlQmxvYlByZWZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE9yaWdpbmFsTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZlY3RvckZpZWxkOiBHdWlGaWVsZEJhc2UgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbDogYm9vbGVhbiwgbWdWYWw6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoYXR0cj86IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbD86IGJvb2xlYW4sIG1nVmFsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGF0dHIsIGlzTnVsbCwgbWdWYWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5BdHRyID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIGlzTnVsbDogYm9vbGVhbiwgbWdWYWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0KGF0dHIsIGlzTnVsbCwgbWdWYWwpO1xyXG4gIH1cclxuXHJcbiAgQ29weShzcmM6IEV4cFZhbCk6IHZvaWQge1xyXG4gICAgdGhpcy5BdHRyID0gc3JjLkF0dHI7XHJcbiAgICB0aGlzLkJvb2xWYWwgPSBzcmMuQm9vbFZhbDtcclxuICAgIHRoaXMuSW5jbHVkZUJsb2JQcmVmaXggPSBzcmMuSW5jbHVkZUJsb2JQcmVmaXg7XHJcbiAgICB0aGlzLklzTnVsbCA9IHNyYy5Jc051bGw7XHJcbiAgICB0aGlzLk1nTnVtVmFsID0gc3JjLk1nTnVtVmFsO1xyXG4gICAgdGhpcy5TdHJWYWwgPSBzcmMuU3RyVmFsO1xyXG4gICAgdGhpcy5WZWN0b3JGaWVsZCA9IHNyYy5WZWN0b3JGaWVsZDtcclxuICAgIHRoaXMuT3JpZ2luYWxOdWxsID0gc3JjLk9yaWdpbmFsTnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbnVsbGlmeVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgTnVsbGlmeSgpOiB2b2lkIHtcclxuICAgIHRoaXMuSW5pdChTdG9yYWdlQXR0cmlidXRlLk5PTkUsIHRydWUsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoYXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgaXNOdWxsOiBib29sZWFuLCBtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLkF0dHIgPSBhdHRyO1xyXG4gICAgdGhpcy5Jc051bGwgPSBpc051bGw7XHJcblxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5BdHRyKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBtZ1ZhbDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBtZ1ZhbDtcclxuICAgICAgICB0aGlzLkluY2x1ZGVCbG9iUHJlZml4ID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgdGhpcy5NZ051bVZhbCA9ICgobWdWYWwgIT09IG51bGwpID8gbmV3IE5VTV9UWVBFKG1nVmFsKSA6IG51bGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgdGhpcy5Cb29sVmFsID0gKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSAnMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5PTkU6XHJcbiAgICAgICAgdGhpcy5Cb29sVmFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5TdHJWYWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuTWdOdW1WYWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuT3JpZ2luYWxOdWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlZlY3RvckZpZWxkID0gbnVsbDtcclxuICAgICAgICB0aGlzLkluY2x1ZGVCbG9iUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuRE9UTkVUOlxyXG4gICAgICAgIC8vIEZvciBkb3RuZXQgb2JqZWN0cywgRXhwVmFsIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBvdmVybG9hZGVkIENvbnN0cnVjdG9yLlxyXG4gICAgICAgIC8vIElmIGl0IGlzIGEgYmxvYlByZWZpeCwgaXQgc2hvdWxkIGJlIGRvbmUgaGVyZS5cclxuICAgICAgICB0aGlzLlN0clZhbCA9IG1nVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIEV4cFZhbC5FeHBWYWwoKSBpbGxlZ2FsIGF0dHJpYnV0ZTogXFwnJyArIHRoaXMuQXR0ciArICdcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXRzIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgdmFsdWUgaW4gdGhlIEV4cFZhbCBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgVG9NZ1ZhbCgpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuQXR0cikge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuU3RyVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICBzdHIgPSB0aGlzLk1nTnVtVmFsLnRvWE1McmVjb3JkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICBzdHIgPSB0aGlzLkJvb2xWYWxcclxuICAgICAgICAgID8gJzEnXHJcbiAgICAgICAgICA6ICcwJztcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc3RyID0gJ1tpbGxlZ2FsIGF0dHJpYnV0ZTogJyArIHRoaXMuQXR0ciArICddJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNFbXB0eVN0cmluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5BdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSAmJiB0aGlzLlN0clZhbCA9PT0gJyc7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=