@magic-xpa/gui 4.702.0 → 4.800.0-dev000.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1100 -7518
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +2 -2
  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 +127 -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 +160 -874
  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 +3 -4
  62. package/esm2015/src/management/gui/PropTable.js +72 -183
  63. package/esm2015/src/management/gui/Property.js +40 -373
  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 +881 -7051
  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 +127 -129
  86. package/src/env/IEnvironment.d.ts +3 -0
  87. package/src/gui/GuiMgControl.d.ts +1 -0
  88. package/src/gui/PropParentInterface.d.ts +1 -1
  89. package/src/gui/low/GuiInteractive.d.ts +3 -1
  90. package/src/gui/low/Style.d.ts +0 -3
  91. package/src/management/RuntimeContextBase.d.ts +2 -0
  92. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  93. package/src/management/data/IRecord.d.ts +1 -1
  94. package/src/management/exp/ExpressionInterface.d.ts +4 -0
  95. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  96. package/src/management/gui/ControlTable.d.ts +1 -1
  97. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  98. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  99. package/src/management/gui/MgControlBase.d.ts +8 -7
  100. package/src/management/gui/MgFormBase.d.ts +6 -6
  101. package/src/management/gui/PIC.d.ts +1 -0
  102. package/src/management/gui/PropInterface.d.ts +3 -4
  103. package/src/management/gui/PropTable.d.ts +4 -5
  104. package/src/management/gui/Property.d.ts +1 -1
  105. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
  106. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
@@ -6,12 +6,9 @@ import { Events } from "../../Events";
6
6
  import { PropInterface } from "./PropInterface";
7
7
  import { GuiFormPropertyAdapter } from "./GuiFormPropertyAdapter";
8
8
  import { GuiControlPropertyAdapter } from "./GuiControlPropertyAdapter";
9
- /// <summary>
10
- /// properties table
11
- /// </summary>
12
9
  export class PropTable {
13
10
  constructor(parent_) {
14
- this._hashTab = null; // for fast access to properties
11
+ this._hashTab = null;
15
12
  this._props = null;
16
13
  this._parent = null;
17
14
  if (arguments.length === 0) {
@@ -28,75 +25,28 @@ export class PropTable {
28
25
  this.constructor_0();
29
26
  this._parent = parent_;
30
27
  }
31
- /// <summary>
32
- /// parse the properties
33
- /// </summary>
34
- /// <param name = "parentObj">reference to parent object(GuiTaskBase)</param>
35
28
  fillData(parentObj, parType, parser) {
36
- return __awaiter(this, void 0, void 0, function* () {
37
- while (yield this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
38
- }
39
- });
29
+ while (this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
30
+ }
40
31
  }
41
- /// <summary>
42
- /// For recompute: Parse the existing properties and create references to them
43
- /// </summary>
44
- /// <param name = "task">reference to the parent GuiTaskBase</param>
45
32
  fillDataByExists(task, parser) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- while (yield this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
48
- }
49
- });
33
+ while (this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
34
+ }
50
35
  }
51
- /// <summary>
52
- /// fill the inner objects of the class
53
- /// </summary>
54
- /// <param name = "foundTagName">name of tag, of object, which need be allocated</param>
55
- /// <param name = "parentObj">reference to the parent object, need be added to every Property</param>
56
- /// <returns> Manager.XmlParser.getCurrIndex(), the found object tag and ALL its subtags finish</returns>
57
36
  initInnerObjects(foundTagName, parentObj, parType, parser) {
58
- return __awaiter(this, void 0, void 0, function* () {
59
- if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
60
- let property = new Property();
61
- property.fillData(parentObj, parType, parser);
62
- yield this.addPropWithCheckExistence(property, true);
63
- }
64
- else
65
- return false;
66
- return true;
67
- });
68
- }
69
- /// <summary>
70
- /// if the property doesn't exist in the table then add it, otherwise change it
71
- /// </summary>
72
- /// <param name = "prop">the property to add</param>
73
- /// <param name = "checkExistence">if true then the property will be added if it is not already exists if false then no existence is checked and the property will not be
74
- /// added to the hashtable (use it when many instances of the same property are allowed)
75
- /// </param>
76
- addPropWithCheckExistence(prop, checkExistence) {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- if (checkExistence) {
79
- let existingProp = this._hashTab.get_Item(prop.getID());
80
- if (existingProp === null)
81
- this.addPropWithKey(prop, prop.getID());
82
- else {
83
- yield existingProp.setValue(yield prop.getValue());
84
- }
85
- }
86
- else
87
- this.addPropWithKey(prop, prop.getID());
88
- });
37
+ if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
38
+ let property = new Property();
39
+ property.fillData(parentObj, parType, parser);
40
+ this.addProp(property);
41
+ }
42
+ else
43
+ return false;
44
+ return true;
89
45
  }
90
- /// <summary>
91
- /// adding property by key
92
- /// </summary>
93
- /// <param name = "prop"></param>
94
- /// <param name = "key"></param>
95
- addPropWithKey(prop, key) {
96
- this._hashTab.set_Item(key, prop);
46
+ addProp(prop) {
47
+ this._hashTab.set_Item(prop.getID(), prop);
97
48
  this._props.push(prop);
98
49
  }
99
- /// <param name = "id"></param>
100
50
  delPropById(id) {
101
51
  if (this._props === null)
102
52
  return;
@@ -106,78 +56,66 @@ export class PropTable {
106
56
  this._hashTab.Remove(id);
107
57
  }
108
58
  }
109
- /// <summary>
110
- /// For Recompute: Fill PropTable with reference to existing PropTable
111
- /// </summary>
112
- /// <param name = "task">reference to parent GuiTaskBase</param>
113
59
  fillExistInnerObjects(nameOfFound, task, parser) {
114
- return __awaiter(this, void 0, void 0, function* () {
115
- let tokensVector = new List();
116
- let endContext = -1;
117
- if (nameOfFound == null)
118
- return false;
119
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
120
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
121
- else if (nameOfFound === XMLConstants.MG_TAG_PROP)
122
- endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
123
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
124
- GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
125
- parser.setCurrIndex2EndOfTag();
126
- return false;
60
+ let tokensVector = new List();
61
+ let endContext = -1;
62
+ if (nameOfFound == null)
63
+ return false;
64
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
65
+ endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
66
+ else if (nameOfFound === XMLConstants.MG_TAG_PROP)
67
+ endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
68
+ else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
69
+ GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
70
+ parser.setCurrIndex2EndOfTag();
71
+ return false;
72
+ }
73
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
74
+ let tag = parser.getXMLsubstring(endContext);
75
+ parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
76
+ tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
77
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
78
+ this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
79
+ parser.setCurrIndex(++endContext);
80
+ return true;
127
81
  }
128
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
129
- // last position of its tag
130
- let tag = parser.getXMLsubstring(endContext);
131
- parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
132
- tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
133
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
134
- // ditidx of Exists Control
135
- this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
136
- parser.setCurrIndex(++endContext); // to delete ">"
137
- return true;
138
- }
139
- else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
140
- if (this._parent != null) {
141
- let strPropId = this.fillName(tokensVector);
142
- let propId = NNumber.Parse(strPropId);
143
- let prop = null;
144
- if (this._parent != null)
145
- prop = yield this._parent.getProp(propId);
146
- if (prop == null)
147
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
148
- else
149
- yield this.addPropWithCheckExistence(prop, false);
150
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
151
- return true;
152
- }
82
+ else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
83
+ if (this._parent != null) {
84
+ let strPropId = this.fillName(tokensVector);
85
+ let propId = NNumber.Parse(strPropId);
86
+ let prop = null;
87
+ if (this._parent != null)
88
+ prop = this._parent.getProp(propId);
89
+ if (prop == null)
90
+ Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
153
91
  else
154
- Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
155
- }
156
- else {
157
- Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
158
- parser.setCurrIndex(++endContext);
92
+ this.addProp(prop);
93
+ parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
159
94
  return true;
160
95
  }
96
+ else
97
+ Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
161
98
  }
162
- if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
99
+ else {
100
+ Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
163
101
  parser.setCurrIndex(++endContext);
164
102
  return true;
165
103
  }
166
- else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
167
- this._parent = task.getForm();
168
- this._parent.fillName(nameOfFound);
169
- return true;
170
- }
171
- else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
172
- return false;
173
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length); // exit of bounds
104
+ }
105
+ if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
106
+ parser.setCurrIndex(++endContext);
174
107
  return true;
175
- });
108
+ }
109
+ else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
110
+ this._parent = task.getForm();
111
+ this._parent.fillName(nameOfFound);
112
+ return true;
113
+ }
114
+ else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
115
+ return false;
116
+ parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
117
+ return true;
176
118
  }
177
- /// <summary>
178
- /// Find the name of an existing Control, or of an existing Property
179
- /// </summary>
180
- /// <returns> Name of control</returns>
181
119
  fillName(tokensVector) {
182
120
  let attribute = null;
183
121
  let valueStr;
@@ -190,56 +128,29 @@ export class PropTable {
190
128
  Events.WriteExceptionToLog(NString.Format("Unrecognized attribute: '{0}'", attribute));
191
129
  return null;
192
130
  }
193
- /// <summary>
194
- /// get size of the vector props
195
- /// </summary>
196
- /// <returns> size of the props member</returns>
197
131
  getSize() {
198
132
  return this._props.length;
199
133
  }
200
- /// <summary>
201
- /// get a Property by its index in the table
202
- /// </summary>
203
- /// <param name = "idx">the index of the property</param>
204
- /// <returns> reference to the required Property</returns>
205
134
  getProp(idx) {
206
135
  if (idx < 0 || idx >= this._props.length)
207
136
  return null;
208
137
  return this._props.get_Item(idx);
209
138
  }
210
- /// <summary>
211
- /// get a Property by its id
212
- /// </summary>
213
- /// <param name = "id">of the property</param>
214
139
  getPropById(id) {
215
140
  return this._hashTab.get_Item(id);
216
141
  }
217
142
  propExists(id) {
218
143
  return this.getPropById(id) !== null;
219
144
  }
220
- /// <summary>
221
- /// set a property value. in case the table doesn't contain such property, creates a new Property object and add it to the table.
222
- /// </summary>
223
- /// <param name = "propId">the id of the property</param>
224
- /// <param name = "val">the value of the property</param>
225
- /// <param name = "parent">a reference to the parent object</param>
226
- /// <param name = "parentType">the type of the parent object</param>
227
145
  setProp(propId, val, parent, parentType) {
228
- return __awaiter(this, void 0, void 0, function* () {
229
- let prop = this.getPropById(propId);
230
- if (prop === null) {
231
- prop = new Property(propId, parent, parentType);
232
- yield this.addPropWithCheckExistence(prop, true);
233
- }
234
- prop.setValue(val);
235
- prop.setOrgValue();
236
- });
146
+ let prop = this.getPropById(propId);
147
+ if (prop === null) {
148
+ prop = new Property(propId, parent, parentType);
149
+ this.addProp(prop);
150
+ }
151
+ prop.setValue(val);
152
+ prop.setOrgValue();
237
153
  }
238
- /// <summary>
239
- /// refresh display of the properties in the Table
240
- /// </summary>
241
- /// <param name = "forceRefresh">if true, refresh is forced regardless of the previous value</param>
242
- /// <param name = "onlyRepeatableProps">if true, refreshes only repeatable tree properties</param>
243
154
  RefreshDisplay(forceRefresh, onlyRepeatableProps) {
244
155
  return __awaiter(this, void 0, void 0, function* () {
245
156
  let allPropsRefreshed = true;
@@ -254,13 +165,8 @@ export class PropTable {
254
165
  for (i = 0; i < this.getSize(); i++) {
255
166
  prop = this.getProp(i);
256
167
  try {
257
- // if this property is not repeatable in tree or table, and onlyRepeatableProps turned on
258
- // do not refresh this property
259
168
  if (onlyRepeatableProps && !Property.isRepeatableInTable(prop.getID()))
260
169
  continue;
261
- // Refresh Visible prop only after refreshing the navigation props like X, Y.
262
- // Otherwise, the control is shown on its default location first and
263
- // then moved somewhere else. And this is clearly visible.
264
170
  if (prop.getID() === PropInterface.PROP_TYPE_VISIBLE)
265
171
  visibleProps.push(prop);
266
172
  else
@@ -282,46 +188,29 @@ export class PropTable {
282
188
  return allPropsRefreshed;
283
189
  });
284
190
  }
285
- /// <summary>
286
- /// update all properties array size
287
- /// </summary>
288
- /// <param name = "newSize"></param>
289
191
  updatePrevValueArray(newSize) {
290
192
  for (let i = 0; i < this._props.length; i = i + 1) {
291
193
  let property = this._props.get_Item(i);
292
194
  property.updatePrevValueArray(newSize);
293
195
  }
294
196
  }
295
- /// <summary>
296
- /// update all properties array size
297
- /// </summary>
298
197
  resetPrevValueArray() {
299
198
  for (let i = 0; i < this._props.length; i = i + 1) {
300
199
  let property = this._props.get_Item(i);
301
200
  property.ResetPrevValueArray();
302
201
  }
303
202
  }
304
- /// <summary>
305
- /// Reset prev value at index.
306
- /// </summary>
307
203
  resetPrevValAt(index) {
308
204
  for (let i = 0; i < this._props.length; i = i + 1) {
309
205
  let property = this._props.get_Item(i);
310
206
  property.resetPrevValAt(index);
311
207
  }
312
208
  }
313
- /// <summary>
314
- /// clear prevValue array of Label property if exists
315
- /// </summary>
316
209
  clearLabelPrevValueArray() {
317
210
  let labelProperty = this.getPropById(45);
318
211
  if (labelProperty !== null)
319
212
  labelProperty.clearPrevValueArray();
320
213
  }
321
- /// <summary>
322
- /// returns control
323
- /// </summary>
324
- /// <returns></returns>
325
214
  getCtrlRef() {
326
215
  return ((this._parent instanceof GuiControlPropertyAdapter) ? this._parent : null);
327
216
  }
@@ -332,4 +221,4 @@ export class PropTable {
332
221
  }
333
222
  }
334
223
  }
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFekQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFeEUsYUFBYTtBQUNiLHNCQUFzQjtBQUN0QixjQUFjO0FBQ2QsTUFBTSxPQUFPLFNBQVM7SUFZcEIsWUFBWSxPQUE2QjtRQVZqQyxhQUFRLEdBQWdDLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUM5RSxXQUFNLEdBQW1CLElBQUksQ0FBQztRQUM5QixZQUFPLEdBQXdCLElBQUksQ0FBQztRQVUxQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQVksQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxD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WUFDakQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxhQUFhO0lBQ2IscURBQXFEO0lBQ3JELGNBQWM7SUFDZCx3QkFBd0I7UUFDdEIsSUFBSSxhQUFhLEdBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLGFBQWEsS0FBSyxJQUFJO1lBQ3hCLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxhQUFhO0lBQ2IscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCx1QkFBdUI7SUFDdkIsVUFBVTtRQUNSLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLFlBQVkseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQTRCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkQsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIYXNodGFibGUsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIEFwcGxpY2F0aW9uRXhjZXB0aW9ufSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcIi4vUHJvcGVydHlcIjtcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tIFwiLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtYbWxQYXJzZXIsIFhNTENvbnN0YW50c30gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSBcIi4uL3Rhc2tzL0d1aVRhc2tCYXNlXCI7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tIFwiLi4vLi4vRXZlbnRzXCI7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBHdWlGb3JtUHJvcGVydHlBZGFwdGVyIH0gZnJvbSBcIi4vR3VpRm9ybVByb3BlcnR5QWRhcHRlclwiO1xyXG5pbXBvcnQgeyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIH0gZnJvbSBcIi4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlclwiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBwcm9wZXJ0aWVzIHRhYmxlXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wVGFibGUge1xyXG5cclxuICBwcml2YXRlIF9oYXNoVGFiOiBIYXNodGFibGU8bnVtYmVyLCBQcm9wZXJ0eT4gPSBudWxsOyAvLyBmb3IgZmFzdCBhY2Nlc3MgdG8gcHJvcGVydGllc1xyXG4gIHByaXZhdGUgX3Byb3BzOiBMaXN0PFByb3BlcnR5PiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF86IFByb3BQYXJlbnRJbnRlcmZhY2UpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudF8/OiBQcm9wUGFyZW50SW50ZXJmYWNlKSB7XHJcblxyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShwYXJlbnRfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb3BzID0gbmV3IExpc3Q8UHJvcGVydHk+KCk7XHJcbiAgICB0aGlzLl9oYXNoVGFiID0gbmV3IEhhc2h0YWJsZTxudW1iZXIsIFByb3BlcnR5PigyMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEocGFyZW50XzogUHJvcFBhcmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudE9ialwiPnJlZmVyZW5jZSB0byBwYXJlbnQgb2JqZWN0KEd1aVRhc2tCYXNlKTwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGEocGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZvciByZWNvbXB1dGU6IFBhcnNlIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzIGFuZCBjcmVhdGUgcmVmZXJlbmNlcyB0byB0aGVtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBHdWlUYXNrQmFzZTwvcGFyYW0+XHJcbiAgYXN5bmMgZmlsbERhdGFCeUV4aXN0cyh0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmZpbGxFeGlzdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCB0YXNrLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCB0aGUgaW5uZXIgb2JqZWN0cyBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+bmFtZSBvZiB0YWcsIG9mIG9iamVjdCwgd2hpY2ggbmVlZCBiZSBhbGxvY2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50T2JqXCI+cmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0LCBuZWVkIGJlIGFkZGVkIHRvIGV2ZXJ5IFByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IE1hbmFnZXIuWG1sUGFyc2VyLmdldEN1cnJJbmRleCgpLCB0aGUgZm91bmQgb2JqZWN0IHRhZyBhbmQgQUxMIGl0cyBzdWJ0YWdzIGZpbmlzaDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSAhPT0gbnVsbCAmJiBmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gbmV3IFByb3BlcnR5KCk7XHJcbiAgICAgIHByb3BlcnR5LmZpbGxEYXRhKHBhcmVudE9iaiwgcGFyVHlwZSwgcGFyc2VyKTtcclxuICAgICAgYXdhaXQgdGhpcy5hZGRQcm9wV2l0aENoZWNrRXhpc3RlbmNlKHByb3BlcnR5LCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHRhYmxlIHRoZW4gYWRkIGl0LCBvdGhlcndpc2UgY2hhbmdlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BcIj50aGUgcHJvcGVydHkgdG8gYWRkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrRXhpc3RlbmNlXCI+aWYgdHJ1ZSB0aGVuIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGFkZGVkIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGV4aXN0cyBpZiBmYWxzZSB0aGVuIG5vIGV4aXN0ZW5jZSBpcyBjaGVja2VkIGFuZCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVcclxuICAvLy8gICBhZGRlZCB0byB0aGUgaGFzaHRhYmxlICh1c2UgaXQgd2hlbiBtYW55IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgYWxsb3dlZClcclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBhZGRQcm9wV2l0aENoZWNrRXhpc3RlbmNlKHByb3A6IFByb3BlcnR5LCBjaGVja0V4aXN0ZW5jZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGNoZWNrRXhpc3RlbmNlKSB7XHJcbiAgICAgIGxldCBleGlzdGluZ1Byb3A6IFByb3BlcnR5ID0gPFByb3BlcnR5PnRoaXMuX2hhc2hUYWIuZ2V0X0l0ZW0ocHJvcC5nZXRJRCgpKTtcclxuICAgICAgaWYgKGV4aXN0aW5nUHJvcCA9PT0gbnVsbClcclxuICAgICAgICB0aGlzLmFkZFByb3BXaXRoS2V5KHByb3AsIHByb3AuZ2V0SUQoKSk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IGV4aXN0aW5nUHJvcC5zZXRWYWx1ZShhd2FpdCBwcm9wLmdldFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuYWRkUHJvcFdpdGhLZXkocHJvcCwgcHJvcC5nZXRJRCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGRpbmcgcHJvcGVydHkgYnkga2V5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2V5XCI+PC9wYXJhbT5cclxuICBhZGRQcm9wV2l0aEtleShwcm9wOiBQcm9wZXJ0eSwga2V5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc2hUYWIuc2V0X0l0ZW0oa2V5LCBwcm9wKTtcclxuICAgIHRoaXMuX3Byb3BzLnB1c2gocHJvcCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+PC9wYXJhbT5cclxuICBkZWxQcm9wQnlJZChpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcHJvcHMgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgZXhpc3RpbmdQcm9wOiBQcm9wZXJ0eSA9IDxQcm9wZXJ0eT50aGlzLl9oYXNoVGFiLmdldF9JdGVtKGlkKTtcclxuICAgIGlmIChleGlzdGluZ1Byb3AgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcHJvcHMuUmVtb3ZlKGV4aXN0aW5nUHJvcCk7XHJcbiAgICAgIHRoaXMuX2hhc2hUYWIuUmVtb3ZlKGlkKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRm9yIFJlY29tcHV0ZTogRmlsbCBQcm9wVGFibGUgd2l0aCByZWZlcmVuY2UgdG8gZXhpc3RpbmcgUHJvcFRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gcGFyZW50IEd1aVRhc2tCYXNlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGZpbGxFeGlzdElubmVyT2JqZWN0cyhuYW1lT2ZGb3VuZDogc3RyaW5nLCB0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgfHxcclxuICAgICAgR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0VuZEZvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKG5hbWVPZkZvdW5kKSArIG5hbWVPZkZvdW5kLmxlbmd0aCk7XHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgICAvLyBkaXRpZHggb2YgRXhpc3RzIENvbnRyb2xcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSB0YXNrLmdldEN0cmwoTk51bWJlci5QYXJzZSh0aGlzLmZpbGxOYW1lKHRva2Vuc1ZlY3RvcikpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdHJQcm9wSWQ6IHN0cmluZyA9IHRoaXMuZmlsbE5hbWUodG9rZW5zVmVjdG9yKTtcclxuICAgICAgICAgIGxldCBwcm9wSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2Uoc3RyUHJvcElkKTtcclxuICAgICAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgICBwcm9wID0gYXdhaXQgdGhpcy5fcGFyZW50LmdldFByb3AocHJvcElkKTtcclxuXHJcbiAgICAgICAgICBpZiAocHJvcCA9PSBudWxsKVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBubyBwcm9wZXJ0eSB3aXRoIGlkPXswfVwiLCBzdHJQcm9wSWQpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRQcm9wV2l0aENoZWNrRXhpc3RlbmNlKHByb3AsIGZhbHNlKTtcclxuICAgICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIG1pc3NpbmcgY29udHJvbFwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBpbGxlZ2FsIHRhZyBuYW1lOiB7MH1cIiwgbmFtZU9mRm91bmQpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0Zvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudCA9IHRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAoPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnQpLmZpbGxOYW1lKG5hbWVPZkZvdW5kKTtcclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09ICgnLycgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTsgLy8gZXhpdCBvZiBib3VuZHNcclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmluZCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBDb250cm9sLCBvciBvZiBhbiBleGlzdGluZyBQcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBOYW1lIG9mIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmaWxsTmFtZSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0RJVElEWCB8fCBhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lEKVxyXG4gICAgICAgIHJldHVybiB2YWx1ZVN0cjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJ3swfSdcIiwgYXR0cmlidXRlKSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgc2l6ZSBvZiB0aGUgdmVjdG9yIHByb3BzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHNpemUgb2YgdGhlIHByb3BzIG1lbWJlcjwvcmV0dXJucz5cclxuICBnZXRTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpbmRleCBpbiB0aGUgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiByZWZlcmVuY2UgdG8gdGhlIHJlcXVpcmVkIFByb3BlcnR5PC9yZXR1cm5zPlxyXG4gIGdldFByb3AoaWR4OiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5fcHJvcHMubGVuZ3RoKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcy5nZXRfSXRlbShpZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIFByb3BlcnR5IGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPm9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcEJ5SWQoaWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIHJldHVybiA8UHJvcGVydHk+dGhpcy5faGFzaFRhYi5nZXRfSXRlbShpZCk7XHJcbiAgfVxyXG5cclxuICBwcm9wRXhpc3RzKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BCeUlkKGlkKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBwcm9wZXJ0eSB2YWx1ZS4gaW4gY2FzZSB0aGUgdGFibGUgZG9lc24ndCBjb250YWluIHN1Y2ggcHJvcGVydHksIGNyZWF0ZXMgYSBuZXcgUHJvcGVydHkgb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHRhYmxlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgaWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50XCI+YSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3Q8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50VHlwZVwiPnRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgb2JqZWN0PC9wYXJhbT5cclxuICBhc3luYyBzZXRQcm9wKHByb3BJZDogbnVtYmVyLCB2YWw6IHN0cmluZywgcGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJlbnRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICBwcm9wID0gbmV3IFByb3BlcnR5KHByb3BJZCwgcGFyZW50LCBwYXJlbnRUeXBlKTtcclxuICAgICAgYXdhaXQgdGhpcy5hZGRQcm9wV2l0aENoZWNrRXhpc3RlbmNlKHByb3AsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgcHJvcC5zZXRWYWx1ZSh2YWwpO1xyXG4gICAgcHJvcC5zZXRPcmdWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggZGlzcGxheSBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGUgVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSwgcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlcGVhdGFibGVQcm9wc1wiPmlmIHRydWUsIHJlZnJlc2hlcyBvbmx5IHJlcGVhdGFibGUgdHJlZSBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgYWxsUHJvcHNSZWZyZXNoZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5O1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZm9ybTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IG51bGw7XHJcbiAgICBsZXQgdmlzaWJsZVByb3BzOiBMaXN0PFByb3BlcnR5PiA9IG5ldyBMaXN0KCk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKVxyXG4gICAgICBmb3JtID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCkuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgIGZvcm0uY2hlY2tBbmRDcmVhdGVSb3coZm9ybS5EaXNwbGF5TGluZSk7XHJcblxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLmdldFByb3AoaSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVwZWF0YWJsZSBpbiB0cmVlIG9yIHRhYmxlLCBhbmQgb25seVJlcGVhdGFibGVQcm9wcyB0dXJuZWQgb25cclxuICAgICAgICAvLyBkbyBub3QgcmVmcmVzaCB0aGlzIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKG9ubHlSZXBlYXRhYmxlUHJvcHMgJiYgIVByb3BlcnR5LmlzUmVwZWF0YWJsZUluVGFibGUocHJvcC5nZXRJRCgpKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAvLyBSZWZyZXNoIFZpc2libGUgcHJvcCBvbmx5IGFmdGVyIHJlZnJlc2hpbmcgdGhlIG5hdmlnYXRpb24gcHJvcHMgbGlrZSBYLCBZLlxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGNvbnRyb2wgaXMgc2hvd24gb24gaXRzIGRlZmF1bHQgbG9jYXRpb24gZmlyc3QgYW5kXHJcbiAgICAgICAgLy8gdGhlbiBtb3ZlZCBzb21ld2hlcmUgZWxzZS4gQW5kIHRoaXMgaXMgY2xlYXJseSB2aXNpYmxlLlxyXG4gICAgICAgIGlmIChwcm9wLmdldElEKCkgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpXHJcbiAgICAgICAgICB2aXNpYmxlUHJvcHMucHVzaChwcm9wKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCBwcm9wLlJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaCk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIGFsbFByb3BzUmVmcmVzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93ICBleDtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVQcm9wcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IHZpc2libGVQcm9wID0gdmlzaWJsZVByb3BzW2ldO1xyXG4gICAgICBhd2FpdCB2aXNpYmxlUHJvcC5SZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxQcm9wc1JlZnJlc2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYWxsIHByb3BlcnRpZXMgYXJyYXkgc2l6ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LlJlc2V0UHJldlZhbHVlQXJyYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVzZXQgcHJldiB2YWx1ZSBhdCBpbmRleC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0UHJldlZhbEF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgcHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIHByb3BlcnR5LnJlc2V0UHJldlZhbEF0KGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2xlYXIgcHJldlZhbHVlIGFycmF5IG9mIExhYmVsIHByb3BlcnR5IGlmIGV4aXN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJMYWJlbFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgbGV0IGxhYmVsUHJvcGVydHk6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wQnlJZCg0NSk7XHJcbiAgICBpZiAobGFiZWxQcm9wZXJ0eSAhPT0gbnVsbClcclxuICAgICAgbGFiZWxQcm9wZXJ0eS5jbGVhclByZXZWYWx1ZUFycmF5KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldEN0cmxSZWYoKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyKSA/IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudCA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEluc2VydFByZXZWYWx1ZUFycmF5KGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKSB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5fcHJvcHNbaV07XHJcbiAgICAgIHByb3AuSW5zZXJ0UHJldlZhbHVlQXJyYXkoaWR4LCBjb3VudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFekQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFLeEUsTUFBTSxPQUFPLFNBQVM7SUFZcEIsWUFBWSxPQUE2QjtRQVZqQyxhQUFRLEdBQWdDLElBQUksQ0FBQztRQUM3QyxXQUFNLEdBQW1CLElBQUksQ0FBQztRQUM5QixZQUFPLEdBQXdCLElBQUksQ0FBQztRQVUxQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQVksQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFtQixFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sYUFBYSxD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ImltcG9ydCB7SGFzaHRhYmxlLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gXCIuL1Byb3BlcnR5XCI7XHJcbmltcG9ydCB7UHJvcFBhcmVudEludGVyZmFjZX0gZnJvbSBcIi4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7WG1sUGFyc2VyLCBYTUxDb25zdGFudHN9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gXCIuLi90YXNrcy9HdWlUYXNrQmFzZVwiO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSBcIi4uLy4uL0V2ZW50c1wiO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuL1Byb3BJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgR3VpRm9ybVByb3BlcnR5QWRhcHRlciB9IGZyb20gXCIuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJcIjtcclxuaW1wb3J0IHsgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB9IGZyb20gXCIuL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgcHJvcGVydGllcyB0YWJsZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUHJvcFRhYmxlIHtcclxuXHJcbiAgcHJpdmF0ZSBfaGFzaFRhYjogSGFzaHRhYmxlPG51bWJlciwgUHJvcGVydHk+ID0gbnVsbDsgLy8gZm9yIGZhc3QgYWNjZXNzIHRvIHByb3BlcnRpZXNcclxuICBwcml2YXRlIF9wcm9wczogTGlzdDxQcm9wZXJ0eT4gPSBudWxsO1xyXG4gIHByaXZhdGUgX3BhcmVudDogUHJvcFBhcmVudEludGVyZmFjZSA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnRfOiBQcm9wUGFyZW50SW50ZXJmYWNlKTtcclxuICBjb25zdHJ1Y3RvcihwYXJlbnRfPzogUHJvcFBhcmVudEludGVyZmFjZSkge1xyXG5cclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEocGFyZW50Xyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wcyA9IG5ldyBMaXN0PFByb3BlcnR5PigpO1xyXG4gICAgdGhpcy5faGFzaFRhYiA9IG5ldyBIYXNodGFibGU8bnVtYmVyLCBQcm9wZXJ0eT4oMjApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudF86IFByb3BQYXJlbnRJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRPYmpcIj5yZWZlcmVuY2UgdG8gcGFyZW50IG9iamVjdChHdWlUYXNrQmFzZSk8L3BhcmFtPlxyXG4gIGZpbGxEYXRhKHBhcmVudE9iajogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyVHlwZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJlbnRPYmosIHBhclR5cGUsIHBhcnNlcikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGb3IgcmVjb21wdXRlOiBQYXJzZSB0aGUgZXhpc3RpbmcgcHJvcGVydGllcyBhbmQgY3JlYXRlIHJlZmVyZW5jZXMgdG8gdGhlbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+cmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgR3VpVGFza0Jhc2U8L3BhcmFtPlxyXG4gIGZpbGxEYXRhQnlFeGlzdHModGFzazogR3VpVGFza0Jhc2UsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5maWxsRXhpc3RJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgdGFzaywgcGFyc2VyKSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbGwgdGhlIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPm5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudE9ialwiPnJlZmVyZW5jZSB0byB0aGUgcGFyZW50IG9iamVjdCwgbmVlZCBiZSBhZGRlZCB0byBldmVyeSBQcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBNYW5hZ2VyLlhtbFBhcnNlci5nZXRDdXJySW5kZXgoKSwgdGhlIGZvdW5kIG9iamVjdCB0YWcgYW5kIEFMTCBpdHMgc3VidGFncyBmaW5pc2g8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJlbnRPYmo6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgbGV0IHByb3BlcnR5OiBQcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eSgpO1xyXG4gICAgICBwcm9wZXJ0eS5maWxsRGF0YShwYXJlbnRPYmosIHBhclR5cGUsIHBhcnNlcik7XHJcbiAgICAgIHRoaXMuYWRkUHJvcChwcm9wZXJ0eSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZGluZyBwcm9wZXJ0eSBieSBrZXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcFwiPjwvcGFyYW0+XHJcbiAgYWRkUHJvcChwcm9wOiBQcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgdGhpcy5faGFzaFRhYi5zZXRfSXRlbShwcm9wLmdldElEKCksIHByb3ApO1xyXG4gICAgdGhpcy5fcHJvcHMucHVzaChwcm9wKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj48L3BhcmFtPlxyXG4gIGRlbFByb3BCeUlkKGlkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wcm9wcyA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBleGlzdGluZ1Byb3A6IFByb3BlcnR5ID0gPFByb3BlcnR5PnRoaXMuX2hhc2hUYWIuZ2V0X0l0ZW0oaWQpO1xyXG4gICAgaWYgKGV4aXN0aW5nUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wcm9wcy5SZW1vdmUoZXhpc3RpbmdQcm9wKTtcclxuICAgICAgdGhpcy5faGFzaFRhYi5SZW1vdmUoaWQpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGb3IgUmVjb21wdXRlOiBGaWxsIFByb3BUYWJsZSB3aXRoIHJlZmVyZW5jZSB0byBleGlzdGluZyBQcm9wVGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byBwYXJlbnQgR3VpVGFza0Jhc2U8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEV4aXN0SW5uZXJPYmplY3RzKG5hbWVPZkZvdW5kOiBzdHJpbmcsIHRhc2s6IEd1aVRhc2tCYXNlLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKVxyXG4gICAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKVxyXG4gICAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfVEVSTSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSAoJy8nICsgWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB8fFxyXG4gICAgICBHdWlGb3JtUHJvcGVydHlBZGFwdGVyLklzRW5kRm9ybVRhZyhuYW1lT2ZGb3VuZCkpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YobmFtZU9mRm91bmQpICsgbmFtZU9mRm91bmQubGVuZ3RoKTtcclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkge1xyXG4gICAgICAgIC8vIGRpdGlkeCBvZiBFeGlzdHMgQ29udHJvbFxyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHRhc2suZ2V0Q3RybChOTnVtYmVyLlBhcnNlKHRoaXMuZmlsbE5hbWUodG9rZW5zVmVjdG9yKSkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTsgLy8gdG8gZGVsZXRlIFwiPlwiXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IHN0clByb3BJZDogc3RyaW5nID0gdGhpcy5maWxsTmFtZSh0b2tlbnNWZWN0b3IpO1xyXG4gICAgICAgICAgbGV0IHByb3BJZDogbnVtYmVyID0gTk51bWJlci5QYXJzZShzdHJQcm9wSWQpO1xyXG4gICAgICAgICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ICE9IG51bGwpXHJcbiAgICAgICAgICAgIHByb3AgPSB0aGlzLl9wYXJlbnQuZ2V0UHJvcChwcm9wSWQpO1xyXG5cclxuICAgICAgICAgIGlmIChwcm9wID09IG51bGwpXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIG5vIHByb3BlcnR5IHdpdGggaWQ9ezB9XCIsIHN0clByb3BJZCkpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmFkZFByb3AocHJvcCk7XHJcbiAgICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBtaXNzaW5nIGNvbnRyb2xcIik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBQcm9wVGFibGUuZmlsbEV4aXN0SW5uZXJPYmplY3RzKCkgaWxsZWdhbCB0YWcgbmFtZTogezB9XCIsIG5hbWVPZkZvdW5kKSk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleCgrK2VuZENvbnRleHQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIuSXNGb3JtVGFnKG5hbWVPZkZvdW5kKSkge1xyXG4gICAgICB0aGlzLl9wYXJlbnQgPSB0YXNrLmdldEZvcm0oKTtcclxuICAgICAgKDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50KS5maWxsTmFtZShuYW1lT2ZGb3VuZCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSAoJy8nICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19URVJNLmxlbmd0aCk7IC8vIGV4aXQgb2YgYm91bmRzXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbmQgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgQ29udHJvbCwgb3Igb2YgYW4gZXhpc3RpbmcgUHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gTmFtZSBvZiBjb250cm9sPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbE5hbWUodG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9ESVRJRFggfHwgYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRClcclxuICAgICAgICByZXR1cm4gdmFsdWVTdHI7XHJcbiAgICB9XHJcbiAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHNpemUgb2YgdGhlIHZlY3RvciBwcm9wc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBzaXplIG9mIHRoZSBwcm9wcyBtZW1iZXI8L3JldHVybnM+XHJcbiAgZ2V0U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBQcm9wZXJ0eSBieSBpdHMgaW5kZXggaW4gdGhlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBpbmRleCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gcmVmZXJlbmNlIHRvIHRoZSByZXF1aXJlZCBQcm9wZXJ0eTwvcmV0dXJucz5cclxuICBnZXRQcm9wKGlkeDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHRoaXMuX3Byb3BzLmxlbmd0aClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvcHMuZ2V0X0l0ZW0oaWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBQcm9wZXJ0eSBieSBpdHMgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5vZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3BCeUlkKGlkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICByZXR1cm4gPFByb3BlcnR5PnRoaXMuX2hhc2hUYWIuZ2V0X0l0ZW0oaWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvcEV4aXN0cyhpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wQnlJZChpZCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcHJvcGVydHkgdmFsdWUuIGluIGNhc2UgdGhlIHRhYmxlIGRvZXNuJ3QgY29udGFpbiBzdWNoIHByb3BlcnR5LCBjcmVhdGVzIGEgbmV3IFByb3BlcnR5IG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSB0YWJsZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFR5cGVcIj50aGUgdHlwZSBvZiB0aGUgcGFyZW50IG9iamVjdDwvcGFyYW0+XHJcbiAgc2V0UHJvcChwcm9wSWQ6IG51bWJlciwgdmFsOiBzdHJpbmcsIHBhcmVudDogUHJvcFBhcmVudEludGVyZmFjZSwgcGFyZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgaWYgKHByb3AgPT09IG51bGwpIHtcclxuICAgICAgcHJvcCA9IG5ldyBQcm9wZXJ0eShwcm9wSWQsIHBhcmVudCwgcGFyZW50VHlwZSk7XHJcbiAgICAgIHRoaXMuYWRkUHJvcChwcm9wKTtcclxuICAgIH1cclxuICAgIHByb3Auc2V0VmFsdWUodmFsKTtcclxuICAgIHByb3Auc2V0T3JnVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIFRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlUmVmcmVzaFwiPmlmIHRydWUsIHJlZnJlc2ggaXMgZm9yY2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiB0cnVlLCByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoOiBib29sZWFuLCBvbmx5UmVwZWF0YWJsZVByb3BzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgbGV0IGFsbFByb3BzUmVmcmVzaGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eTtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGZvcm06IEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG4gICAgbGV0IHZpc2libGVQcm9wczogTGlzdDxQcm9wZXJ0eT4gPSBuZXcgTGlzdCgpO1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50ICE9IG51bGwgJiYgdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcilcclxuICAgICAgZm9ybSA9ICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLl9wYXJlbnQpLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICBmb3JtLmNoZWNrQW5kQ3JlYXRlUm93KGZvcm0uRGlzcGxheUxpbmUpO1xyXG5cclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBwcm9wID0gdGhpcy5nZXRQcm9wKGkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHJlcGVhdGFibGUgaW4gdHJlZSBvciB0YWJsZSwgYW5kIG9ubHlSZXBlYXRhYmxlUHJvcHMgdHVybmVkIG9uXHJcbiAgICAgICAgLy8gZG8gbm90IHJlZnJlc2ggdGhpcyBwcm9wZXJ0eVxyXG4gICAgICAgIGlmIChvbmx5UmVwZWF0YWJsZVByb3BzICYmICFQcm9wZXJ0eS5pc1JlcGVhdGFibGVJblRhYmxlKHByb3AuZ2V0SUQoKSkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLy8gUmVmcmVzaCBWaXNpYmxlIHByb3Agb25seSBhZnRlciByZWZyZXNoaW5nIHRoZSBuYXZpZ2F0aW9uIHByb3BzIGxpa2UgWCwgWS5cclxuICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBjb250cm9sIGlzIHNob3duIG9uIGl0cyBkZWZhdWx0IGxvY2F0aW9uIGZpcnN0IGFuZFxyXG4gICAgICAgIC8vIHRoZW4gbW92ZWQgc29tZXdoZXJlIGVsc2UuIEFuZCB0aGlzIGlzIGNsZWFybHkgdmlzaWJsZS5cclxuICAgICAgICBpZiAocHJvcC5nZXRJRCgpID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKVxyXG4gICAgICAgICAgdmlzaWJsZVByb3BzLnB1c2gocHJvcCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgcHJvcC5SZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2gpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICBhbGxQcm9wc1JlZnJlc2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyAgZXg7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlUHJvcHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGxldCB2aXNpYmxlUHJvcCA9IHZpc2libGVQcm9wc1tpXTtcclxuICAgICAgYXdhaXQgdmlzaWJsZVByb3AuUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWxsUHJvcHNSZWZyZXNoZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIGFsbCBwcm9wZXJ0aWVzIGFycmF5IHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHByb3BlcnR5OiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BzLmdldF9JdGVtKGkpO1xyXG4gICAgICBwcm9wZXJ0eS51cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIGFsbCBwcm9wZXJ0aWVzIGFycmF5IHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0UHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHByb3BlcnR5OiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BzLmdldF9JdGVtKGkpO1xyXG4gICAgICBwcm9wZXJ0eS5SZXNldFByZXZWYWx1ZUFycmF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlc2V0IHByZXYgdmFsdWUgYXQgaW5kZXguXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWxBdChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fcHJvcHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IHByb3BlcnR5OiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BzLmdldF9JdGVtKGkpO1xyXG4gICAgICBwcm9wZXJ0eS5yZXNldFByZXZWYWxBdChpbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNsZWFyIHByZXZWYWx1ZSBhcnJheSBvZiBMYWJlbCBwcm9wZXJ0eSBpZiBleGlzdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyTGFiZWxQcmV2VmFsdWVBcnJheSgpOiB2b2lkIHtcclxuICAgIGxldCBsYWJlbFByb3BlcnR5OiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcEJ5SWQoNDUpO1xyXG4gICAgaWYgKGxhYmVsUHJvcGVydHkgIT09IG51bGwpXHJcbiAgICAgIGxhYmVsUHJvcGVydHkuY2xlYXJQcmV2VmFsdWVBcnJheSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdHJsUmVmKCk6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIge1xyXG4gICAgcmV0dXJuICgodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcikgPyA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLl9wYXJlbnQgOiBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbnNlcnRQcmV2VmFsdWVBcnJheShpZHg6IG51bWJlciwgY291bnQ6IG51bWJlcikge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BzW2ldO1xyXG4gICAgICBwcm9wLkluc2VydFByZXZWYWx1ZUFycmF5KGlkeCwgY291bnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=