@magic-xpa/gui 4.1100.0-dev4110.106 → 4.1100.0-dev4110.107

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 (148) hide show
  1. package/README.md +7 -7
  2. package/esm2020/index.mjs +71 -2
  3. package/esm2020/src/Commands.mjs +184 -0
  4. package/esm2020/src/Events.mjs +420 -0
  5. package/esm2020/src/EventsProcessor.mjs +67 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/esm2020/src/GuiConstants.mjs +68 -0
  8. package/esm2020/src/GuiEnums.mjs +300 -0
  9. package/esm2020/src/GuiEnvironment.mjs +4 -0
  10. package/esm2020/src/IFlowMonitorQueue.mjs +2 -0
  11. package/esm2020/src/Manager.mjs +91 -0
  12. package/esm2020/src/UIBridge.mjs +32 -0
  13. package/esm2020/src/env/IEnvironment.mjs +2 -0
  14. package/esm2020/src/gui/ControlBase.mjs +3 -0
  15. package/esm2020/src/gui/GuiMgControl.mjs +125 -0
  16. package/esm2020/src/gui/GuiMgForm.mjs +4 -0
  17. package/esm2020/src/gui/KeyboardItem.mjs +135 -0
  18. package/esm2020/src/gui/LastFocusedVal.mjs +11 -0
  19. package/esm2020/src/gui/MgValue.mjs +16 -0
  20. package/esm2020/src/gui/PropParentInterface.mjs +2 -0
  21. package/esm2020/src/gui/low/DialogHandler.mjs +7 -0
  22. package/esm2020/src/gui/low/GuiCommand.mjs +66 -0
  23. package/esm2020/src/gui/low/GuiCommandQueue.mjs +35 -0
  24. package/esm2020/src/gui/low/GuiInteractive.mjs +176 -0
  25. package/esm2020/src/gui/low/Style.mjs +20 -0
  26. package/esm2020/src/management/RuntimeContextBase.mjs +43 -0
  27. package/esm2020/src/management/data/BlobType.mjs +281 -0
  28. package/esm2020/src/management/data/DcValues.mjs +214 -0
  29. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +96 -0
  30. package/esm2020/src/management/data/FieldDef.mjs +331 -0
  31. package/esm2020/src/management/data/FieldsTable.mjs +54 -0
  32. package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/esm2020/src/management/data/IRecord.mjs +2 -0
  35. package/esm2020/src/management/data/IReferencedObject.mjs +2 -0
  36. package/esm2020/src/management/data/NUM_TYPE.mjs +1741 -0
  37. package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +29 -0
  39. package/esm2020/src/management/data/RecordUtils.mjs +361 -0
  40. package/esm2020/src/management/data/VectorType.mjs +612 -0
  41. package/esm2020/src/management/data/VectorTypeBase.mjs +88 -0
  42. package/esm2020/src/management/events/IActionManager.mjs +2 -0
  43. package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
  44. package/esm2020/src/management/exp/ExpressionInterface.mjs +244 -0
  45. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +307 -0
  46. package/esm2020/src/management/gui/ControlTable.mjs +118 -0
  47. package/esm2020/src/management/gui/DisplayConvertor.mjs +1679 -0
  48. package/esm2020/src/management/gui/FieldValidator.mjs +711 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/esm2020/src/management/gui/GuiFormPropertyAdapter.mjs +11 -0
  51. package/esm2020/src/management/gui/HebrewDate.mjs +278 -0
  52. package/esm2020/src/management/gui/Helps.mjs +237 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1858 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +741 -0
  55. package/esm2020/src/management/gui/PIC.mjs +1185 -0
  56. package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
  57. package/esm2020/src/management/gui/PropInterface.mjs +245 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1356 -0
  60. package/esm2020/src/management/gui/ValidationDetails.mjs +248 -0
  61. package/esm2020/src/management/gui/ValidationDetailsBase.mjs +93 -0
  62. package/esm2020/src/management/gui/WrongFormatException.mjs +29 -0
  63. package/esm2020/src/management/tasks/GuiDataCollection.mjs +4 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +510 -0
  65. package/esm2020/src/management/tasks/IMGDataTable.mjs +2 -0
  66. package/esm2020/src/management/tasks/ITask.mjs +2 -0
  67. package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/esm2020/src/util/MemoryUtil.mjs +35 -0
  71. package/esm2020/src/util/ObjectReference.mjs +36 -0
  72. package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
  73. package/fesm2015/magic-xpa-gui.mjs +16389 -0
  74. package/fesm2015/magic-xpa-gui.mjs.map +1 -1
  75. package/fesm2020/magic-xpa-gui.mjs +16203 -0
  76. package/fesm2020/magic-xpa-gui.mjs.map +1 -1
  77. package/index.d.ts +70 -1
  78. package/package.json +2 -2
  79. package/src/Commands.d.ts +40 -0
  80. package/src/Events.d.ts +155 -0
  81. package/src/EventsProcessor.d.ts +13 -0
  82. package/src/FocusManager.d.ts +8 -0
  83. package/src/GuiConstants.d.ts +65 -0
  84. package/src/GuiEnums.d.ts +282 -0
  85. package/src/GuiEnvironment.d.ts +4 -0
  86. package/src/IFlowMonitorQueue.d.ts +3 -0
  87. package/src/Manager.d.ts +26 -0
  88. package/src/UIBridge.d.ts +16 -0
  89. package/src/env/IEnvironment.d.ts +31 -0
  90. package/src/gui/ControlBase.d.ts +4 -0
  91. package/src/gui/GuiMgControl.d.ts +38 -0
  92. package/src/gui/GuiMgForm.d.ts +3 -0
  93. package/src/gui/KeyboardItem.d.ts +18 -0
  94. package/src/gui/LastFocusedVal.d.ts +7 -0
  95. package/src/gui/MgValue.d.ts +15 -0
  96. package/src/gui/PropParentInterface.d.ts +13 -0
  97. package/src/gui/low/DialogHandler.d.ts +4 -0
  98. package/src/gui/low/GuiCommand.d.ts +37 -0
  99. package/src/gui/low/GuiCommandQueue.d.ts +13 -0
  100. package/src/gui/low/GuiInteractive.d.ts +55 -0
  101. package/src/gui/low/Style.d.ts +19 -0
  102. package/src/management/RuntimeContextBase.d.ts +23 -0
  103. package/src/management/data/BlobType.d.ts +29 -0
  104. package/src/management/data/DcValues.d.ts +33 -0
  105. package/src/management/data/DcValuesBuilderBase.d.ts +17 -0
  106. package/src/management/data/FieldDef.d.ts +53 -0
  107. package/src/management/data/FieldsTable.d.ts +16 -0
  108. package/src/management/data/GuiDataViewBase.d.ts +27 -0
  109. package/src/management/data/GuiFieldBase.d.ts +17 -0
  110. package/src/management/data/IRecord.d.ts +12 -0
  111. package/src/management/data/IReferencedObject.d.ts +5 -0
  112. package/src/management/data/NUM_TYPE.d.ts +103 -0
  113. package/src/management/data/ObjectReferenceBase.d.ts +16 -0
  114. package/src/management/data/ObjectReferencesCollection.d.ts +10 -0
  115. package/src/management/data/RecordUtils.d.ts +21 -0
  116. package/src/management/data/VectorType.d.ts +52 -0
  117. package/src/management/data/VectorTypeBase.d.ts +8 -0
  118. package/src/management/events/IActionManager.d.ts +7 -0
  119. package/src/management/events/IGuiEventsManager.d.ts +20 -0
  120. package/src/management/exp/ExpressionInterface.d.ts +242 -0
  121. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -0
  122. package/src/management/gui/ControlTable.d.ts +28 -0
  123. package/src/management/gui/DisplayConvertor.d.ts +103 -0
  124. package/src/management/gui/FieldValidator.d.ts +35 -0
  125. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -0
  126. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -0
  127. package/src/management/gui/HebrewDate.d.ts +46 -0
  128. package/src/management/gui/Helps.d.ts +51 -0
  129. package/src/management/gui/MgControlBase.d.ts +223 -0
  130. package/src/management/gui/MgFormBase.d.ts +160 -0
  131. package/src/management/gui/PIC.d.ts +108 -0
  132. package/src/management/gui/PropDefaults.d.ts +7 -0
  133. package/src/management/gui/PropInterface.d.ts +243 -0
  134. package/src/management/gui/PropTable.d.ts +33 -0
  135. package/src/management/gui/Property.d.ts +121 -0
  136. package/src/management/gui/ValidationDetails.d.ts +52 -0
  137. package/src/management/gui/ValidationDetailsBase.d.ts +14 -0
  138. package/src/management/gui/WrongFormatException.d.ts +9 -0
  139. package/src/management/tasks/GuiDataCollection.d.ts +4 -0
  140. package/src/management/tasks/GuiTaskBase.d.ts +150 -0
  141. package/src/management/tasks/IMGDataTable.d.ts +10 -0
  142. package/src/management/tasks/ITask.d.ts +6 -0
  143. package/src/management/tasks/MgTimer.d.ts +8 -0
  144. package/src/management/tasks/TaskDefinitionId.d.ts +16 -0
  145. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -0
  146. package/src/util/MemoryUtil.d.ts +6 -0
  147. package/src/util/ObjectReference.d.ts +9 -0
  148. package/src/util/UsernamePasswordCredentials.d.ts +18 -0
@@ -0,0 +1,510 @@
1
+ import { NNumber, NotImplementedException, NString, RefParam } from "@magic-xpa/mscorelib";
2
+ import { Constants, Logger_LogLevels, XMLConstants, XmlParser } from "@magic-xpa/utils";
3
+ import { PropTable } from "../gui/PropTable";
4
+ import { Property } from "../gui/Property";
5
+ import { PropInterface } from "../gui/PropInterface";
6
+ import { Commands } from "../../Commands";
7
+ import { Events } from "../../Events";
8
+ import { GuiConstants } from "../../GuiConstants";
9
+ import { GuiDataCollection } from "./GuiDataCollection";
10
+ import { CommandType, HtmlProperties } from "../../GuiEnums";
11
+ export class GuiTaskBase {
12
+ Init() {
13
+ this.DataView.Init();
14
+ }
15
+ get RouterPath() {
16
+ return this.routerPath;
17
+ }
18
+ get RouterParams() {
19
+ return this.routeParams;
20
+ }
21
+ get InDefaultRouterOutlet() {
22
+ return this.inDefaultRouterOutlet;
23
+ }
24
+ get IsBlockingBatch() {
25
+ return !this._isMainPrg && this.isOpenWin() && !this._allowEvents && !this.IsInteractive;
26
+ }
27
+ constructor() {
28
+ this._flowMonitor = null;
29
+ this._keyboardMappingState = 0xFFFF0000;
30
+ this._refreshType = "T";
31
+ this._lastParkedCtrl = null;
32
+ this._brkLevel = null;
33
+ this._brkLevelIndex = -1;
34
+ this._mainLevel = null;
35
+ this._level = "\0";
36
+ this._enteredRecLevel = false;
37
+ this._currParkedFld = null;
38
+ this.isInRecompute = false;
39
+ this.CurrentEditingControl = null;
40
+ this.shouldResumeSubformLayout = true;
41
+ this.ApplicationGuid = null;
42
+ this.ProgramIsn = 0;
43
+ this.TaskIsn = 0;
44
+ this.ContextID = 0;
45
+ this.IsSubForm = false;
46
+ this._ctlIdx = 0;
47
+ this._compIdx = 0;
48
+ this._isPrg = false;
49
+ this._isMainPrg = false;
50
+ this.IsInteractive = false;
51
+ this._taskTag = null;
52
+ this._openWin = false;
53
+ this._allowEvents = false;
54
+ this.Form = null;
55
+ this._propTab = null;
56
+ this._helpTab = null;
57
+ this.IconFileName = null;
58
+ this.IsParallel = false;
59
+ this.DataView = null;
60
+ this.ActionManager = null;
61
+ this.StudioParentTask = null;
62
+ this.routerPath = null;
63
+ this.routeParams = null;
64
+ this.inDefaultRouterOutlet = false;
65
+ this.IsSubtask = false;
66
+ this.DataViewWasRetrieved = false;
67
+ this.TaskPrefixExecuted = false;
68
+ this._nullArithmetic = Constants.NULL_ARITH_USE_DEF;
69
+ this._propTab = new PropTable(this);
70
+ }
71
+ getTaskTag() {
72
+ return this._taskTag;
73
+ }
74
+ getCtlIdx() {
75
+ return this._ctlIdx;
76
+ }
77
+ isMainProg() {
78
+ return this._isMainPrg;
79
+ }
80
+ getTopMostForm() {
81
+ let form = null;
82
+ if (this.Form !== null)
83
+ form = this.Form.getTopMostForm();
84
+ return form;
85
+ }
86
+ getCtrl(ctrlIdx) {
87
+ return this.Form.getCtrl(ctrlIdx);
88
+ }
89
+ setMode(val) {
90
+ if (this.getMode() !== val) {
91
+ this.setProp(PropInterface.PROP_TYPE_TASK_MODE, val);
92
+ if (this._flowMonitor !== null)
93
+ this._flowMonitor.addTaskCngMode(val, this.GetTaskDetails());
94
+ }
95
+ }
96
+ getMode() {
97
+ let taskMode = Constants.TASK_MODE_MODIFY;
98
+ let prop = this._propTab.getPropById(PropInterface.PROP_TYPE_TASK_MODE);
99
+ if (prop !== null) {
100
+ taskMode = prop.GetComputedValue();
101
+ }
102
+ return taskMode;
103
+ }
104
+ SetInRecompute(inRecompute) {
105
+ this.isInRecompute = inRecompute;
106
+ }
107
+ IsInRecompute() {
108
+ return this.isInRecompute;
109
+ }
110
+ resetRefreshType() {
111
+ this._refreshType = Constants.TASK_REFRESH_NONE;
112
+ }
113
+ getRefreshType() {
114
+ return this._refreshType;
115
+ }
116
+ SetRefreshType(refreshType) {
117
+ switch (refreshType) {
118
+ case Constants.TASK_REFRESH_FORM:
119
+ case Constants.TASK_REFRESH_TABLE:
120
+ case Constants.TASK_REFRESH_CURR_REC:
121
+ this._refreshType = refreshType;
122
+ break;
123
+ default:
124
+ break;
125
+ }
126
+ }
127
+ GetRouterParams() {
128
+ return this.routeParams;
129
+ }
130
+ getLastParkedCtrl() {
131
+ return this._lastParkedCtrl;
132
+ }
133
+ isOpenWin() {
134
+ return this._openWin;
135
+ }
136
+ async checkProp(propId, defaultRetVal) {
137
+ let prop = this.getProp(propId);
138
+ if (prop !== null)
139
+ return await prop.getValueBoolean();
140
+ return defaultRetVal;
141
+ }
142
+ getClickedControl() {
143
+ let clickedCtrl = Events.GetRuntimeContext(null).CurrentClickedCtrl;
144
+ if (clickedCtrl !== null && clickedCtrl.getForm().getTask() !== this)
145
+ clickedCtrl = null;
146
+ return clickedCtrl;
147
+ }
148
+ getKeyboardMappingState() {
149
+ return this._keyboardMappingState;
150
+ }
151
+ isStateEnabled(state) {
152
+ return (state & this._keyboardMappingState) > 0;
153
+ }
154
+ setKeyboardMappingState(state, on) {
155
+ this._keyboardMappingState = on
156
+ ? GuiTaskBase.mkInt(GuiTaskBase.hiShrt(this._keyboardMappingState) & ~state, GuiTaskBase.loShrt(this._keyboardMappingState) | state)
157
+ : GuiTaskBase.mkInt(GuiTaskBase.hiShrt(this._keyboardMappingState) | state, GuiTaskBase.loShrt(this._keyboardMappingState) & ~state);
158
+ }
159
+ static hiShrt(n) {
160
+ return (n & 0xffff0000) >> 16;
161
+ }
162
+ static loShrt(n) {
163
+ return n & 0x0000ffff;
164
+ }
165
+ static mkInt(n1, n2) {
166
+ return n1 << 16 | n2;
167
+ }
168
+ getHelpItem(idx) {
169
+ if (this._helpTab !== null)
170
+ return this._helpTab.getHelp(idx);
171
+ }
172
+ setProp(propId, val) {
173
+ this._propTab.setProp(propId, val, this, "T");
174
+ }
175
+ setBrkLevel(cBrkLevel, NewBrkLevelIndex) {
176
+ this._brkLevel = cBrkLevel;
177
+ this._brkLevelIndex = NewBrkLevelIndex;
178
+ this.setMainLevel(cBrkLevel);
179
+ }
180
+ getBrkLevel() {
181
+ return this._brkLevel;
182
+ }
183
+ getBrkLevelIndex() {
184
+ return this._brkLevelIndex;
185
+ }
186
+ setMainLevel(cBrkLevel) {
187
+ if (cBrkLevel !== null && cBrkLevel.length > 0) {
188
+ let level = cBrkLevel.charAt(0);
189
+ if (level === Constants.TASK_LEVEL_NONE || level === Constants.TASK_LEVEL_TASK ||
190
+ level === Constants.TASK_LEVEL_RECORD)
191
+ this._mainLevel = cBrkLevel;
192
+ }
193
+ }
194
+ getMainLevel() {
195
+ return this._mainLevel;
196
+ }
197
+ setLevel(cLevel) {
198
+ this._level = cLevel;
199
+ if (this._level === Constants.TASK_LEVEL_RECORD)
200
+ this._enteredRecLevel = true;
201
+ }
202
+ getLevel() {
203
+ return this._level;
204
+ }
205
+ setDataSynced(synced) {
206
+ }
207
+ getNullArithmetic() {
208
+ return this._nullArithmetic;
209
+ }
210
+ setLastParkedCtrl(ctrl) {
211
+ this._lastParkedCtrl = ctrl;
212
+ this._currParkedFld = ((this._lastParkedCtrl !== null)
213
+ ? this._lastParkedCtrl.getField()
214
+ : null);
215
+ this.CurrentEditingControl = ctrl;
216
+ }
217
+ getCurrField() {
218
+ return this._currParkedFld;
219
+ }
220
+ setCurrField(currField) {
221
+ this._currParkedFld = currField;
222
+ }
223
+ getCurrFieldIdx() {
224
+ if (this._currParkedFld !== null)
225
+ return this._currParkedFld.getId();
226
+ return -1;
227
+ }
228
+ getFieldByValueStr(valueStr, parent, vee) {
229
+ if (arguments.length === 1)
230
+ return this.getFieldByValueStr_0(valueStr);
231
+ else
232
+ return this.getFieldByValueStr_1(valueStr, parent, vee);
233
+ }
234
+ getFieldByValueStr_0(valueStr) {
235
+ let parent;
236
+ let vee;
237
+ let refParent = new RefParam(parent);
238
+ let refVee = new RefParam(vee);
239
+ return this.getFieldByValueStr_1(valueStr, refParent, refVee);
240
+ }
241
+ getFieldByValueStr_1(valueStr, parent, vee) {
242
+ parent.value = vee.value = 0;
243
+ let tempField = null;
244
+ let comma = valueStr.indexOf(",");
245
+ if (comma > 0) {
246
+ let parentId = NNumber.Parse(valueStr.substr(0, comma));
247
+ let fldIdx = NNumber.Parse(valueStr.substr(comma + 1));
248
+ tempField = ((parentId !== 0)
249
+ ? this.getFieldDef(parentId, fldIdx)
250
+ : this.getFieldDef(fldIdx));
251
+ parent.value = parentId;
252
+ vee.value = fldIdx;
253
+ }
254
+ return tempField;
255
+ }
256
+ getMainProgFieldByValueStr(valueStr) {
257
+ let fldIdx = NNumber.Parse(valueStr) - 1;
258
+ return this.getFieldDef(fldIdx);
259
+ }
260
+ getFieldDef(fldIdOrParent, fldIdx) {
261
+ if (arguments.length === 1)
262
+ return this.getField_0(fldIdOrParent);
263
+ else
264
+ return this.getField_1(fldIdOrParent, fldIdx);
265
+ }
266
+ getField_0(fldId) {
267
+ return this.DataView.getField(fldId);
268
+ }
269
+ async InitForm() {
270
+ if (this.Form !== null && this.isOpenWin()) {
271
+ this.Form.InInitForm = true;
272
+ await this.Form.init();
273
+ this.SetRefreshType(Constants.TASK_REFRESH_FORM);
274
+ await this.RefreshDisplay();
275
+ Commands.beginInvoke();
276
+ this.Form.InInitForm = false;
277
+ }
278
+ }
279
+ ResumeSubformLayout() {
280
+ if (this.Form !== null) {
281
+ let subFormCtrl = this.Form.getSubFormCtrl();
282
+ if (subFormCtrl !== null && this.shouldResumeSubformLayout) {
283
+ Commands.addOperationWithLine(CommandType.SET_PROPERTY, subFormCtrl, 0, HtmlProperties.Visible, subFormCtrl.isVisible());
284
+ this.shouldResumeSubformLayout = false;
285
+ }
286
+ }
287
+ }
288
+ GetLastParkedCtrlName(depth) {
289
+ let ancestor = this.GetTaskAncestor(depth);
290
+ if (ancestor === null || ancestor._lastParkedCtrl === null)
291
+ return "";
292
+ return ancestor._lastParkedCtrl.Name;
293
+ }
294
+ getForm() {
295
+ return this.Form;
296
+ }
297
+ SetForm(value) {
298
+ this.Form = value;
299
+ return value;
300
+ }
301
+ checkIfExistProp(propId) {
302
+ let exist = false;
303
+ if (this._propTab !== null) {
304
+ let prop = this._propTab.getPropById(propId);
305
+ exist = (prop !== null);
306
+ }
307
+ return exist;
308
+ }
309
+ getProp(propId) {
310
+ let prop = null;
311
+ if (this._propTab !== null) {
312
+ prop = this._propTab.getPropById(propId);
313
+ if (prop === null) {
314
+ prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_TASK, this);
315
+ if (prop !== null) {
316
+ prop.StudioValue = prop.getOrgValue();
317
+ this._propTab.addProp(prop);
318
+ }
319
+ }
320
+ }
321
+ return prop;
322
+ }
323
+ GetComputedProperty(propId) {
324
+ let prop = null;
325
+ if (this._propTab !== null)
326
+ prop = this._propTab.getPropById(propId);
327
+ return prop;
328
+ }
329
+ getCompIdx() {
330
+ return this._compIdx;
331
+ }
332
+ IsFirstRefreshOfProps() {
333
+ throw new NotImplementedException();
334
+ }
335
+ async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
336
+ let result = null;
337
+ wasEvaluated.value = false;
338
+ if (alwaysEvaluate || this.DataViewWasRetrieved) {
339
+ result = await this.CalculateExpression(expId, resType, length);
340
+ wasEvaluated.value = true;
341
+ }
342
+ return result;
343
+ }
344
+ GetExpressionStorage(expId) {
345
+ return this.GetExpressionStorage(expId);
346
+ }
347
+ async CalculateExpression(expId, resType, length) {
348
+ return Promise.resolve("");
349
+ }
350
+ isStarted() {
351
+ return true;
352
+ }
353
+ isAborting() {
354
+ return false;
355
+ }
356
+ getField_1(parent, fldIdx) {
357
+ switch (parent) {
358
+ case 0:
359
+ return this.getFieldDef(fldIdx);
360
+ case GuiTaskBase.MAIN_PRG_PARENT_ID:
361
+ let compMainProg = GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
362
+ return compMainProg.getFieldDef(fldIdx);
363
+ default:
364
+ parent--;
365
+ if (this.StudioParentTask != null)
366
+ return this.StudioParentTask.getFieldDef(parent, fldIdx);
367
+ return null;
368
+ }
369
+ }
370
+ fillAttributes(parser) {
371
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
372
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
373
+ let tag = parser.getXMLsubstring(endContext);
374
+ parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_TASK) + XMLConstants.MG_TAG_TASK.length);
375
+ let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
376
+ for (let j = 0; j < tokens.length; j = j + 2) {
377
+ let attribute = tokens.get_Item(j);
378
+ let valueStr = tokens.get_Item(j + 1);
379
+ if (!this.setAttribute(attribute, valueStr) && Events.ShouldLog(Logger_LogLevels.Development))
380
+ Events.WriteDevToLog(NString.Format("In TaskBase.fillAttributes(): Unprocessed(!) attribute: '{0}' = '{1}'", attribute, valueStr));
381
+ }
382
+ parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) + 1);
383
+ }
384
+ }
385
+ setAttribute(attribute, valueStr) {
386
+ let isTagProcessed = true;
387
+ switch (attribute) {
388
+ case XMLConstants.MG_ATTR_APPL_GUID:
389
+ this.ApplicationGuid = valueStr;
390
+ break;
391
+ case XMLConstants.MG_ATTR_PROGRAM_ISN:
392
+ this.ProgramIsn = NNumber.Parse(valueStr);
393
+ break;
394
+ case XMLConstants.MG_ATTR_TASK_ISN:
395
+ this.TaskIsn = NNumber.Parse(valueStr);
396
+ break;
397
+ case XMLConstants.MG_ATTR_TOOLKIT_PARENT_TASK:
398
+ if (NNumber.Parse(valueStr) !== 0)
399
+ this.StudioParentTask = GuiDataCollection.MGDataTable.GetTaskByID(valueStr);
400
+ this.IsSubtask = true;
401
+ break;
402
+ case XMLConstants.MG_ATTR_TASKID:
403
+ this.setTaskId(valueStr);
404
+ if (Events.ShouldLog(Logger_LogLevels.Development))
405
+ Events.WriteDevToLog("TASK: " + this._taskTag);
406
+ break;
407
+ case XMLConstants.MG_ATTR_CTL_IDX:
408
+ this.setCtlAndCompIdx(valueStr);
409
+ break;
410
+ case XMLConstants.MG_ATTR_MAINPRG:
411
+ this.setMainPrg(valueStr);
412
+ break;
413
+ case XMLConstants.MG_ATTR_NULL_ARITHMETIC:
414
+ this.setNullArithmetic(valueStr);
415
+ break;
416
+ case XMLConstants.MG_ATTR_INTERACTIVE:
417
+ this.setIsInteracive(valueStr);
418
+ break;
419
+ case XMLConstants.MG_ATTR_OPEN_WIN:
420
+ this.setOpenWin(valueStr);
421
+ break;
422
+ case XMLConstants.MG_ATTR_ALLOW_EVENTS:
423
+ this.SetAllowEvents(valueStr);
424
+ break;
425
+ case XMLConstants.MG_ATTR_ISPRG:
426
+ this.setIsPrg(valueStr);
427
+ break;
428
+ case XMLConstants.MG_ATTR_ICON_FILE_NAME:
429
+ this.IconFileName = valueStr;
430
+ break;
431
+ case XMLConstants.MG_ATTR_PARALLEL:
432
+ this.IsParallel = XmlParser.getBoolean(valueStr);
433
+ break;
434
+ case XMLConstants.MG_ATTR_ROUTER_PATH:
435
+ if (valueStr.trim() != "")
436
+ this.routerPath = valueStr;
437
+ break;
438
+ case XMLConstants.MG_ATTR_IN_DEFAULT_ROUTER_OUTLET:
439
+ this.inDefaultRouterOutlet = XmlParser.getBoolean(valueStr);
440
+ break;
441
+ default:
442
+ isTagProcessed = false;
443
+ break;
444
+ }
445
+ return isTagProcessed;
446
+ }
447
+ FormInitData(parentForm) {
448
+ let alreadySetParentForm = false;
449
+ let refAlreadySetParentForm = new RefParam(alreadySetParentForm);
450
+ if (this.Form === null)
451
+ this.Form = this.ConstructMgForm(refAlreadySetParentForm);
452
+ if (!alreadySetParentForm)
453
+ this.Form.ParentForm = parentForm;
454
+ if (Events.ShouldLog(Logger_LogLevels.Development))
455
+ Events.WriteDevToLog("form");
456
+ this.Form.fillData(this);
457
+ return this.Form;
458
+ }
459
+ setTaskId(valueStr) {
460
+ this._taskTag = valueStr;
461
+ }
462
+ setCtlAndCompIdx(valueStr) {
463
+ let i = valueStr.indexOf(",");
464
+ if (i > -1) {
465
+ this._ctlIdx = NNumber.Parse(valueStr.substr(0, i));
466
+ this._compIdx = NNumber.Parse(valueStr.substr(i + 1));
467
+ }
468
+ }
469
+ GetAncestorTaskContainingForm() {
470
+ let parentTask = this.GetTaskAncestor(1);
471
+ while (parentTask !== null && parentTask.getForm() === null) {
472
+ parentTask = parentTask.GetTaskAncestor(1);
473
+ }
474
+ return parentTask;
475
+ }
476
+ setMainPrg(valueStr) {
477
+ this._isMainPrg = XmlParser.getBoolean(valueStr);
478
+ }
479
+ setNullArithmetic(valueStr) {
480
+ this._nullArithmetic = valueStr.charAt(0);
481
+ }
482
+ setIsInteracive(valueStr) {
483
+ this.IsInteractive = XmlParser.getBoolean(valueStr);
484
+ }
485
+ setOpenWin(valueStr) {
486
+ this._openWin = XmlParser.getBoolean(valueStr);
487
+ }
488
+ SetOpenWin(valuebool) {
489
+ this._openWin = valuebool;
490
+ }
491
+ SetAllowEvents(valueStr) {
492
+ this._allowEvents = XmlParser.getBoolean(valueStr);
493
+ }
494
+ setIsPrg(valueStr) {
495
+ this._isPrg = XmlParser.getBoolean(valueStr);
496
+ }
497
+ ShouldEvaluatePropertyLocally(propId) {
498
+ return false;
499
+ }
500
+ WriteToMessagePane(msg) {
501
+ if (msg != null)
502
+ console.log(msg);
503
+ }
504
+ WriteToMessagePanebyMsgId(msgId) {
505
+ let msg = Events.GetMessageString(msgId);
506
+ this.WriteToMessagePane(msg);
507
+ }
508
+ }
509
+ GuiTaskBase.MAIN_PRG_PARENT_ID = 32768;
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3VpVGFza0Jhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvdGFza3MvR3VpVGFza0Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFPLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDL0YsT0FBTyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBb0IsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBT3hHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUkzQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzdELE1BQU0sT0FBZ0IsV0FBVztJQTZDeEIsSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxx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U3RyaW5nLCBSZWZQYXJhbX0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7Q29uc3RhbnRzLCBMb2dnZXJfTG9nTGV2ZWxzLCBTdG9yYWdlQXR0cmlidXRlLCBYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtJVGFza30gZnJvbSBcIi4vSVRhc2tcIjtcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tIFwiLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtJRmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uLy4uL0lGbG93TW9uaXRvclF1ZXVlXCI7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSBcIi4uL2d1aS9NZ0NvbnRyb2xCYXNlXCI7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tIFwiLi4vZGF0YS9HdWlGaWVsZEJhc2VcIjtcclxuaW1wb3J0IHtNZ0Zvcm1CYXNlfSBmcm9tIFwiLi4vZ3VpL01nRm9ybUJhc2VcIjtcclxuaW1wb3J0IHtQcm9wVGFibGV9IGZyb20gXCIuLi9ndWkvUHJvcFRhYmxlXCI7XHJcbmltcG9ydCB7SGVscHMsIE1hZ2ljSGVscH0gZnJvbSBcIi4uL2d1aS9IZWxwc1wiO1xyXG5pbXBvcnQge0d1aURhdGFWaWV3QmFzZX0gZnJvbSBcIi4uL2RhdGEvR3VpRGF0YVZpZXdCYXNlXCI7XHJcbmltcG9ydCB7SUFjdGlvbk1hbmFnZXJ9IGZyb20gXCIuLi9ldmVudHMvSUFjdGlvbk1hbmFnZXJcIjtcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcIi4uL2d1aS9Qcm9wZXJ0eVwiO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuLi9ndWkvUHJvcEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0ZpZWxkRGVmfSBmcm9tIFwiLi4vZGF0YS9GaWVsZERlZlwiO1xyXG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tIFwiLi4vLi4vQ29tbWFuZHNcIjtcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gXCIuLi8uLi9FdmVudHNcIjtcclxuaW1wb3J0IHtHdWlDb25zdGFudHN9IGZyb20gXCIuLi8uLi9HdWlDb25zdGFudHNcIjtcclxuaW1wb3J0IHtHdWlEYXRhQ29sbGVjdGlvbn0gZnJvbSBcIi4vR3VpRGF0YUNvbGxlY3Rpb25cIjtcclxuaW1wb3J0IHsgQ29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL0d1aUVudW1zXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyB0YXNrIHByb3BlcnRpZXMgKCsgZmV3IGFjY2VzcyBtZXRob2RzKSByZXF1aXJlZCBhbmQgcmVsZXZhbnQgZm9yIHRoZSBHVUkgbmFtZXNwYWNlLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR3VpVGFza0Jhc2UgaW1wbGVtZW50cyBJVGFzaywgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBNQUlOX1BSR19QQVJFTlRfSUQ6IG51bWJlciA9IDMyNzY4O1xyXG4gIF9mbG93TW9uaXRvcjogSUZsb3dNb25pdG9yUXVldWUgPSBudWxsO1xyXG4gIHByaXZhdGUgX2tleWJvYXJkTWFwcGluZ1N0YXRlOiBudW1iZXIgPSAweEZGRkYwMDAwO1xyXG4gIF9yZWZyZXNoVHlwZTogc3RyaW5nID0gXCJUXCI7XHJcbiAgX2xhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9icmtMZXZlbDogc3RyaW5nID0gbnVsbDsgLy8gdGhlIHJ1bnRpbWUgbGV2ZWwgKFJlY29yZCAgU3VmZml4LCBHdWlUYXNrQmFzZSBQcmVmaXgsIGV0Yy4pXHJcbiAgcHJpdmF0ZSBfYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfbWFpbkxldmVsOiBzdHJpbmcgPSBudWxsOyAvLyB0aGUgcnVudGltZSBtYWlubGV2ZWxcclxuICBwcml2YXRlIF9sZXZlbDogc3RyaW5nID0gXCJcXDBcIjsgLy8gJ0MnID0gaW4gY29udHJvbCwgJ1InID0gaW4gcmVjb3JkIChvdXQgb2YgY29udHJvbCksICdUJyA9IGluIHRhc2sgKG91dCBvZiByZWNvcmQpXHJcbiAgX2VudGVyZWRSZWNMZXZlbDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIG9ubHkgaWYgdGhlIHRhc2sgd2FzIGV2ZXIgbW92ZWQgdG8gcmVjb3JkIGxldmVsLlxyXG4gIF9jdXJyUGFya2VkRmxkOiBHdWlGaWVsZEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgaXNJblJlY29tcHV0ZSA9IGZhbHNlO1xyXG4gIC8vIFRoaXMgZmxhZyByZXByZXNlbnRzIHRoZSBjdXJyZW50IGVkaXRpbmcgY29udHJvbC5cclxuICAvLyBJdCBpcyByZXNldCB0byBudWxsIHdoZW4gd2UgYXJlIGluIGJldHdlZW4gc2V0dGluZyB0aGUgZm9jdXMgYW5kIG9uY2Ugd2Ugc2V0IHRoZSBmb2N1cyB0byBjb250cm9sIHRoZW4gd2Ugc2V0IHRoaXMgZmxhZyB0byBjdXJyZW50IGZvY3VzZWQgY29udHJvbC5cclxuICBDdXJyZW50RWRpdGluZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgc2hvdWxkUmVzdW1lU3ViZm9ybUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQXBwbGljYXRpb25HdWlkOiBzdHJpbmcgPSBudWxsO1xyXG4gIFByb2dyYW1Jc246IG51bWJlciA9IDA7XHJcbiAgVGFza0lzbjogbnVtYmVyID0gMDtcclxuICBDb250ZXh0SUQ6IG51bWJlciA9IDA7XHJcbiAgSXNTdWJGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2N0bElkeDogbnVtYmVyID0gMDtcclxuICBfY29tcElkeDogbnVtYmVyID0gMDtcclxuICBfaXNQcmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfaXNNYWluUHJnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNJbnRlcmFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF90YXNrVGFnOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9vcGVuV2luOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICBfcHJvcFRhYjogUHJvcFRhYmxlID0gbnVsbDtcclxuICBfaGVscFRhYjogSGVscHMgPSBudWxsO1xyXG4gIF9udWxsQXJpdGhtZXRpYzogc3RyaW5nO1xyXG4gIEljb25GaWxlTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgSXNQYXJhbGxlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIERhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSBudWxsO1xyXG4gIEFjdGlvbk1hbmFnZXI6IElBY3Rpb25NYW5hZ2VyID0gbnVsbDtcclxuICBTdHVkaW9QYXJlbnRUYXNrOiBHdWlUYXNrQmFzZSA9IG51bGw7IC8vIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJ0YXNrIGJ5IHRvb2xraXQgdHJlZS5cclxuXHJcbiAgcHJpdmF0ZSByb3V0ZXJQYXRoOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByb3RlY3RlZCByb3V0ZVBhcmFtczogTGlzdDxhbnk+ID0gbnVsbDtcclxuICBwcml2YXRlIGluRGVmYXVsdFJvdXRlck91dGxldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFJvdXRlclBhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJvdXRlclBhdGg7XHJcbiAgfVxyXG5cclxuICBnZXQgUm91dGVyUGFyYW1zKCk6IExpc3Q8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBJbkRlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbkRlZmF1bHRSb3V0ZXJPdXRsZXQ7XHJcbiAgfVxyXG5cclxuICBJc1N1YnRhc2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBEYXRhVmlld1dhc1JldHJpZXZlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSB2aWV3IHdhcyByZXRyaWV2ZWQsIGkuZS4gaXQgaXMgcG9zc2libGUgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnNcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBwcmVmaXggd2FzIHBlcmZvcm1lZCBmb3IgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUYXNrUHJlZml4RXhlY3V0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrIHNob3VsZCBibG9jayBhY3RpdmF0aW9uIG9mIGl0cyBhY3Nlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBJc0Jsb2NraW5nQmF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2lzTWFpblByZyAmJiB0aGlzLmlzT3BlbldpbigpICYmICF0aGlzLl9hbGxvd0V2ZW50cyAmJiAhdGhpcy5Jc0ludGVyYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9udWxsQXJpdGhtZXRpYyA9IENvbnN0YW50cy5OVUxMX0FSSVRIX1VTRV9ERUY7XHJcbiAgICB0aGlzLl9wcm9wVGFiID0gbmV3IFByb3BUYWJsZSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGFzayBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tUYWc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdGwgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdGxJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdGxJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayBpcyBhIG1haW4gcHJvZ3JhbSBvZiBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBjb21wb25lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzTWFpblByb2coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNNYWluUHJnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBtZ2Zvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbClcclxuICAgICAgZm9ybSA9IHRoaXMuRm9ybS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG4gICAgLy8gZWxzZVxyXG4gICAgLy8gQXNzZXJ0IHNob3VsZCBub3QgYmUgaGVyZSBiZWNhdXNlIHdlIGhhdmUgZGlmZmVyZW50IGNvbmRpdGlvbnMgZm9yIFJDICYgT0wuXHJcbiAgICAvLyBPdGhlciB0aGVuIE1haW4gUHJvZ3JhbSwgdGFzaydzIGZvcm0gc2hvdWxkIG5vdCBiZSBudWxsLlxyXG4gICAgLy8gRGVidWcuQXNzZXJ0KGlzTWFpblByb2coKSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcmVxdWVzdGVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN0cmwoY3RybElkeDogbnVtYmVyKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtLmdldEN0cmwoY3RybElkeCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIHRoZSBjdXJyZW50IHRhc2sgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+bmV3IHRhc2sgbW9kZTwvcGFyYW0+XHJcbiAgc2V0TW9kZSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0TW9kZSgpICE9PSB2YWwpIHtcclxuICAgICAgdGhpcy5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSwgdmFsKTtcclxuICAgICAgaWYgKHRoaXMuX2Zsb3dNb25pdG9yICE9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuX2Zsb3dNb25pdG9yLmFkZFRhc2tDbmdNb2RlKHZhbCwgdGhpcy5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0YXNrIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE1vZGUoKTogc3RyaW5nIHtcclxuICAgIGxldCB0YXNrTW9kZTogc3RyaW5nID0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlk7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICB0YXNrTW9kZSA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgU2V0SW5SZWNvbXB1dGUoaW5SZWNvbXB1dGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNJblJlY29tcHV0ZSA9IGluUmVjb21wdXRlO1xyXG4gIH1cclxuXHJcbiAgSXNJblJlY29tcHV0ZSgpIDogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luUmVjb21wdXRlO1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgcmVmcmVzaCB0eXBlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFJlZnJlc2hUeXBlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX05PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJlZnJlc2ggdHlwZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRSZWZyZXNoVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmVmcmVzaCB0eXBlIGZvciB0aGUgbmV4dCBSZWZyZXNoRGlzcGxheSgpIGNhbGxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaFR5cGVcIj50aGUgbmV3IHJlZnJlc2ggdHlwZTwvcGFyYW0+XHJcbiAgU2V0UmVmcmVzaFR5cGUocmVmcmVzaFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChyZWZyZXNoVHlwZSkge1xyXG4gICAgICBjYXNlIENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STTpcclxuICAgICAgY2FzZSBDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFOlxyXG4gICAgICBjYXNlIENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUM6XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaFR5cGUgPSByZWZyZXNoVHlwZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRSb3V0ZXJQYXJhbXMoKTogTGlzdDxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBsYXN0IHBhcmtlZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UGFya2VkQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9sYXN0UGFya2VkQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBvcGVuIHdpbmRvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNPcGVuV2luKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZW5XaW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyByZXR1cm5zIGl0cyBib29sZWFuIHZhbHVlIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPmlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdDwvcGFyYW0+XHJcbiAgYXN5bmMgY2hlY2tQcm9wKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIHJldHVybiBkZWZhdWx0UmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNsaWNrZWQgY29udHJvbCBvbiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2xpY2tlZENvbnRyb2woKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY2xpY2tlZEN0cmw6IE1nQ29udHJvbEJhc2UgPSBFdmVudHMuR2V0UnVudGltZUNvbnRleHQobnVsbCkuQ3VycmVudENsaWNrZWRDdHJsO1xyXG5cclxuICAgIGlmIChjbGlja2VkQ3RybCAhPT0gbnVsbCAmJiBjbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpICE9PSB0aGlzKVxyXG4gICAgICBjbGlja2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgcmV0dXJuIGNsaWNrZWRDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBrZXlib2FyZE1hcHBpbmdTdGF0ZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0S2V5Ym9hcmRNYXBwaW5nU3RhdGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3RhdGUgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1N0YXRlRW5hYmxlZChzdGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHN0YXRlICYgdGhpcy5fa2V5Ym9hcmRNYXBwaW5nU3RhdGUpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXRzIHRoZSBzdGF0ZSBvbi9vZmZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25cIj48L3BhcmFtPlxyXG4gIHNldEtleWJvYXJkTWFwcGluZ1N0YXRlKHN0YXRlOiBudW1iZXIsIG9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZSA9IG9uXHJcbiAgICAgID8gR3VpVGFza0Jhc2UubWtJbnQoR3VpVGFza0Jhc2UuaGlTaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSAmIH5zdGF0ZSwgR3VpVGFza0Jhc2UubG9TaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSB8IHN0YXRlKVxyXG4gICAgICA6IEd1aVRhc2tCYXNlLm1rSW50KEd1aVRhc2tCYXNlLmhpU2hydCh0aGlzLl9rZXlib2FyZE1hcHBpbmdTdGF0ZSkgfCBzdGF0ZSwgR3VpVGFza0Jhc2UubG9TaHJ0KHRoaXMuX2tleWJvYXJkTWFwcGluZ1N0YXRlKSAmIH5zdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaGlnaGVyIGhhbGYgb2YgdGhlIGludGVnZXI8L3JldHVybnM+XHJcbiAgc3RhdGljIGhpU2hydChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChuICYgMHhmZmZmMDAwMCkgPj4gMTY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbG93IGhhbGYgb2YgdGhlIGludGVnZXI8L3JldHVybnM+XHJcbiAgc3RhdGljIGxvU2hydChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIG4gJiAweDAwMDBmZmZmO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuMVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuMlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB1bml0ZXMgbG93IGhhbHZlcyBvZiAyIGludGVnZXJzIC8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgbWtJbnQobjE6IG51bWJlciwgbjI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbjEgPDwgMTYgfCBuMjtcclxuICB9XHJcblxyXG4gIGdldEhlbHBJdGVtKGlkeDogbnVtYmVyKTogTWFnaWNIZWxwIHtcclxuICAgIGlmICh0aGlzLl9oZWxwVGFiICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5faGVscFRhYi5nZXRIZWxwKGlkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgcHJvcGVydHkgb2YgdGhlIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBzZXRQcm9wKHByb3BJZDogbnVtYmVyLCB2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvcFRhYi5zZXRQcm9wKHByb3BJZCwgdmFsLCB0aGlzLCBcIlRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBydW50aW1lIGxldmVsIG9mIHRoZSB0YXNrIChSZWNvcmQgU3VmZml4LCBHdWlUYXNrQmFzZSBQcmVmaXgsIGV0Yy4pXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRCcmtMZXZlbChjQnJrTGV2ZWw6IHN0cmluZywgTmV3QnJrTGV2ZWxJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9icmtMZXZlbCA9IGNCcmtMZXZlbDtcclxuICAgIHRoaXMuX2Jya0xldmVsSW5kZXggPSBOZXdCcmtMZXZlbEluZGV4O1xyXG5cclxuICAgIHRoaXMuc2V0TWFpbkxldmVsKGNCcmtMZXZlbCk7IC8vIFVwZGF0ZSB0aGUgTWFpbkxldmVsIGFjY29yZGluZyB0byB0aGUgbmV3IExldmVsXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcnVudGltZSBsZXZlbCBvZiB0aGUgdGFzayAoUmVjb3JkIFN1ZmZpeCwgR3VpVGFza0Jhc2UgUHJlZml4LCBldGMuKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0QnJrTGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9icmtMZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGlkIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGluZyBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBpbnQgaWQgb2YgdGhlIGN1cnJlbnQgZXhlY3V0aW5nIGhhbmRsZXI8L3JldHVybnM+XHJcbiAgZ2V0QnJrTGV2ZWxJbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jya0xldmVsSW5kZXg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBydW50aW1lIG1haW5sZXZlbCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TWFpbkxldmVsKGNCcmtMZXZlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoY0Jya0xldmVsICE9PSBudWxsICYmIGNCcmtMZXZlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBsZXZlbDogc3RyaW5nID0gY0Jya0xldmVsLmNoYXJBdCgwKTtcclxuICAgICAgLyogdGhlbiBNQUlOTEVWRUwgaXMgdXBkYXRlZCBvbmx5IGlmIHRoZSBhY3R1YWwgTGV2ZWwgaXMgYSBUQVNLIG9yIFJFQ09SRCAoIG9yIG5vbmUgKSBsZXZlbCAqL1xyXG4gICAgICBpZiAobGV2ZWwgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX05PTkUgfHwgbGV2ZWwgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgfHxcclxuICAgICAgICBsZXZlbCA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKVxyXG4gICAgICAgIHRoaXMuX21haW5MZXZlbCA9IGNCcmtMZXZlbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJ1bnRpbWUgbWFpbmxldmVsIG9mIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNYWluTGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9tYWluTGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBsZXZlbCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjTGV2ZWxcIj4nQycgPSBpbiBjb250cm9sLCAnUicgPSBpbiByZWNvcmQgKG91dCBvZiBjb250cm9sKSwgJ1QnID0gaW4gdGFzayAob3V0IG9mIHJlY29yZCkgICAgICAvLy8gPC9wYXJhbT5cclxuICBzZXRMZXZlbChjTGV2ZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fbGV2ZWwgPSBjTGV2ZWw7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xldmVsID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2VudGVyZWRSZWNMZXZlbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsZXZlbCBvZiB0aGUgdGFzazogJ0MnID0gaW4gY29udHJvbCwgJ1InID0gaW4gcmVjb3JkIChvdXQgb2YgY29udHJvbCksICdUJyA9IGluIHRhc2sgKG91dCBvZiByZWNvcmQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgRGF0YVN5bmNlZCBwcm9wZXJ0eSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREYXRhU3luY2VkKHN5bmNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc2NoZW1lIGZvciBudWxsIGFyaXRobWV0aWNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE51bGxBcml0aG1ldGljKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbnVsbEFyaXRobWV0aWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBsYXN0IHBhcmtlZCBjb250cm9sIGluIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+bGFzdCBmb2N1c2VkIGNvbnRyb2w8L3BhcmFtPlxyXG4gIHNldExhc3RQYXJrZWRDdHJsKGN0cmw6IE1nQ29udHJvbEJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xhc3RQYXJrZWRDdHJsID0gY3RybDtcclxuICAgIHRoaXMuX2N1cnJQYXJrZWRGbGQgPSAoKHRoaXMuX2xhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICA/IHRoaXMuX2xhc3RQYXJrZWRDdHJsLmdldEZpZWxkKClcclxuICAgICAgOiBudWxsKTtcclxuICAgIHRoaXMuQ3VycmVudEVkaXRpbmdDb250cm9sID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgY3VycmVudCBmaWVsZCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckZpZWxkKCk6IEd1aUZpZWxkQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclBhcmtlZEZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY3VycmVudCBmaWVsZCBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q3VyckZpZWxkKGN1cnJGaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUGFya2VkRmxkID0gY3VyckZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaWVsZCBvZiB0aGUgY3VycmVudCBwYXJrZWQgY29udHJvbCBvciAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGRJZHgoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLl9jdXJyUGFya2VkRmxkICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fY3VyclBhcmtlZEZsZC5nZXRJZCgpO1xyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyOiBzdHJpbmcpOiBGaWVsZERlZjtcclxuICBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZywgcGFyZW50OiBSZWZQYXJhbTxudW1iZXI+LCB2ZWU6IFJlZlBhcmFtPG51bWJlcj4pOiBGaWVsZERlZjtcclxuICBnZXRGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZywgcGFyZW50PzogUmVmUGFyYW08bnVtYmVyPiwgdmVlPzogUmVmUGFyYW08bnVtYmVyPik6IEZpZWxkRGVmIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHJfMCh2YWx1ZVN0cik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkQnlWYWx1ZVN0cl8xKHZhbHVlU3RyLCBwYXJlbnQsIHZlZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkQnlWYWx1ZVN0cl8wKHZhbHVlU3RyOiBzdHJpbmcpOiBGaWVsZERlZiB7XHJcbiAgICBsZXQgcGFyZW50OiBudW1iZXI7XHJcbiAgICBsZXQgdmVlOiBudW1iZXI7XHJcbiAgICBsZXQgcmVmUGFyZW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKHBhcmVudCk7XHJcbiAgICBsZXQgcmVmVmVlOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKHZlZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEJ5VmFsdWVTdHJfMSh2YWx1ZVN0ciwgcmVmUGFyZW50LCByZWZWZWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGZpZWxkIGJ5ICd2YWx1ZVN0cidcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRCeVZhbHVlU3RyXzEodmFsdWVTdHI6IHN0cmluZywgcGFyZW50OiBSZWZQYXJhbTxudW1iZXI+LCB2ZWU6IFJlZlBhcmFtPG51bWJlcj4pOiBGaWVsZERlZiB7XHJcbiAgICBwYXJlbnQudmFsdWUgPSB2ZWUudmFsdWUgPSAwO1xyXG4gICAgbGV0IHRlbXBGaWVsZDogRmllbGREZWYgPSBudWxsO1xyXG4gICAgbGV0IGNvbW1hOiBudW1iZXIgPSB2YWx1ZVN0ci5pbmRleE9mKFwiLFwiKTtcclxuICAgIGlmIChjb21tYSA+IDApIHtcclxuICAgICAgbGV0IHBhcmVudElkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cigwLCBjb21tYSkpO1xyXG4gICAgICBsZXQgZmxkSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cihjb21tYSArIDEpKTtcclxuICAgICAgdGVtcEZpZWxkID0gKChwYXJlbnRJZCAhPT0gMClcclxuICAgICAgICA/IHRoaXMuZ2V0RmllbGREZWYocGFyZW50SWQsIGZsZElkeClcclxuICAgICAgICA6IHRoaXMuZ2V0RmllbGREZWYoZmxkSWR4KSk7XHJcbiAgICAgIHBhcmVudC52YWx1ZSA9IHBhcmVudElkO1xyXG4gICAgICB2ZWUudmFsdWUgPSBmbGRJZHg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcEZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGZpZWxkIGZyb20gYSAxLWJhc2VkIG1haW4gcHJvZyBhcmd1bWVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TWFpblByb2dGaWVsZEJ5VmFsdWVTdHIodmFsdWVTdHI6IHN0cmluZyk6IEZpZWxkRGVmIHtcclxuICAgIC8vIHN0cmluZyBpcyAxLWJhc2VkIC0gbmVlZCB0byBzdWJ0cmFjdCAxIHRvIGdldCB0byAwLWJhc2VkIHZhbHVlXHJcbiAgICBsZXQgZmxkSWR4OiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKSAtIDE7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZERlZihmbGRJZHgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGREZWYoZmxkSWQ6IG51bWJlcik6IEZpZWxkRGVmO1xyXG4gIGdldEZpZWxkRGVmKHBhcmVudDogbnVtYmVyLCBmbGRJZHg6IG51bWJlcik6IEZpZWxkRGVmO1xyXG4gIGdldEZpZWxkRGVmKGZsZElkT3JQYXJlbnQ6IG51bWJlciwgZmxkSWR4PzogbnVtYmVyKTogRmllbGREZWYge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkXzAoZmxkSWRPclBhcmVudCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkXzEoZmxkSWRPclBhcmVudCwgZmxkSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+aWQgb2YgdGhlIGZpZWxkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZF8wKGZsZElkOiBudW1iZXIpOiBGaWVsZERlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5EYXRhVmlldy5nZXRGaWVsZChmbGRJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBJbml0Rm9ybSgpIHtcclxuICAgIGlmICh0aGlzLkZvcm0gIT09IG51bGwgJiYgdGhpcy5pc09wZW5XaW4oKSkge1xyXG4gICAgICB0aGlzLkZvcm0uSW5Jbml0Rm9ybSA9IHRydWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuRm9ybS5pbml0KCk7XHJcblxyXG5cclxuICAgICAgdGhpcy5TZXRSZWZyZXNoVHlwZShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheSgpO1xyXG5cclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgdGhpcy5Gb3JtLkluSW5pdEZvcm0gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVzdW1lIHN1YmZvcm0gbGF5b3V0XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIFJlc3VtZVN1YmZvcm1MYXlvdXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBzdWJGb3JtQ3RybDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuRm9ybS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICBpZiAoc3ViRm9ybUN0cmwgIT09IG51bGwgJiYgdGhpcy5zaG91bGRSZXN1bWVTdWJmb3JtTGF5b3V0KSB7XHJcbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgdmlzaWJsZSBwcm9wZXJ0eVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgc3ViRm9ybUN0cmwsIDAsXHJcbiAgICAgICAgICAgSHRtbFByb3BlcnRpZXMuVmlzaWJsZSAsIHN1YkZvcm1DdHJsLmlzVmlzaWJsZSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG91bGRSZXN1bWVTdWJmb3JtTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sIHdoaWNoIHdhcyBsYXN0IHBhcmtlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZXB0aFwiPnRoZSBnZW5lcmF0aW9uPC9wYXJhbT5cclxuICBHZXRMYXN0UGFya2VkQ3RybE5hbWUoZGVwdGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYW5jZXN0b3I6IEd1aVRhc2tCYXNlID0gPEd1aVRhc2tCYXNlPnRoaXMuR2V0VGFza0FuY2VzdG9yKGRlcHRoKTtcclxuICAgIGlmIChhbmNlc3RvciA9PT0gbnVsbCB8fCBhbmNlc3Rvci5fbGFzdFBhcmtlZEN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgcmV0dXJuIGFuY2VzdG9yLl9sYXN0UGFya2VkQ3RybC5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgZm9ybSBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBGb3JtIGlzIHRoZSBmb3JtIG9mIHRoZSB0YXNrPC9yZXR1cm5zPlxyXG4gIGdldEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdGFzaydzIGZvcm0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IEZvcm0gaXMgdGhlIGZvcm0gb2YgdGhlIHRhc2s8L3JldHVybnM+XHJcbiAgU2V0Rm9ybSh2YWx1ZTogTWdGb3JtQmFzZSk6IE1nRm9ybUJhc2Uge1xyXG4gICAgdGhpcy5Gb3JtID0gdmFsdWU7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmRXhpc3RQcm9wKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGV4aXN0ID0gKHByb3AgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4aXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHRhc2sgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+SWQgb2YgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9UQVNLLCB0aGlzKTtcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcHJvcC5TdHVkaW9WYWx1ZSA9IHByb3AuZ2V0T3JnVmFsdWUoKTtcclxuICAgICAgICAgIHRoaXMuX3Byb3BUYWIuYWRkUHJvcChwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpXHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGNvbXBvbmVudCBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgZmlyc3QgcmVmcmVzaFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCBJRC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+RXhwIElEPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+ZXhwZWN0ZWQgcmV0dXJuIHR5cGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPkV4cGVjdGVkIGxlbiAtIGlzIG5vdCB1c2VkLCBpdCBtdXN0IGJlIGhlcmUgYmVjYXVzZSBvZiBjb21wdXRhYmlsaXR5IHdpdGggUmljaCBDbGllbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPnNob3VsZCB0aGUgcmVzdWx0IGJlIHVuaWNvZGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhbHdheXNFdmFsdWF0ZVwiPmZvciBmb3JtIHByb3BlcnRpZXMgYW5kIHNvbWUgY29udHJvbCBwcm9wZXJ0aWVzIHdlIGFsd2F5cyBldmFsdWF0ZSBleHByZXNzaW9uczwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwid2FzRXZhbHVhdGVkXCI+aW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gd2FzIGV2YWx1YXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmV2YWx1YXRlZCB2YWx1ZTwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbiwgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICB3YXNFdmFsdWF0ZWQudmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoYWx3YXlzRXZhbHVhdGUgfHwgdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkNhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQsIHJlc1R5cGUsIGxlbmd0aCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZC52YWx1ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxjdWxhdGUgZXhwcmVzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPlRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+VGhlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+VGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+RGVub3RlcyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSB1bmljb2RlIHN0cmluZy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+Tm90IHVzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjcmVhdGVzIGEgbWdmb3JtIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBDb25zdHJ1Y3RNZ0Zvcm0oYWxyZWFkeVNldFBhcmVudEZvcm06IFJlZlBhcmFtPGJvb2xlYW4+KTogTWdGb3JtQmFzZSA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaXMgc3RhcnRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGVsbHMgd2hldGhlciB0aGUgdGFzayBpcyBhYm9ydGluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNBYm9ydGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBHdWlUYXNrQmFzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJnZW5lcmF0aW9uXCI+b2YgdGhlIGFuY2VzdG9yIHRhc2s8L3BhcmFtPlxyXG4gIGFic3RyYWN0IEdldFRhc2tBbmNlc3RvcihnZW5lcmF0aW9uOiBudW1iZXIpOiBJVGFzaztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgdGhlIGNvbnRleHQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBHZXRDb250ZXh0VGFzaygpOiBJVGFzaztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRhc2sgZGVwdGhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWJzdHJhY3QgR2V0VGFza0RlcHRoKCk6IG51bWJlcjtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZWZyZXNoIHRoZSBkaXNwbGF5LCBwYWludCB0aGUgY29udHJvbHMgYW5kIHRoZWlyIHByb3BlcnRpZXMgYWdhaW4gPC9zdW1tYXJ5PlxyXG4gIGFic3RyYWN0IFJlZnJlc2hEaXNwbGF5KCk6IHZvaWQgO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYWJzdHJhY3QgYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZ2V0IHRoZSBkaXNwbGF5IHZhbHVlIG9mIGEgZmllbGQuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYWJzdHJhY3QgZ2V0RmllbGREaXNwbGF5VmFsdWUoZmllbGREZWY6IEZpZWxkRGVmLCB2YWx1ZTogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPik6IHZvaWQgO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYWJzdHJhY3QgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogdm9pZCA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgYSBmaWVsZCBmcm9tIHRoZSB0YXNrLnRyYXZlbCBieSBwYXJlbnRzIChpLmUuIE5PVCBieSB0cmlnZ2VyaW5nIHRhc2tzKS48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj5nZW5lcmF0aW9uIG51bWJlciAoMCBpcyBjdXJyZW50IHRhc2spPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBmaWVsZCBpbmRleCB3aXRoaW4gaXRzIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGlkIG9mIHRoZSBmaWVsZCBkZXNjcmliZWQgYnkgcGFyZW50ICsgaWR4PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0RmllbGRfMShwYXJlbnQ6IG51bWJlciwgZmxkSWR4OiBudW1iZXIpOiBGaWVsZERlZiB7XHJcblxyXG4gICAgc3dpdGNoIChwYXJlbnQpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkRGVmKGZsZElkeCk7XHJcblxyXG4gICAgICBjYXNlIEd1aVRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRDpcclxuICAgICAgICAvLyBmaW5kIHRoZSBtYWluIHByb2dyYW0gdXNpbmcgdGhlIGNvbXBvbmVudCBpZCAoY3RsIGlkeClcclxuICAgICAgICBsZXQgY29tcE1haW5Qcm9nOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT4gR3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCh0aGlzLkNvbnRleHRJRCwgdGhpcy5fY3RsSWR4KTtcclxuICAgICAgICByZXR1cm4gY29tcE1haW5Qcm9nLmdldEZpZWxkRGVmKGZsZElkeCk7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHBhcmVudC0tO1xyXG4gICAgICAgIGlmICh0aGlzLlN0dWRpb1BhcmVudFRhc2sgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiB0aGlzLlN0dWRpb1BhcmVudFRhc2suZ2V0RmllbGREZWYocGFyZW50LCBmbGRJZHgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBhdHRyaWJ1dGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsQXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLKSArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vucy5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKSAmJiBFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbiBUYXNrQmFzZS5maWxsQXR0cmlidXRlcygpOiBVbnByb2Nlc3NlZCghKSBhdHRyaWJ1dGU6ICd7MH0nID0gJ3sxfSdcIiwgYXR0cmlidXRlLCB2YWx1ZVN0cikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpICsgMSk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUYWdQcm9jZXNzZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQVBQTF9HVUlEOlxyXG4gICAgICAgIHRoaXMuQXBwbGljYXRpb25HdWlkID0gdmFsdWVTdHI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BST0dSQU1fSVNOOlxyXG4gICAgICAgIHRoaXMuUHJvZ3JhbUlzbiA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLX0lTTjpcclxuICAgICAgICB0aGlzLlRhc2tJc24gPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVE9PTEtJVF9QQVJFTlRfVEFTSzpcclxuICAgICAgICBpZiAoTk51bWJlci5QYXJzZSh2YWx1ZVN0cikgIT09IDApXHJcbiAgICAgICAgICB0aGlzLlN0dWRpb1BhcmVudFRhc2sgPSA8R3VpVGFza0Jhc2U+R3VpRGF0YUNvbGxlY3Rpb24uTUdEYXRhVGFibGUuR2V0VGFza0J5SUQodmFsdWVTdHIpO1xyXG5cclxuICAgICAgICB0aGlzLklzU3VidGFzayA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICB0aGlzLnNldFRhc2tJZCh2YWx1ZVN0cik7XHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhcIlRBU0s6IFwiICsgdGhpcy5fdGFza1RhZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NUTF9JRFg6XHJcbiAgICAgICAgdGhpcy5zZXRDdGxBbmRDb21wSWR4KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTUFJTlBSRzpcclxuICAgICAgICB0aGlzLnNldE1haW5QcmcodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OVUxMX0FSSVRITUVUSUM6XHJcbiAgICAgICAgdGhpcy5zZXROdWxsQXJpdGhtZXRpYyh2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSQUNUSVZFOlxyXG4gICAgICAgIHRoaXMuc2V0SXNJbnRlcmFjaXZlKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfT1BFTl9XSU46XHJcbiAgICAgICAgdGhpcy5zZXRPcGVuV2luKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQUxMT1dfRVZFTlRTOlxyXG4gICAgICAgIHRoaXMuU2V0QWxsb3dFdmVudHModmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU1BSRzpcclxuICAgICAgICB0aGlzLnNldElzUHJnKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUNPTl9GSUxFX05BTUU6XHJcbiAgICAgICAgdGhpcy5JY29uRmlsZU5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1BBUkFMTEVMOlxyXG4gICAgICAgIHRoaXMuSXNQYXJhbGxlbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUk9VVEVSX1BBVEg6XHJcbiAgICAgICAgaWYgKHZhbHVlU3RyLnRyaW0oKSAhPSBcIlwiKVxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXJQYXRoID0gdmFsdWVTdHI7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lOX0RFRkFVTFRfUk9VVEVSX09VVExFVDpcclxuICAgICAgICB0aGlzLmluRGVmYXVsdFJvdXRlck91dGxldCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNUYWdQcm9jZXNzZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXQgZGF0YSBmb3IgZm9ybSBhbmQgcmV0dXJuIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3VuZFRhZ05hbWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudEZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgRm9ybUluaXREYXRhKHBhcmVudEZvcm06IE1nRm9ybUJhc2UpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBhbHJlYWR5U2V0UGFyZW50Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlZkFscmVhZHlTZXRQYXJlbnRGb3JtOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShhbHJlYWR5U2V0UGFyZW50Rm9ybSk7XHJcblxyXG4gICAgaWYgKHRoaXMuRm9ybSA9PT0gbnVsbClcclxuICAgICAgdGhpcy5Gb3JtID0gdGhpcy5Db25zdHJ1Y3RNZ0Zvcm0ocmVmQWxyZWFkeVNldFBhcmVudEZvcm0pO1xyXG5cclxuICAgIGlmICghYWxyZWFkeVNldFBhcmVudEZvcm0pXHJcbiAgICAgIHRoaXMuRm9ybS5QYXJlbnRGb3JtID0gcGFyZW50Rm9ybTtcclxuXHJcbiAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkRldmVsb3BtZW50KSlcclxuICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coXCJmb3JtXCIpO1xyXG5cclxuICAgIHRoaXMuRm9ybS5maWxsRGF0YSh0aGlzKTtcclxuICAgIHJldHVybiB0aGlzLkZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRhc2sgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFRhc2tJZCh2YWx1ZVN0cjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrVGFnID0gdmFsdWVTdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGN0bElkeCAmIGNvbXBJZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0Q3RsQW5kQ29tcElkeCh2YWx1ZVN0cjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gdmFsdWVTdHIuaW5kZXhPZihcIixcIik7XHJcbiAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX2N0bElkeCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgdGhpcy5fY29tcElkeCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIuc3Vic3RyKGkgKyAxKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCBhbmNlc3RvciB0YXNrIGNvbnRhaW5pbmcgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPkd1aVRhc2tCYXNlPC9yZXR1cm5zPlxyXG4gIEdldEFuY2VzdG9yVGFza0NvbnRhaW5pbmdGb3JtKCk6IEd1aVRhc2tCYXNlIHtcclxuICAgIGxldCBwYXJlbnRUYXNrOiBHdWlUYXNrQmFzZSA9IDxHdWlUYXNrQmFzZT50aGlzLkdldFRhc2tBbmNlc3RvcigxKTtcclxuICAgIHdoaWxlIChwYXJlbnRUYXNrICE9PSBudWxsICYmIHBhcmVudFRhc2suZ2V0Rm9ybSgpID09PSBudWxsKSB7XHJcbiAgICAgIHBhcmVudFRhc2sgPSA8R3VpVGFza0Jhc2U+cGFyZW50VGFzay5HZXRUYXNrQW5jZXN0b3IoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBpc01haW5QcmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE1haW5QcmcodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNNYWluUHJnID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgbnVsbEFyaXRobWV0aWNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE51bGxBcml0aG1ldGljKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX251bGxBcml0aG1ldGljID0gdmFsdWVTdHIuY2hhckF0KDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgaXNJbnRlcmFjdGl2ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0SXNJbnRlcmFjaXZlKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuSXNJbnRlcmFjdGl2ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IG9wZW5XaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHNldE9wZW5XaW4odmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3BlbldpbiA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IG9wZW5XaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyXCI+PC9wYXJhbT5cclxuICBTZXRPcGVuV2luKHZhbHVlYm9vbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fb3BlbldpbiA9IHZhbHVlYm9vbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgU2V0QWxsb3dFdmVudHModmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBpc1ByZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVTdHJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0SXNQcmcodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faXNQcmcgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgfVxyXG5cclxuICBTaG91bGRFdmFsdWF0ZVByb3BlcnR5TG9jYWxseShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3QgR2V0VGFza0RldGFpbHMoKTogc3RyaW5nO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBTZXRzIHRoZSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIHBhbmUgb2Ygc3RhdHVzIGJhci48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+bWVzc2FnZSB0byBiZSBzaG93bjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291bmRCZWVwXCI+dG8gYmVlcCBvciBub3Q8L3BhcmFtPlxyXG4gIFdyaXRlVG9NZXNzYWdlUGFuZShtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gU3RvcnkgMTQ5MzE2IDogc2VuZCBtZXNzYWdlIHRvIGNvbnNvbGVcclxuICAgIGlmIChtc2cgIT0gbnVsbClcclxuICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgd3JpdGUgYSBtZXNzYWdlIHRvIHN0YXR1cyBiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNnSWRcIj5pZCBvZiBtZXNzYWdlIHRvIGJlIHdyaXR0ZW48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdW5kQmVlcFwiPjwvcGFyYW0+XHJcbiAgV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChtc2dJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbXNnOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhtc2dJZCk7XHJcbiAgICB0aGlzLldyaXRlVG9NZXNzYWdlUGFuZShtc2cpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSU1HRGF0YVRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L3Rhc2tzL0lNR0RhdGFUYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJVGFza30gZnJvbSBcIi4vSVRhc2tcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU1HRGF0YVRhYmxlIHtcclxuICBjdXJyTWdkSUQ6IG51bWJlcjtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNlYXJjaGVzIGFsbCB0aGUgTUdEYXRhIG9iamVjdHMgdGlsbCBpdCBmaW5kcyB0aGUgdGFzayB3aXRoIHRoZSBnaXZlbiBpZDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+dGhlIGlkIG9mIHRoZSByZXF1ZXN0ZWQgdGFzazwvcGFyYW0+XHJcbiAgR2V0VGFza0J5SUQoaWQ6IHN0cmluZyk6IElUYXNrO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+cmV0dXJucyBtYWluIHByb2dyYW0gZm9yIGdpdmVuIGN0bCBpbmRleDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SURcIj5hY3RpdmUvdGFyZ2V0IGNvbnRleHQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0bElkeFwiPmN0bCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRNYWluUHJvZ0J5Q3RsSWR4KGNvbnRleHRJRDogbnVtYmVyLCBjdGxJZHg6IG51bWJlcik6IElUYXNrO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3VycmVudCBpZCBvZiBhIHRhc2sgYWNjb3JkaW5nIHRvIGl0cyBvcmlnaW5hbCBpZFxyXG4gIC8vLyAgIGl0IHdpbGwgdXN1YWxseSByZXR1cm4gdGhlIHNhbWUgaWQgYXMgc2VudCB0byBpdCwgYnV0IGZvciBzdWJmb3JtIGFmdGVyIGVycm9yIGFuZCByZXRyeSBpdCB3aWxsXHJcbiAgLy8vICAgY29udmVydCB0aGUgb3JpZ2luYWwgaWQgdG8gdGhlIGN1cnJlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPi0gb3JpZ2luYWwgdGFzayBpZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY3VycmVudCB0YXNraWQgZm9yIHRoaXMgdGFzazwvcmV0dXJucz5cclxuICBnZXRUYXNrSWRCeUlkKHRhc2tJZDogc3RyaW5nKTogc3RyaW5nO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHNpemUgb2YgTUdEYXRhIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHNpemUgb2YgdGFibGU8L3JldHVybnM+XHJcbiAgZ2V0U2l6ZSgpOiBudW1iZXI7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdGFydCB0aGUgdGFza3MgaXRlcmF0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXJ0VGFza3NJdGVyYXRpb24oKTogdm9pZDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgbmV4dCB0YXNrIHVzaW5nIHRoZSB0YXNrcyBpdGVyYXRvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TmV4dFRhc2soKTogSVRhc2s7XHJcbn1cclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvdGFza3MvSVRhc2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8c3VtbWFyeT5cclxuLy8vIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYnkgdGhlIEdVSSBuYW1lc3BhY2UgZnJvbSB0aGUgR3VpVGFza0Jhc2UgY2xhc3MuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRhc2sge1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGNvbXBvbmVudCBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbXBJZHgoKTogbnVtYmVyO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRhc2sgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2tUYWcoKTogc3RyaW5nO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc2NoZW1lIGZvciBudWxsIGFyaXRobWV0aWNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE51bGxBcml0aG1ldGljKCk6IHN0cmluZztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNb2RlKCk6IHN0cmluZztcclxufVxyXG4iXX0=