@magic-xpa/gui 4.801.0-dev481.242 → 4.801.0-dev481.248

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 (97) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/{esm2015/src/Events.js → esm2020/src/Events.mjs} +0 -0
  5. package/{esm2015/src/EventsProcessor.js → esm2020/src/EventsProcessor.mjs} +0 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +1 -0
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/{esm2015/src/gui/low/GuiInteractive.js → esm2020/src/gui/low/GuiInteractive.mjs} +0 -0
  25. package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
  26. package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/{esm2015/src/management/data/DcValues.js → esm2020/src/management/data/DcValues.mjs} +0 -0
  29. package/{esm2015/src/management/data/DcValuesBuilderBase.js → esm2020/src/management/data/DcValuesBuilderBase.mjs} +0 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/{esm2015/src/management/data/GuiDataViewBase.js → esm2020/src/management/data/GuiDataViewBase.mjs} +0 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/{esm2015/src/management/data/ObjectReferenceBase.js → esm2020/src/management/data/ObjectReferenceBase.mjs} +0 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/{esm2015/src/management/data/RecordUtils.js → esm2020/src/management/data/RecordUtils.mjs} +0 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/{esm2015/src/management/events/IGuiEventsManager.js → esm2020/src/management/events/IGuiEventsManager.mjs} +1 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
  45. package/{esm2015/src/management/exp/GuiExpressionEvaluator.js → esm2020/src/management/exp/GuiExpressionEvaluator.mjs} +0 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/{esm2015/src/management/gui/DisplayConvertor.js → esm2020/src/management/gui/DisplayConvertor.mjs} +0 -0
  48. package/{esm2015/src/management/gui/FieldValidator.js → esm2020/src/management/gui/FieldValidator.mjs} +0 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
  56. package/{esm2015/src/management/gui/PropDefaults.js → esm2020/src/management/gui/PropDefaults.mjs} +0 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/{esm2015/src/management/tasks/MgTimer.js → esm2020/src/management/tasks/MgTimer.mjs} +0 -0
  68. package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/{esm2015/src/util/ProcessLauncher.js → esm2020/src/util/ProcessLauncher.mjs} +0 -0
  74. package/{esm2015/src/util/UsernamePasswordCredentials.js → esm2020/src/util/UsernamePasswordCredentials.mjs} +0 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +51 -6
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  81. package/src/management/tasks/GuiTaskBase.d.ts +1 -1
  82. package/bundles/magic-xpa-gui.umd.js +0 -19344
  83. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  84. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  85. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  86. package/esm2015/src/Commands.js +0 -189
  87. package/esm2015/src/FocusManager.js +0 -41
  88. package/esm2015/src/Manager.js +0 -197
  89. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  90. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  91. package/esm2015/src/management/gui/MgControlBase.js +0 -1979
  92. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  93. package/esm2015/src/management/gui/PropTable.js +0 -224
  94. package/esm2015/src/management/gui/Property.js +0 -1402
  95. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
  96. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
  97. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -1,1979 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ApplicationException, Debug, Exception, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { GuiFieldBase } from '../data/GuiFieldBase';
4
- import { ChoiceUtils, Constants, InternalInterface, MagicProperties, MgControlType, Misc, SEQ_2_STR, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
5
- import { PIC } from './PIC';
6
- import { PropTable } from './PropTable';
7
- import { ValidationDetails } from './ValidationDetails';
8
- import { FieldDef } from '../data/FieldDef';
9
- import { Property } from './Property';
10
- import { Manager } from '../../Manager';
11
- import { CommandType, HtmlProperties } from '../../GuiEnums';
12
- import { Commands } from '../../Commands';
13
- import { NUM_TYPE } from '../data/NUM_TYPE';
14
- import { PropInterface } from './PropInterface';
15
- import { Events } from '../../Events';
16
- import { EMPTY_DCREF } from '../data/DcValues';
17
- import { DisplayConvertor } from './DisplayConvertor';
18
- import { BlobType } from '../data/BlobType';
19
- import { VectorType } from '../data/VectorType';
20
- import { ObjectReference } from '../../util/ObjectReference';
21
- import { GuiConstants } from '../../GuiConstants';
22
- import { isNullOrUndefined } from 'util';
23
- import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
24
- import { FocusManager } from '../../FocusManager';
25
- export class MgControlBase extends GuiControlPropertyAdapter {
26
- constructor(type, parentMgForm, parentControl) {
27
- super();
28
- this._ditIdx = 0;
29
- this._linkedControls = null;
30
- this._field = null;
31
- this._picStr = null;
32
- this._choiceDisps = null;
33
- this._choiceLayerList = null;
34
- this._choiceLinks = null;
35
- this._choiceNums = null;
36
- this._containerDitIdx = -1;
37
- this._currReadOnly = null;
38
- this._dataCtrl = false;
39
- this._dcTableRefs = null;
40
- this._firstRefreshProperties = true;
41
- this._form = null;
42
- this._hasValidItmAndDispVal = false;
43
- this._id = -1;
44
- this._controlIsn = -1;
45
- this._linkedParentDitIdx = -1;
46
- this._orgChoiceDisps = null;
47
- this._parentTable = null;
48
- this._pic = null;
49
- this._picExpExists = false;
50
- this._prevIsNulls = null;
51
- this._prevPicExpResult = null;
52
- this._prevValues = null;
53
- this._propTab = null;
54
- this._range = null;
55
- this._rangeChanged = false;
56
- this._rtfVal = NString.Empty;
57
- this._valExpId = 0;
58
- this._vd = null;
59
- this._dcValId = -2;
60
- this.parent = 0;
61
- this.veeIndx = 0;
62
- this.DNObjectReferenceField = null;
63
- this.SourceTableReference = null;
64
- this.ClipBoardDataExists = false;
65
- this.DataType = StorageAttribute.NONE;
66
- this.KeyStrokeOn = false;
67
- this.ModifiedByUser = false;
68
- this.Value = null;
69
- this.IsNull = false;
70
- this.forceRefresh = false;
71
- this.RefreshOnVisible = false;
72
- this.InControl = false;
73
- this.ValidateControl = false;
74
- this.PromptHelp = null;
75
- if (arguments.length === 0) {
76
- this.constructor_0();
77
- return;
78
- }
79
- this.constructor_1(type, parentMgForm, parentControl);
80
- }
81
- set Form(value) {
82
- this._form = value;
83
- this.GuiMgForm = value;
84
- }
85
- get Form() {
86
- return this._form;
87
- }
88
- get Id() {
89
- return this._id;
90
- }
91
- get ControlIsn() {
92
- return this._controlIsn;
93
- }
94
- constructor_0() {
95
- this._linkedControls = new List();
96
- this.DataType = StorageAttribute.NONE;
97
- }
98
- constructor_1(type, parentMgForm, parentControl) {
99
- this.constructor_0();
100
- this.initReferences(parentMgForm);
101
- this.Type = type;
102
- this._containerDitIdx = parentControl;
103
- this._linkedParentDitIdx = parentControl;
104
- this._propTab = new PropTable(this);
105
- this.createArrays(false);
106
- }
107
- get UniqueName() {
108
- return this.Name;
109
- }
110
- get TaskTag() {
111
- return this.Form.getTask().getTaskTag();
112
- }
113
- checkIfExistProp(propId) {
114
- let exist = false;
115
- if (this._propTab !== null) {
116
- let propById = this._propTab.getPropById(propId);
117
- exist = (propById !== null);
118
- }
119
- return exist;
120
- }
121
- getProp(propId) {
122
- let prop = null;
123
- if (this._propTab !== null) {
124
- prop = this._propTab.getPropById(propId);
125
- if (prop === null) {
126
- prop = Property.getDefaultProp(propId, 'C', this);
127
- if (prop !== null) {
128
- this._propTab.addProp(prop);
129
- }
130
- }
131
- }
132
- return prop;
133
- }
134
- getForm() {
135
- return this.Form;
136
- }
137
- getCompIdx() {
138
- return this.getForm().getTask().getCompIdx();
139
- }
140
- IsFirstRefreshOfProps() {
141
- return this._firstRefreshProperties;
142
- }
143
- EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
144
- return __awaiter(this, void 0, void 0, function* () {
145
- return yield this.getForm().getTask().EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated);
146
- });
147
- }
148
- GetExpressionStorage(expId) {
149
- return this.getForm().getTask().GetExpressionStorage(expId);
150
- }
151
- GetComputedProperty(propId) {
152
- let prop = null;
153
- if (this._propTab !== null)
154
- prop = this._propTab.getPropById(propId);
155
- return prop;
156
- }
157
- initReferences(mgForm) {
158
- this.Form = mgForm;
159
- }
160
- createArrays(forceCreateArrays) {
161
- if (this._firstRefreshProperties || forceCreateArrays) {
162
- if (this.SupportsDataSource()) {
163
- this._dcTableRefs = new List();
164
- }
165
- this._prevValues = new List();
166
- if (!forceCreateArrays) {
167
- this._currReadOnly = new List();
168
- }
169
- this._choiceDisps = new List();
170
- this._orgChoiceDisps = new List();
171
- this._choiceLinks = new List();
172
- this._choiceNums = new List();
173
- this._prevIsNulls = new List();
174
- this._choiceLayerList = new List();
175
- if (!this.IsRepeatable && !super.isTableControl()) {
176
- this.updateArrays(1);
177
- }
178
- }
179
- }
180
- SetFocus(ctrl, line, activateForm) {
181
- return __awaiter(this, void 0, void 0, function* () {
182
- yield FocusManager.SetFocus(ctrl.getForm().getTask(), ctrl, line, activateForm);
183
- });
184
- }
185
- InsertArrays(idx, count) {
186
- this._prevValues.InsertRange(new Array(count));
187
- this._prevIsNulls.InsertRange(new Array(count));
188
- this._currReadOnly.InsertRange(new Array(count));
189
- this._choiceDisps.InsertRange(new Array(count));
190
- this._orgChoiceDisps.InsertRange(new Array(count));
191
- this._choiceLinks.InsertRange(new Array(count));
192
- this._choiceLayerList.InsertRange(new Array(count));
193
- this._choiceNums.InsertRange(new Array(count));
194
- if (this.SupportsDataSource())
195
- this._dcTableRefs.InsertRange(new Array(count));
196
- this._propTab.InsertPrevValueArray(count);
197
- }
198
- updateArrays(newSize) {
199
- this._prevValues.SetSize(newSize);
200
- this._prevIsNulls.SetSize(newSize);
201
- this._currReadOnly.SetSize(newSize);
202
- this._choiceDisps.SetSize(newSize);
203
- this._orgChoiceDisps.SetSize(newSize);
204
- this._choiceLinks.SetSize(newSize);
205
- this._choiceLayerList.SetSize(newSize);
206
- this._choiceNums.SetSize(newSize);
207
- if (this.SupportsDataSource()) {
208
- this._dcTableRefs.SetSize(newSize);
209
- }
210
- this._propTab.updatePrevValueArray(newSize);
211
- }
212
- updatePrevValArrays(newSize) {
213
- this._propTab.updatePrevValueArray(newSize);
214
- }
215
- fillData(mgForm, ditIdx, parser) {
216
- if (this.Form === null) {
217
- this.initReferences(mgForm);
218
- }
219
- this._ditIdx = ditIdx;
220
- while (this.initInnerObjects(parser.getNextTag(), parser)) {
221
- }
222
- if (this.DataType === StorageAttribute.BLOB && this._picStr === null) {
223
- this._picStr = "";
224
- }
225
- if (this._picStr !== null && typeof this.DataType !== "undefined") {
226
- this.setPIC(this._picStr);
227
- }
228
- else {
229
- switch (this.Type) {
230
- case MgControlType.CTRL_TYPE_IMAGE:
231
- case MgControlType.CTRL_TYPE_BROWSER:
232
- case MgControlType.CTRL_TYPE_BUTTON:
233
- if (this.DataType === StorageAttribute.NONE)
234
- this.DataType = StorageAttribute.ALPHA;
235
- break;
236
- case MgControlType.CTRL_TYPE_TABLE:
237
- case MgControlType.CTRL_TYPE_COLUMN:
238
- case MgControlType.CTRL_TYPE_SUBFORM:
239
- case MgControlType.CTRL_TYPE_GROUP:
240
- case MgControlType.CTRL_TYPE_FRAME_SET:
241
- case MgControlType.CTRL_TYPE_FRAME_FORM:
242
- case MgControlType.CTRL_TYPE_CONTAINER:
243
- case MgControlType.CTRL_TYPE_LINE:
244
- break;
245
- default:
246
- Events.WriteExceptionToLog(NString.Format("in Control.fillData(): missing datatype or picture string for control: {0}", this.Name));
247
- break;
248
- }
249
- }
250
- if (super.isTableControl()) {
251
- this.Form.setTableCtrl(this);
252
- }
253
- this.createArrays(false);
254
- }
255
- initInnerObjects(foundTagName, parser) {
256
- if (foundTagName === null)
257
- return false;
258
- if (foundTagName === XMLConstants.MG_TAG_PROP) {
259
- if (this._propTab === null)
260
- this._propTab = new PropTable(this);
261
- this._propTab.fillData(this, 'C', parser);
262
- }
263
- else if (foundTagName === XMLConstants.MG_TAG_CONTROL)
264
- this.parseAttributes(parser);
265
- else if (foundTagName === "SourceTable")
266
- this.ParseSourceTable(parser);
267
- else if (foundTagName === "/" + XMLConstants.MG_TAG_CONTROL) {
268
- parser.setCurrIndex2EndOfTag();
269
- return false;
270
- }
271
- else {
272
- Events.WriteExceptionToLog(NString.Format("There is no such tag in Control. Insert else if to Control.initInnerObjects for {0}", foundTagName));
273
- return false;
274
- }
275
- return true;
276
- }
277
- ParseSourceTable(parser) {
278
- parser.setCurrIndex2EndOfTag();
279
- let objRefStr = parser.ReadToEndOfCurrentElement();
280
- let sourceTableReference = ObjectReference.FromXML(objRefStr.trim());
281
- this.SourceTableReference = sourceTableReference;
282
- parser.setCurrIndex2EndOfTag();
283
- }
284
- parseAttributes(parser) {
285
- let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
286
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
287
- let tag = parser.getXMLsubstring(endContext);
288
- parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_CONTROL) + XMLConstants.MG_TAG_CONTROL.length);
289
- let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
290
- for (let i = 0; i < tokens.length; i = i + 2) {
291
- let attribute = tokens.get_Item(i);
292
- let valueStr = tokens.get_Item(i + 1);
293
- this.SetAttribute(attribute, valueStr);
294
- }
295
- parser.setCurrIndex(endContext + 1);
296
- }
297
- else {
298
- Events.WriteExceptionToLog("in Control.FillName() out of string bounds");
299
- }
300
- }
301
- SetAttribute(attribute, valueStr) {
302
- let isTagProcessed = true;
303
- switch (attribute) {
304
- case XMLConstants.MG_ATTR_TYPE:
305
- this.Type = valueStr[0];
306
- break;
307
- case XMLConstants.MG_ATTR_DATA_CTRL:
308
- this._dataCtrl = XmlParser.getBoolean(valueStr);
309
- break;
310
- case XMLConstants.MG_ATTR_LINKED_PARENT:
311
- this.setLinkedParentIdx(XmlParser.getInt(valueStr));
312
- break;
313
- case XMLConstants.MG_ATTR_CONTAINER:
314
- this.setContainer(XmlParser.getInt(valueStr));
315
- break;
316
- case XMLConstants.MG_ATTR_ID:
317
- this._id = XmlParser.getInt(valueStr);
318
- break;
319
- case XMLConstants.MG_ATTR_CONTROL_ISN:
320
- this._controlIsn = XmlParser.getInt(valueStr);
321
- break;
322
- case XMLConstants.MG_ATTR_IS_MODAL:
323
- this._isModal = XmlParser.getBoolean(valueStr);
324
- break;
325
- case XMLConstants.MG_ATTR_CONTROL_Z_ORDER:
326
- break;
327
- case XMLConstants.MG_HOR_ALIGMENT_IS_INHERITED:
328
- break;
329
- default:
330
- isTagProcessed = false;
331
- break;
332
- }
333
- return isTagProcessed;
334
- }
335
- setImage() {
336
- let newVal = this.Value;
337
- if (newVal === null || this.IsNull) {
338
- newVal = "";
339
- }
340
- if (this.DataType === StorageAttribute.BLOB) {
341
- }
342
- else {
343
- this.setImageWithFileName(newVal);
344
- }
345
- }
346
- setImageWithFileName(fileName) {
347
- if (fileName === null) {
348
- fileName = "";
349
- }
350
- fileName = Events.TranslateLogicalName(fileName);
351
- if (!Misc.IsWebUrl(fileName))
352
- fileName = "./assets/images/" + fileName;
353
- if (this.IsImageButton()) {
354
- Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, fileName);
355
- }
356
- else {
357
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Image, fileName);
358
- Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), fileName);
359
- }
360
- }
361
- setContainer(containerIdx) {
362
- this._containerDitIdx = containerIdx;
363
- let container = null;
364
- if (this._containerDitIdx !== -1) {
365
- container = this.Form.getCtrl(this._containerDitIdx);
366
- }
367
- if (container !== null && container.Type === MgControlType.CTRL_TYPE_TABLE) {
368
- this._parentTable = container;
369
- }
370
- this.IsRepeatable = (this._parentTable !== null && !super.isColumnControl());
371
- }
372
- getName() {
373
- return this.Name;
374
- }
375
- getLinkedControls() {
376
- return this._linkedControls;
377
- }
378
- isRepeatable() {
379
- return this.IsRepeatable;
380
- }
381
- IsModal() {
382
- return this._isModal;
383
- }
384
- getDisplayLine(useLineForItems) {
385
- let line = 0;
386
- if (this.IsRepeatable || (useLineForItems && super.isTableControl())) {
387
- line = this.Form.DisplayLine;
388
- }
389
- return line;
390
- }
391
- isVisible() {
392
- let result = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true);
393
- if (result) {
394
- result = this.isParentPropValue(PropInterface.PROP_TYPE_VISIBLE);
395
- }
396
- return result;
397
- }
398
- isEnabled() {
399
- return this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true);
400
- }
401
- isModifiable() {
402
- let modifiable = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFIABLE, true);
403
- let taskInQuery = this.getForm().getTask().getMode() === Constants.TASK_MODE_QUERY;
404
- let modifyInQuery = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false);
405
- let result = modifiable && (modifyInQuery || !taskInQuery);
406
- if (result && this._field != null) {
407
- result = (this._field.DbModifiable || this.getForm().getTask().getMode() === Constants.TASK_MODE_CREATE);
408
- }
409
- return result;
410
- }
411
- getDcVals() {
412
- let dataView = this.getForm().getTask().DataView;
413
- let dcv = null;
414
- if (this._dcValId === EMPTY_DCREF) {
415
- dcv = ((this.DataType === StorageAttribute.BLOB_VECTOR) ? dataView.getEmptyChoiceForVectors() : dataView.getEmptyChoice());
416
- }
417
- else {
418
- if (this._dcValId > -1) {
419
- dcv = dataView.getDcValues(this._dcValId);
420
- }
421
- }
422
- return dcv;
423
- }
424
- getPrevIsNull() {
425
- let line = this.getDisplayLine(true);
426
- let currObj = this._prevIsNulls.get_Item(line);
427
- let curr;
428
- if (currObj === null) {
429
- curr = false;
430
- this._prevIsNulls.set_Item(line, curr);
431
- }
432
- else {
433
- curr = currObj;
434
- }
435
- return curr;
436
- }
437
- setPrevIsNull(newValue) {
438
- this._prevIsNulls.set_Item(this.getDisplayLine(true), newValue);
439
- }
440
- setPIC(picStr) {
441
- if (super.isButton()) {
442
- this._picStr = (super.IsImageButton() ? "" + XMLConstants.FILE_NAME_SIZE.toString() : Events.Translate(picStr));
443
- }
444
- else {
445
- this._picStr = picStr;
446
- }
447
- this._pic = new PIC(this._picStr, this.DataType, this.getForm().getTask().getCompIdx());
448
- if (this._dataCtrl && this._picStr.indexOf('H') > -1) {
449
- this._pic.setHebrew();
450
- }
451
- }
452
- getPIC() {
453
- return this._pic;
454
- }
455
- getParent() {
456
- let retParent = this.Form;
457
- if (this._containerDitIdx !== -1) {
458
- retParent = this.Form.getCtrl(this._containerDitIdx);
459
- }
460
- else {
461
- if (this.Form.isSubForm()) {
462
- retParent = this.Form.getSubFormCtrl();
463
- }
464
- }
465
- return retParent;
466
- }
467
- getField() {
468
- return this._field;
469
- }
470
- setField(fieldOrFieldStrID) {
471
- if (fieldOrFieldStrID === null || fieldOrFieldStrID instanceof GuiFieldBase) {
472
- this.setField_0(fieldOrFieldStrID);
473
- return;
474
- }
475
- this.setField_1(fieldOrFieldStrID);
476
- }
477
- setField_0(field) {
478
- this._field = field;
479
- if (field !== null) {
480
- this._field.SetControl(this);
481
- }
482
- }
483
- setField_1(fieldStrID) {
484
- let returnField = this.getFieldByValueStr(fieldStrID);
485
- if (returnField !== null) {
486
- this._field = returnField;
487
- this._field.SetControl(this);
488
- return;
489
- }
490
- throw new ApplicationException("in Control.setField(): illegal field identifier: " + fieldStrID);
491
- }
492
- setPicStr(format, expId) {
493
- this._picStr = format;
494
- if (expId > 0) {
495
- this._picExpExists = true;
496
- }
497
- }
498
- setRange(newRange) {
499
- this._range = newRange;
500
- this._vd = null;
501
- }
502
- setValExp(expId) {
503
- this._valExpId = expId;
504
- }
505
- buildCopyPicture(oldVal, newVal) {
506
- if (super.isTableControl() || super.isColumnControl()) {
507
- return null;
508
- }
509
- else {
510
- let copyVD = this.getCopyOfVD();
511
- copyVD.setValue(newVal);
512
- copyVD.setOldValue(oldVal);
513
- return copyVD;
514
- }
515
- }
516
- getCopyOfVD() {
517
- let result;
518
- if (this._vd === null) {
519
- result = new ValidationDetails(this.Value, this.Value, this._range, this._pic, this);
520
- }
521
- else {
522
- result = new ValidationDetails(this._vd);
523
- }
524
- return result;
525
- }
526
- getRanges() {
527
- return this._range;
528
- }
529
- getRangedValue(newVal) {
530
- let vd;
531
- vd = this.buildCopyPicture(this.Value, newVal);
532
- vd.evaluate();
533
- let val = vd.getDispValue();
534
- return (val.toString());
535
- }
536
- validate(newVal) {
537
- let vd;
538
- let modified = this.ModifiedByUser;
539
- this.ModifiedByUser = true;
540
- vd = this.buildCopyPicture(this.Value, newVal);
541
- vd.evaluate();
542
- this.ModifiedByUser = modified;
543
- if (vd.ValidationFailed)
544
- return vd.ErrorMessage;
545
- else
546
- return null;
547
- }
548
- getFieldByValueStr(valueStr) {
549
- let refParent = new RefParam(this.parent);
550
- let refVeeIndx = new RefParam(this.veeIndx);
551
- let ret = this.getForm().getTask().getFieldByValueStr(valueStr, refParent, refVeeIndx);
552
- this.parent = refParent.value;
553
- this.veeIndx = refVeeIndx.value;
554
- return ret;
555
- }
556
- hasContainer() {
557
- return this._containerDitIdx !== -1;
558
- }
559
- getLayer() {
560
- return this.Layer;
561
- }
562
- computePIC(picExpResult) {
563
- let picResult = (picExpResult !== null && super.isButton()) ? Events.Translate(picExpResult) : picExpResult;
564
- if (this._prevPicExpResult === null || !(this._prevPicExpResult === picResult)) {
565
- this._pic = new PIC(picResult, this.DataType, this.getForm().getTask().getCompIdx());
566
- this._prevPicExpResult = picResult;
567
- }
568
- return this._pic;
569
- }
570
- getCurrentIndexOfChoice() {
571
- let selectedIndice = [-1];
572
- let val = this.Value;
573
- if (!NString.IsNullOrEmpty(val)) {
574
- let array2 = val.split(',');
575
- selectedIndice = new Array(array2.length);
576
- for (let iCtr = 0; iCtr < array2.length; iCtr = iCtr + 1) {
577
- let num = NNumber.Parse(array2[iCtr]);
578
- selectedIndice[iCtr] = ((num >= 0) ? num : -1);
579
- }
580
- }
581
- return selectedIndice;
582
- }
583
- IsMultipleSelectionListBox() {
584
- return super.isListBox();
585
- }
586
- IsDateTimePicture() {
587
- return this._pic.getAttr() === StorageAttribute.DATE || this._pic.getAttr() === StorageAttribute.TIME;
588
- }
589
- SupportsDataSource() {
590
- return super.isSelectionCtrl() || super.isTabControl() || super.isRadio() || this.HasAutocomplete();
591
- }
592
- HasAutocomplete() {
593
- if (super.isTextControl())
594
- return this.getProp(PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC).GetComputedValueBoolean();
595
- return false;
596
- }
597
- getIndexOfChoice(mgVal, line, isNull) {
598
- return __awaiter(this, void 0, void 0, function* () {
599
- let splitCommaSeperatedVals = this.IsMultipleSelectionListBox();
600
- yield this.computeChoice(line);
601
- let isVectorValue = this.getField() !== null && this.getField().getType() === StorageAttribute.BLOB_VECTOR;
602
- return this.getDcVals().getIndexOf(mgVal, isVectorValue, isNull, this._choiceLinks.get_Item(line), this._choiceNums.get_Item(line), splitCommaSeperatedVals);
603
- });
604
- }
605
- getDispVals(line, execComputeChoice) {
606
- const _super = Object.create(null, {
607
- isTabControl: { get: () => super.isTabControl }
608
- });
609
- return __awaiter(this, void 0, void 0, function* () {
610
- if (execComputeChoice) {
611
- yield this.computeChoice(line);
612
- }
613
- if (_super.isTabControl.call(this)) {
614
- return this._orgChoiceDisps.get_Item(line);
615
- }
616
- else {
617
- return this._choiceDisps.get_Item(line);
618
- }
619
- });
620
- }
621
- emptyChoice(line) {
622
- let value = new Array(0);
623
- this._choiceDisps.set_Item(line, value);
624
- this._orgChoiceDisps.set_Item(line, value);
625
- this._choiceLinks.set_Item(line, value);
626
- this._choiceLayerList.set_Item(line, value);
627
- }
628
- computeChoice(line) {
629
- const _super = Object.create(null, {
630
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
631
- isTabControl: { get: () => super.isTabControl }
632
- });
633
- return __awaiter(this, void 0, void 0, function* () {
634
- let fromHelp = [
635
- "\\\\", "\\-", "\\,"
636
- ];
637
- let toHelp = [
638
- "XX", "XX", "XX"
639
- ];
640
- let task = this.getForm().getTask();
641
- let dataView = task.DataView;
642
- let dcv = dataView.getDcValues(this._dcValId);
643
- let currDcId = this.getDcRef();
644
- let choiceDispStr = null;
645
- let choiceLinkStr = "";
646
- let optionsValid = true;
647
- let trimToLength = -1;
648
- let dataType = this.DataType;
649
- let isItemsListTreatedAsDisplayList = false;
650
- try {
651
- if (this._choiceLinks.get_Item(line) === null || (this.isDataCtrl() && currDcId !== this._dcValId)) {
652
- if (dataType === StorageAttribute.BLOB_VECTOR) {
653
- dataType = this.getField().getCellsType();
654
- }
655
- let dispVals = dcv.getDispVals();
656
- let dispProp = this.getProp(PropInterface.PROP_TYPE_DISPLAY_LIST);
657
- let linkProp = this.getProp(PropInterface.PROP_TYPE_LABEL);
658
- if (dispProp !== null) {
659
- choiceDispStr = yield dispProp.getValue();
660
- }
661
- if (linkProp !== null) {
662
- choiceLinkStr = yield linkProp.getValue();
663
- }
664
- if (choiceLinkStr === null || StrUtil.rtrim(choiceLinkStr).length === 0) {
665
- choiceLinkStr = "";
666
- }
667
- if (choiceDispStr === null || StrUtil.rtrim(choiceDispStr).length === 0) {
668
- if (!this.isDataCtrl() || dispVals === null || dispVals.length === 0) {
669
- choiceDispStr = choiceLinkStr;
670
- }
671
- else {
672
- choiceDispStr = (choiceLinkStr = "");
673
- }
674
- isItemsListTreatedAsDisplayList = true;
675
- }
676
- choiceDispStr = Events.Translate(choiceDispStr);
677
- if (dataType === StorageAttribute.NUMERIC) {
678
- choiceLinkStr = StrUtil.searchAndReplace(choiceLinkStr, "\\-", "-");
679
- }
680
- let helpStr = StrUtil.searchAndReplace(choiceLinkStr, fromHelp, toHelp);
681
- let sTok = StrUtil.tokenize(helpStr, ",");
682
- let linkSize = (helpStr !== "") ? sTok.length : 0;
683
- let helpStrDisp = StrUtil.searchAndReplace(choiceDispStr, fromHelp, toHelp);
684
- sTok = StrUtil.tokenize(helpStrDisp, ",");
685
- let displaySize = (helpStrDisp !== "") ? sTok.length : 0;
686
- if (linkSize !== displaySize && displaySize > 0) {
687
- choiceDispStr = choiceLinkStr;
688
- isItemsListTreatedAsDisplayList = true;
689
- }
690
- let size = linkSize;
691
- let choiceLink = new Array(size);
692
- this._choiceLinks.set_Item(line, choiceLink);
693
- if (dataType === StorageAttribute.NUMERIC || dataType === StorageAttribute.DATE || dataType === StorageAttribute.TIME) {
694
- this._choiceNums.set_Item(line, new Array(size));
695
- }
696
- let orgChoiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, false, true, !isItemsListTreatedAsDisplayList);
697
- this._orgChoiceDisps.set_Item(line, orgChoiceDisp);
698
- let choiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, _super.isSelectionCtrl.call(this) || _super.isTabControl.call(this), true, !isItemsListTreatedAsDisplayList);
699
- this._choiceDisps.set_Item(line, choiceDisp);
700
- if (this.getField() !== null) {
701
- trimToLength = this.getField().getSize();
702
- }
703
- let token = null;
704
- let helpToken = null;
705
- let tokenBuffer;
706
- for (let i = 0, currPos = 0, nextPos = 0; i < size && optionsValid; i++) {
707
- nextPos = currPos;
708
- nextPos = helpStr.indexOf(',', nextPos);
709
- if (nextPos === currPos)
710
- token = helpToken = "";
711
- else if (nextPos === -1) {
712
- token = choiceLinkStr.substr(currPos);
713
- helpToken = helpStr.substr(currPos);
714
- }
715
- else {
716
- token = choiceLinkStr.substr(currPos, (nextPos) - (currPos));
717
- helpToken = helpStr.substr(currPos, (nextPos) - (currPos));
718
- }
719
- currPos = nextPos + 1;
720
- switch (dataType) {
721
- case StorageAttribute.ALPHA:
722
- case StorageAttribute.MEMO:
723
- case StorageAttribute.UNICODE:
724
- case StorageAttribute.BLOB_VECTOR:
725
- token = StrUtil.ltrim(token);
726
- helpToken = StrUtil.ltrim(helpToken);
727
- if (helpToken.indexOf('\\') >= 0) {
728
- tokenBuffer = new StringBuilder();
729
- for (let tokenPos = 0; tokenPos < helpToken.length; tokenPos++)
730
- if (helpToken[tokenPos] !== '\\')
731
- tokenBuffer.Append(token[tokenPos]);
732
- else if (tokenPos === helpToken.length - 1)
733
- tokenBuffer.Append(' ');
734
- token = tokenBuffer.ToString();
735
- }
736
- token = StrUtil.makePrintableTokens(token, SEQ_2_STR);
737
- if (this.isSelectionCtrl() || this.isTabControl())
738
- token = ChoiceUtils.RemoveAcclCharFromOptions(new StringBuilder(token));
739
- if (UtilStrByteMode.isLocaleDefLangDBCS() && dataType === StorageAttribute.ALPHA) {
740
- if (trimToLength !== -1 && UtilStrByteMode.lenB(token) > trimToLength)
741
- token = UtilStrByteMode.leftB(token, trimToLength);
742
- }
743
- else {
744
- if (trimToLength !== -1 && token.length > trimToLength)
745
- token = token.substr(0, trimToLength);
746
- }
747
- choiceLink[i] = token;
748
- break;
749
- case StorageAttribute.NUMERIC:
750
- case StorageAttribute.DATE:
751
- case StorageAttribute.TIME:
752
- let picture = PIC.buildPicture(dataType, token, task.getCompIdx(), false);
753
- optionsValid = this.optionIsValid(token);
754
- choiceLink[i] = DisplayConvertor.Instance.disp2mg(token.trim(), picture, task.getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
755
- ((this._choiceNums.get_Item(line)))[i] = new NUM_TYPE(choiceLink[i]);
756
- break;
757
- case StorageAttribute.BOOLEAN:
758
- choiceLink[i] = (1 - i).toString();
759
- break;
760
- default:
761
- break;
762
- }
763
- }
764
- if (!optionsValid)
765
- this.emptyChoice(line);
766
- }
767
- }
768
- catch (ex) {
769
- if (ex instanceof Exception) {
770
- optionsValid = false;
771
- this.emptyChoice(line);
772
- Events.WriteExceptionToLog(NString.Format("{0} : {1}", ex.GetType(), ex.Message));
773
- }
774
- else
775
- throw ex;
776
- }
777
- this._hasValidItmAndDispVal = optionsValid;
778
- });
779
- }
780
- getTopMostForm() {
781
- return this.getForm().getTopMostForm();
782
- }
783
- setUrl() {
784
- Commands.addValueWithLine(CommandType.SET_VALUE, this, 0, this.Value);
785
- }
786
- getMgValue(dispVal) {
787
- const _super = Object.create(null, {
788
- isCheckBox: { get: () => super.isCheckBox },
789
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
790
- isTabControl: { get: () => super.isTabControl },
791
- isRadio: { get: () => super.isRadio }
792
- });
793
- return __awaiter(this, void 0, void 0, function* () {
794
- let mgVal = null;
795
- if (_super.isCheckBox.call(this)) {
796
- mgVal = dispVal ? "1" : "0";
797
- }
798
- else {
799
- if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this) || _super.isRadio.call(this)) {
800
- let line = this.getDisplayLine(true);
801
- if (line < 0)
802
- line = 0;
803
- if (typeof dispVal === "number")
804
- dispVal = dispVal.toString();
805
- if (Array.isArray(dispVal))
806
- dispVal = dispVal.join(',').toString();
807
- if (dispVal === "") {
808
- mgVal = dispVal;
809
- }
810
- else {
811
- mgVal = yield this.getLinkValue(dispVal, line);
812
- }
813
- if (mgVal === null) {
814
- let isNull = false;
815
- let refMgVal = new RefParam(mgVal);
816
- let refIsNull = new RefParam(isNull);
817
- if (this._field !== null) {
818
- mgVal = refMgVal.value;
819
- }
820
- }
821
- }
822
- else {
823
- let blobContentType = (this._field !== null) ? this._field.getContentType() : BlobType.CONTENT_TYPE_UNKNOWN;
824
- mgVal = DisplayConvertor.Instance.disp2mg(dispVal, this._pic, this.getForm().getTask().getCompIdx(), blobContentType);
825
- }
826
- }
827
- return mgVal;
828
- });
829
- }
830
- getLinkValue(selectedIndice, line) {
831
- return __awaiter(this, void 0, void 0, function* () {
832
- let size = 0;
833
- let result = NString.Empty;
834
- let temp = new List();
835
- yield this.computeChoice(line);
836
- let choiceLink = this._choiceLinks.get_Item(line);
837
- if (choiceLink !== null) {
838
- size = choiceLink.length;
839
- }
840
- let linkIndice = this.getLinkIdxFromLayer(Misc.GetIntArray(selectedIndice));
841
- let array2 = linkIndice;
842
- for (let i = 0; i < array2.length; i = i + 1) {
843
- let idx = array2[i];
844
- if (idx >= size) {
845
- let dcVals = this.getDcVals();
846
- temp.push(dcVals.getLinkValue(idx - size));
847
- }
848
- else {
849
- if (idx >= 0 && idx < choiceLink.length) {
850
- temp.push(choiceLink[idx]);
851
- }
852
- else {
853
- temp.push(null);
854
- }
855
- }
856
- }
857
- if (this.DataType === StorageAttribute.BLOB_VECTOR) {
858
- let vectorType = new VectorType(this.getField());
859
- for (let indx = 0; indx < temp.length; indx = indx + 1) {
860
- vectorType.setVecCell(indx + 1, temp.get_Item(indx), temp.get_Item(indx) === null);
861
- }
862
- result = vectorType.toString();
863
- }
864
- else {
865
- if (temp.length > 1) {
866
- result = temp.join(",");
867
- }
868
- else {
869
- result = temp.get_Item(0);
870
- }
871
- }
872
- return result;
873
- });
874
- }
875
- setText() {
876
- let displayLine = this.getDisplayLine(true);
877
- let mlsTranslatedValue = this.Value;
878
- if (super.isButton()) {
879
- mlsTranslatedValue = Events.Translate(this.Value);
880
- }
881
- if (this.isTextControl() || this.isButton())
882
- Commands.addValueWithLine(CommandType.SET_VALUE, this, displayLine, mlsTranslatedValue);
883
- else
884
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, displayLine, HtmlProperties.Text, mlsTranslatedValue);
885
- }
886
- setRadioChecked(index) {
887
- Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), index);
888
- Commands.beginInvoke();
889
- if (index !== GuiConstants.DEFAULT_VALUE_INT) {
890
- this.setControlToFocus();
891
- }
892
- }
893
- setControlToFocus() {
894
- if (this.getField() !== null) {
895
- this.getField().ControlToFocus = this;
896
- }
897
- }
898
- setCheckBoxValue(line, mgVal) {
899
- let checkState = DisplayConvertor.toBoolean(mgVal);
900
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, checkState);
901
- }
902
- refreshAndSetItemListByDataSource(line, valueChanged) {
903
- return __awaiter(this, void 0, void 0, function* () {
904
- if (this.SupportsDataSource()) {
905
- let currDcId = this.getDcRef();
906
- if (this._rangeChanged) {
907
- valueChanged = true;
908
- }
909
- this._rangeChanged = false;
910
- if (this.isDataCtrl() && currDcId !== this._dcValId) {
911
- valueChanged = true;
912
- yield this.refreshAndSetItemsList(line, true);
913
- this.setDcRef(this._dcValId);
914
- }
915
- }
916
- return valueChanged;
917
- });
918
- }
919
- setDcRef(dcId) {
920
- this._dcTableRefs.set_Item(this.getDcLineNum(), dcId);
921
- }
922
- setImageList(url) {
923
- }
924
- updatePropertyLogicNesting(propId, commandType, val, updateThis) {
925
- return __awaiter(this, void 0, void 0, function* () {
926
- if (updateThis) {
927
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
928
- }
929
- yield this.updateChildrenPropValue(propId, commandType, val);
930
- });
931
- }
932
- SetEnabled(val) {
933
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Enabled, val);
934
- }
935
- updateChildrenPropValue(propId, commandType, val) {
936
- const _super = Object.create(null, {
937
- isTableControl: { get: () => super.isTableControl },
938
- isSubform: { get: () => super.isSubform }
939
- });
940
- return __awaiter(this, void 0, void 0, function* () {
941
- if (!_super.isTableControl.call(this)) {
942
- for (let i = 0; i < this._linkedControls.length; i = i + 1) {
943
- let child = this._linkedControls.get_Item(i);
944
- if (child.IsFirstRefreshOfProps())
945
- continue;
946
- let childValue = (child.GetComputedBooleanProperty(propId, true));
947
- childValue = childValue && val;
948
- let childOnCurrentLayer = this.isChildOnCurrentLayer(child);
949
- if (commandType === CommandType.PROP_SET_VISIBLE) {
950
- if (childValue) {
951
- childValue = childOnCurrentLayer;
952
- }
953
- yield child.updateChildrenPropValue(propId, commandType, childValue);
954
- }
955
- }
956
- if (_super.isSubform.call(this)) {
957
- yield this.updateSubformChildrenPropValue(propId, commandType, val);
958
- }
959
- }
960
- });
961
- }
962
- isDescendentOfControl(control) {
963
- let isContained = false;
964
- if (control !== null) {
965
- let parent = this.getParent();
966
- if (parent instanceof MgControlBase) {
967
- if (parent === control) {
968
- isContained = true;
969
- }
970
- else {
971
- let parentControl = ((parent instanceof MgControlBase) ? parent : null);
972
- if (control.Type === MgControlType.CTRL_TYPE_COLUMN && parentControl !== null && parentControl.Type === MgControlType.CTRL_TYPE_TABLE && control.Layer === this.Layer)
973
- isContained = true;
974
- else
975
- isContained = (parent.isDescendentOfControl(control));
976
- }
977
- }
978
- }
979
- return isContained;
980
- }
981
- updateSubformChildrenPropValue(propId, commandType, val) {
982
- }
983
- isChildOnCurrentLayer(child) {
984
- let ret = true;
985
- if (super.isChoiceControl()) {
986
- let parentLayer = 0;
987
- if (this.Value !== null) {
988
- parentLayer = this.getCurrentLinkIdx() + 1;
989
- }
990
- let layer = child.getLayer();
991
- if (parentLayer !== layer && layer > 0) {
992
- ret = false;
993
- }
994
- }
995
- return ret;
996
- }
997
- getCurrentLinkIdx() {
998
- let currLinkIdx = 0;
999
- if (super.isChoiceControl() || this.HasAutocomplete()) {
1000
- let currentLayers = this.getCurrentIndexOfChoice();
1001
- let currLinkIndice = this.getLinkIdxFromLayer(currentLayers);
1002
- currLinkIdx = currLinkIndice[0];
1003
- }
1004
- return currLinkIdx;
1005
- }
1006
- getLayerFromLinkIdx(indice) {
1007
- let layers = new Array(indice.length);
1008
- for (let iCtr = 0; iCtr < indice.length; iCtr = iCtr + 1) {
1009
- let idx = indice[iCtr];
1010
- layers[iCtr] = idx;
1011
- if (super.isTabControl() && idx >= 0) {
1012
- let line = this.getDisplayLine(false);
1013
- if (line < 0) {
1014
- line = 0;
1015
- }
1016
- let layerList = this._choiceLayerList.get_Item(line);
1017
- if (layerList !== null && layerList.length > 0) {
1018
- layers[iCtr] = layerList.indexOf((idx + 1).toString());
1019
- }
1020
- }
1021
- }
1022
- return layers;
1023
- }
1024
- getLinkIdxFromLayer(layers) {
1025
- let linkIndice = new Array(layers.length);
1026
- for (let iCtr = 0; iCtr < layers.length; iCtr = iCtr + 1) {
1027
- let layer = layers[iCtr];
1028
- linkIndice[iCtr] = layer;
1029
- if (super.isTabControl()) {
1030
- if (layer < 0) {
1031
- linkIndice[iCtr] = 0;
1032
- }
1033
- else {
1034
- let line = this.getDisplayLine(false);
1035
- if (line < 0) {
1036
- line = 0;
1037
- }
1038
- let layerList = this._choiceLayerList.get_Item(line);
1039
- if (layerList !== null && typeof layerList !== "undefined" && layerList.length !== 0 && layer < layerList.length) {
1040
- linkIndice[iCtr] = NNumber.Parse(layerList[layer]) - 1;
1041
- }
1042
- }
1043
- }
1044
- }
1045
- return linkIndice;
1046
- }
1047
- isParentPropValue(propId) {
1048
- let column = this.Form.getControlColumn(this);
1049
- let parent = this.getLinkedParent(true);
1050
- let result;
1051
- if (parent === null) {
1052
- result = true;
1053
- }
1054
- else {
1055
- if (!parent.GetComputedBooleanProperty(propId, true)) {
1056
- result = false;
1057
- }
1058
- else {
1059
- if (!parent.isChildOnCurrentLayer(this)) {
1060
- result = false;
1061
- }
1062
- else {
1063
- result = (!(column !== null && !column.GetComputedBooleanProperty(propId, true)) && parent.isParentPropValue(propId));
1064
- }
1065
- }
1066
- }
1067
- return result;
1068
- }
1069
- getLinkedParent(checkSubformFather) {
1070
- if (this._linkedParentDitIdx !== -1) {
1071
- return this.Form.getCtrl(this._linkedParentDitIdx);
1072
- }
1073
- else {
1074
- if (checkSubformFather && this.Form.isSubForm()) {
1075
- return this.Form.getSubFormCtrl();
1076
- }
1077
- else {
1078
- return null;
1079
- }
1080
- }
1081
- }
1082
- SetCurrReadOnly(newVal) {
1083
- this._currReadOnly.set_Item(this.getDisplayLine(true), newVal);
1084
- }
1085
- GetCurrReadOnly() {
1086
- let line = super.isTableControl() ? 0 : this.getDisplayLine(true);
1087
- let currObj = this._currReadOnly.get_Item(line);
1088
- let curr;
1089
- if (currObj === null) {
1090
- curr = false;
1091
- this._currReadOnly.set_Item(line, curr);
1092
- }
1093
- else {
1094
- curr = currObj;
1095
- }
1096
- return curr;
1097
- }
1098
- isDataCtrl() {
1099
- return this._dataCtrl;
1100
- }
1101
- getDcRef() {
1102
- let line = this.getDcLineNum();
1103
- let obj = this._dcTableRefs.get_Item(this.getDcLineNum());
1104
- let dcId;
1105
- if (obj === null) {
1106
- dcId = -2;
1107
- this._dcTableRefs.set_Item(line, dcId);
1108
- }
1109
- else {
1110
- dcId = obj;
1111
- }
1112
- return dcId;
1113
- }
1114
- getDcLineNum() {
1115
- return this.IsRepeatable ? this.Form.DisplayLine : 0;
1116
- }
1117
- optionIsValid(option) {
1118
- let isValid = true;
1119
- if (this.DataType === StorageAttribute.NUMERIC && option.length > 0 && option.indexOf('0') === -1) {
1120
- let convertNum = new NUM_TYPE();
1121
- convertNum.num_4_a_std(option);
1122
- if (convertNum.num_is_zero()) {
1123
- isValid = false;
1124
- }
1125
- }
1126
- return isValid;
1127
- }
1128
- getOrderedDispList(choiceDispList, line) {
1129
- return __awaiter(this, void 0, void 0, function* () {
1130
- let choiceLayerStr = "";
1131
- let dispArryList = new List();
1132
- let layerArryList = new List();
1133
- let layerProp = this.getProp(PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST);
1134
- if (layerProp !== null) {
1135
- choiceLayerStr = yield layerProp.getValue();
1136
- }
1137
- if (choiceLayerStr === null || StrUtil.rtrim(choiceLayerStr).length === 0) {
1138
- choiceLayerStr = "";
1139
- }
1140
- if (choiceLayerStr.length > 0 && choiceDispList.length > 0) {
1141
- let layerList = choiceLayerStr.split(",");
1142
- let posCopyIndex = -1;
1143
- for (let index = 0; index < layerList.length; index = index + 1) {
1144
- let currLayerListVal = layerList[index].trim();
1145
- if (!(layerArryList.indexOf(currLayerListVal) !== -1)) {
1146
- let refPosCopyIndex = new RefParam(posCopyIndex);
1147
- let isNumber = NNumber.TryParse(currLayerListVal, refPosCopyIndex);
1148
- posCopyIndex = refPosCopyIndex.value;
1149
- if (isNumber && posCopyIndex > 0 && posCopyIndex <= choiceDispList.length) {
1150
- dispArryList.push((choiceDispList[posCopyIndex - 1]).trim());
1151
- layerArryList.push(currLayerListVal);
1152
- }
1153
- }
1154
- }
1155
- }
1156
- let result;
1157
- if (dispArryList.length === 0) {
1158
- result = choiceDispList;
1159
- this._choiceLayerList.set_Item(line, new Array(0));
1160
- }
1161
- else {
1162
- result = new Array(dispArryList.length);
1163
- for (let _ai = 0; _ai < result.length; ++_ai)
1164
- result[_ai] = null;
1165
- result = dispArryList.ToArray();
1166
- this._choiceLayerList.set_Item(line, layerArryList.ToArray());
1167
- }
1168
- return result;
1169
- });
1170
- }
1171
- resetPrevVal() {
1172
- let line = this.getDisplayLine(true);
1173
- if (line < 0) {
1174
- line = 0;
1175
- }
1176
- this._prevValues.set_Item(line, null);
1177
- this.setPrevIsNull_ToNull();
1178
- }
1179
- setPrevIsNull_ToNull() {
1180
- this._prevIsNulls.set_Item(this.getDisplayLine(true), null);
1181
- }
1182
- expressionSetAsData() {
1183
- return this._valExpId > 0;
1184
- }
1185
- clearRange(line) {
1186
- this._orgChoiceDisps.set_Item(line, null);
1187
- this._choiceDisps.set_Item(line, null);
1188
- this._choiceLinks.set_Item(line, null);
1189
- this._choiceLayerList.set_Item(line, null);
1190
- }
1191
- haveToCheckParentValue() {
1192
- let ret = false;
1193
- if (this._linkedParentDitIdx !== -1) {
1194
- if (!this.isContainedInLinkedParent()) {
1195
- ret = true;
1196
- }
1197
- else {
1198
- if (this.Form.getCtrl(this._linkedParentDitIdx).isTabControl() || this.Form.getCtrl(this._linkedParentDitIdx).isGroup()) {
1199
- ret = true;
1200
- }
1201
- }
1202
- }
1203
- else {
1204
- if (this.Form.isSubForm()) {
1205
- ret = true;
1206
- }
1207
- }
1208
- return ret;
1209
- }
1210
- isContainedInLinkedParent() {
1211
- return this._containerDitIdx !== -1 && this._containerDitIdx === this._linkedParentDitIdx;
1212
- }
1213
- static combineStringArrays(firstStrings, lastStrings) {
1214
- let result = new Array();
1215
- if (firstStrings !== null)
1216
- result = result.concat(firstStrings);
1217
- if (lastStrings !== null)
1218
- result = result.concat(lastStrings);
1219
- return result;
1220
- }
1221
- GetComputedBooleanProperty(propId, defaultRetVal, line) {
1222
- if (arguments.length === 2 && (propId === null || propId.constructor === Number) && (defaultRetVal === null || defaultRetVal.constructor === Boolean)) {
1223
- return this.GetComputedBooleanProperty_0(propId, defaultRetVal);
1224
- }
1225
- return this.GetComputedBooleanProperty_1(propId, defaultRetVal, line);
1226
- }
1227
- GetComputedBooleanProperty_0(propId, defaultRetVal) {
1228
- let result = defaultRetVal;
1229
- let prop = this.GetComputedProperty(propId);
1230
- if (prop !== null) {
1231
- result = prop.GetComputedValueBoolean();
1232
- }
1233
- return result;
1234
- }
1235
- GetComputedBooleanProperty_1(propId, defaultRetVal, line) {
1236
- let result = defaultRetVal;
1237
- if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1238
- let prop = this.GetComputedProperty(propId);
1239
- if (prop !== null) {
1240
- let val = prop.getPrevValue(line);
1241
- if (val !== null) {
1242
- result = DisplayConvertor.toBoolean(val);
1243
- }
1244
- }
1245
- }
1246
- else {
1247
- result = this.GetComputedBooleanProperty(propId, defaultRetVal);
1248
- }
1249
- return result;
1250
- }
1251
- checkPropWithLine(propId, defaultRetVal, line) {
1252
- return __awaiter(this, void 0, void 0, function* () {
1253
- let result = defaultRetVal;
1254
- if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1255
- let prop = this.getProp(propId);
1256
- if (prop !== null) {
1257
- let val = prop.getPrevValue(line);
1258
- if (val !== null) {
1259
- result = DisplayConvertor.toBoolean(val);
1260
- }
1261
- }
1262
- }
1263
- else {
1264
- result = yield this.checkProp(propId, defaultRetVal);
1265
- }
1266
- return result;
1267
- });
1268
- }
1269
- checkProp(propId, defaultRetVal) {
1270
- return __awaiter(this, void 0, void 0, function* () {
1271
- let result = defaultRetVal;
1272
- let prop = this.getProp(propId);
1273
- if (prop !== null) {
1274
- result = yield prop.getValueBoolean();
1275
- }
1276
- return result;
1277
- });
1278
- }
1279
- isPropertyRepeatable(propId) {
1280
- let isRepeatable = this.IsRepeatable;
1281
- if (isRepeatable) {
1282
- return true;
1283
- }
1284
- else {
1285
- return super.isTableControl() && Property.isRepeatableInTable();
1286
- }
1287
- }
1288
- SetAndRefreshDisplayValue(mgVal, isNull) {
1289
- const _super = Object.create(null, {
1290
- isChoiceControl: { get: () => super.isChoiceControl },
1291
- isTabControl: { get: () => super.isTabControl },
1292
- isCheckBox: { get: () => super.isCheckBox },
1293
- isImageControl: { get: () => super.isImageControl },
1294
- IsImageButton: { get: () => super.IsImageButton },
1295
- isSelectionCtrl: { get: () => super.isSelectionCtrl }
1296
- });
1297
- return __awaiter(this, void 0, void 0, function* () {
1298
- let dcRangeIsEmpty = true;
1299
- if (mgVal === null) {
1300
- this.Value = "";
1301
- if (!isNull)
1302
- mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1303
- }
1304
- else {
1305
- if (_super.isChoiceControl.call(this)) {
1306
- let line = this.getDisplayLine(true);
1307
- if (line < 0) {
1308
- line = 0;
1309
- }
1310
- let layers = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(mgVal, line, isNull));
1311
- if (layers[0] < 0 && _super.isTabControl.call(this)) {
1312
- layers[0] = 0;
1313
- mgVal = yield this.getLinkValue(layers[0].toString(), line);
1314
- isNull = false;
1315
- if (this._field !== null && mgVal !== null) {
1316
- yield this._field.getTask().UpdateFieldValueAndStartRecompute(this._field, mgVal, isNull);
1317
- }
1318
- }
1319
- this.Value = Misc.GetCommaSeperatedString(layers);
1320
- dcRangeIsEmpty = false;
1321
- }
1322
- }
1323
- if (dcRangeIsEmpty) {
1324
- if (!_super.isCheckBox.call(this) && (this._field === null || !isNull || !this._field.hasNullDisplayValue())) {
1325
- try {
1326
- if ((_super.isImageControl.call(this) && this.DataType === StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
1327
- this.Value = mgVal;
1328
- }
1329
- else {
1330
- if ((this._field === null && isNull) && (this.DataType === StorageAttribute.NUMERIC || this.DataType === StorageAttribute.DATE || this.DataType === StorageAttribute.TIME || this.DataType === StorageAttribute.BOOLEAN)) {
1331
- this.Value = mgVal;
1332
- }
1333
- else {
1334
- let inControl = this.InControl;
1335
- this.Value = DisplayConvertor.Instance.mg2disp(mgVal, this._range, this._pic, true, _super.isSelectionCtrl.call(this), this.getForm().getTask().getCompIdx(), inControl);
1336
- }
1337
- }
1338
- if (typeof this.Value === 'string' && (!this._pic.isAttrNumeric() || this._pic.isLeft())) {
1339
- this.rtrimValue();
1340
- }
1341
- }
1342
- catch (innerException) {
1343
- if (innerException instanceof ApplicationException) {
1344
- Events.WriteExceptionToLog(new ApplicationException(NString.Format("Control: '{0}', mgval: {1}", this.Name, mgVal), innerException));
1345
- this.Value = "";
1346
- mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1347
- }
1348
- else
1349
- throw innerException;
1350
- }
1351
- }
1352
- else {
1353
- if (this.isCheckBox())
1354
- this.Value = DisplayConvertor.toBoolean(mgVal);
1355
- else
1356
- this.Value = mgVal;
1357
- }
1358
- }
1359
- if ((_super.isImageControl.call(this) && this.DataType !== StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
1360
- mgVal = Events.TranslateLogicalName(mgVal);
1361
- }
1362
- this.IsNull = isNull;
1363
- yield this.RefreshDisplayValue(mgVal);
1364
- });
1365
- }
1366
- UpdateModifiedByUser(newValue) {
1367
- if (!(super.isButton() || super.isImageControl())) {
1368
- let ctrlCurrIsNull = this.IsNull;
1369
- let valChanged = (this.isDifferentValue(newValue, false, false));
1370
- if (!valChanged) {
1371
- if (this.CanGetNullFromControlValue()) {
1372
- valChanged = (ctrlCurrIsNull !== this.isNullValue(newValue));
1373
- }
1374
- }
1375
- if (valChanged || this.KeyStrokeOn) {
1376
- this.ModifiedByUser = true;
1377
- }
1378
- }
1379
- }
1380
- rtrimValue() {
1381
- if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1382
- this.Value = NString.TrimEnd(this.Value);
1383
- }
1384
- else {
1385
- let minimumValueLength = this.getMinimumValueLength();
1386
- if (this.Value.length > minimumValueLength) {
1387
- let str = this.Value.substr(minimumValueLength);
1388
- this.Value = this.Value.substr(0, minimumValueLength);
1389
- this.Value = this.Value + StrUtil.rtrimWithNull(str, true);
1390
- }
1391
- if (super.isTextControl() && this.DataType === StorageAttribute.NUMERIC) {
1392
- this.Value = NString.TrimEnd(this.Value);
1393
- }
1394
- }
1395
- }
1396
- getMinimumValueLength() {
1397
- let minLength = this._pic.getMaskLength();
1398
- while (minLength > 0 && !this._pic.picIsMask(minLength - 1)) {
1399
- minLength = minLength - 1;
1400
- }
1401
- return minLength;
1402
- }
1403
- isNullValue(str) {
1404
- let retIsNullControl = false;
1405
- if (this.CanGetNullFromControlValue() && str === "") {
1406
- retIsNullControl = true;
1407
- }
1408
- return retIsNullControl;
1409
- }
1410
- CanGetNullFromControlValue() {
1411
- return false;
1412
- }
1413
- isChoiceNull(idx) {
1414
- let result;
1415
- if (idx >= 0) {
1416
- let dcVals = this.getDcVals();
1417
- return dcVals.isNull(idx);
1418
- }
1419
- else {
1420
- return result;
1421
- }
1422
- }
1423
- ComputeAndRefreshDisplayValue(forceRefresh) {
1424
- const _super = Object.create(null, {
1425
- isTableControl: { get: () => super.isTableControl },
1426
- isColumnControl: { get: () => super.isColumnControl }
1427
- });
1428
- return __awaiter(this, void 0, void 0, function* () {
1429
- if (forceRefresh) {
1430
- this.resetPrevVal();
1431
- }
1432
- if (this._valExpId > 0) {
1433
- let wasEvaluated;
1434
- let refWasEvaluated = new RefParam(wasEvaluated);
1435
- let retExp = yield this.EvaluateExpression(this._valExpId, this.DataType, this._pic.getSize(), true, StorageAttribute.SKIP, false, refWasEvaluated);
1436
- wasEvaluated = refWasEvaluated.value;
1437
- if (wasEvaluated) {
1438
- yield this.SetAndRefreshDisplayValue(retExp, retExp === null);
1439
- }
1440
- }
1441
- else {
1442
- if (this._field !== null) {
1443
- let value = NString.Empty;
1444
- let isNull = false;
1445
- let refValue = new RefParam(value);
1446
- let refIsNull = new RefParam(isNull);
1447
- this._field.getTask().getFieldDisplayValue(this._field, refValue, refIsNull);
1448
- value = refValue.value;
1449
- isNull = refIsNull.value;
1450
- yield this.SetAndRefreshDisplayValue(value, isNull);
1451
- }
1452
- else {
1453
- if (!_super.isTableControl.call(this) && !_super.isColumnControl.call(this)) {
1454
- yield this.RefreshDisplayValue(this.Value);
1455
- }
1456
- }
1457
- }
1458
- });
1459
- }
1460
- ShouldRefreshOnControlEnter() {
1461
- return this.Type === MgControlType.CTRL_TYPE_TEXT && this.getField() !== null && (this.getField().getType() === StorageAttribute.DATE ||
1462
- this.getField().getType() === StorageAttribute.TIME || this.getField().getType() === StorageAttribute.NUMERIC);
1463
- }
1464
- RefreshDisplayValue(mgVal) {
1465
- const _super = Object.create(null, {
1466
- isChoiceControl: { get: () => super.isChoiceControl }
1467
- });
1468
- return __awaiter(this, void 0, void 0, function* () {
1469
- let line = this.getDisplayLine(true);
1470
- let valueChanged = true;
1471
- let saveValueChanged = valueChanged;
1472
- if (line < 0) {
1473
- line = 0;
1474
- }
1475
- try {
1476
- let prevValue = this._prevValues.get_Item(line);
1477
- let prevNull = this.getPrevIsNull();
1478
- if (StorageAttributeCheck.IsTypeAlphaOrUnicode(this.DataType)) {
1479
- if (StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue) ||
1480
- (mgVal !== null && StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue))) {
1481
- valueChanged = false;
1482
- }
1483
- if (prevNull !== this.IsNull) {
1484
- valueChanged = true;
1485
- }
1486
- }
1487
- else {
1488
- ;
1489
- if (mgVal === prevValue || (mgVal !== null && mgVal === prevValue))
1490
- valueChanged = false;
1491
- if (prevNull !== this.IsNull)
1492
- valueChanged = true;
1493
- }
1494
- this._prevValues.set_Item(line, mgVal);
1495
- this.setPrevIsNull(this.IsNull);
1496
- switch (this.Type) {
1497
- case MgControlType.CTRL_TYPE_TABLE:
1498
- case MgControlType.CTRL_TYPE_COLUMN:
1499
- case MgControlType.CTRL_TYPE_LABEL:
1500
- case MgControlType.CTRL_TYPE_SUBFORM:
1501
- case MgControlType.CTRL_TYPE_GROUP:
1502
- case MgControlType.CTRL_TYPE_STATUS_BAR:
1503
- case MgControlType.CTRL_TYPE_FRAME_SET:
1504
- case MgControlType.CTRL_TYPE_CONTAINER:
1505
- case MgControlType.CTRL_TYPE_FRAME_FORM:
1506
- case MgControlType.CTRL_TYPE_SB_LABEL:
1507
- case MgControlType.CTRL_TYPE_LINE:
1508
- return;
1509
- case MgControlType.CTRL_TYPE_BROWSER:
1510
- if (valueChanged && this.Value != null)
1511
- this.setUrl();
1512
- return;
1513
- case MgControlType.CTRL_TYPE_IMAGE:
1514
- case MgControlType.CTRL_TYPE_SB_IMAGE:
1515
- if (valueChanged && this.Value != null)
1516
- this.setImage();
1517
- return;
1518
- case MgControlType.CTRL_TYPE_CHECKBOX:
1519
- if (valueChanged || this.forceRefresh)
1520
- this.setCheckBoxValue(line, mgVal);
1521
- return;
1522
- case MgControlType.CTRL_TYPE_TAB:
1523
- case MgControlType.CTRL_TYPE_COMBO:
1524
- case MgControlType.CTRL_TYPE_LIST:
1525
- saveValueChanged = valueChanged;
1526
- valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
1527
- if (valueChanged) {
1528
- let prevDisplayValue = null;
1529
- if (saveValueChanged === valueChanged) {
1530
- if (prevValue !== null) {
1531
- prevDisplayValue = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(prevValue, line, prevNull));
1532
- for (let i = 0; i < prevDisplayValue.length; i = i + 1) {
1533
- if (prevDisplayValue[i] === GuiConstants.DEFAULT_VALUE_INT) {
1534
- prevDisplayValue[i] = GuiConstants.DEFAULT_LIST_VALUE;
1535
- }
1536
- }
1537
- }
1538
- }
1539
- let indice = Misc.GetIntArray(this.Value);
1540
- if (this.isTabControl()) {
1541
- let currentLayer = this.getCurrentLinkIdx();
1542
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedValue, indice[0].toString());
1543
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedLayer, currentLayer.toString());
1544
- }
1545
- if (this.IsMultipleSelectionListBox()) {
1546
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, indice);
1547
- }
1548
- else
1549
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, +this.Value);
1550
- }
1551
- break;
1552
- case MgControlType.CTRL_TYPE_BUTTON:
1553
- case MgControlType.CTRL_TYPE_TEXT:
1554
- if (this.HasAutocomplete())
1555
- yield this.refreshAndSetItemListByDataSource(line, valueChanged);
1556
- if (valueChanged) {
1557
- if (this.IsImageButton()) {
1558
- this.setImageWithFileName(this.Value);
1559
- }
1560
- else
1561
- this.setText();
1562
- }
1563
- else
1564
- return;
1565
- break;
1566
- case MgControlType.CTRL_TYPE_RADIO:
1567
- valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
1568
- if (!valueChanged)
1569
- return;
1570
- this.setRadioChecked(this.Value);
1571
- break;
1572
- default:
1573
- Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() unknown type: {0}", this.Type));
1574
- return;
1575
- }
1576
- if (_super.isChoiceControl.call(this) && valueChanged)
1577
- yield this.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, yield this.checkProp(PropInterface.PROP_TYPE_VISIBLE, true), false);
1578
- }
1579
- catch (ex_360) {
1580
- if (ex_360 instanceof Exception) {
1581
- Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() for control: {0}", this.Name));
1582
- }
1583
- else
1584
- throw ex_360;
1585
- }
1586
- });
1587
- }
1588
- RefreshDisplay(onlyRepeatableProps) {
1589
- return __awaiter(this, void 0, void 0, function* () {
1590
- if (isNullOrUndefined(onlyRepeatableProps))
1591
- onlyRepeatableProps = false;
1592
- yield this.RefreshDisplay_1(onlyRepeatableProps);
1593
- });
1594
- }
1595
- RefreshDisplay_1(onlyRepeatableProps) {
1596
- const _super = Object.create(null, {
1597
- isSubform: { get: () => super.isSubform }
1598
- });
1599
- return __awaiter(this, void 0, void 0, function* () {
1600
- if (!(_super.isSubform.call(this) && this.GetSubformMgForm() !== null && this.GetSubformMgForm().inRefreshDisplay())) {
1601
- yield this.refreshProperties(onlyRepeatableProps);
1602
- if (this.ShouldComputeAndRefreshOnClosedForm()) {
1603
- yield this.ComputeAndRefreshDisplayValue(false);
1604
- }
1605
- let isParkableCtrl = !(yield this.isParkable(false)) || !(yield this.isModifiable());
1606
- if (this.GetCurrReadOnly() !== isParkableCtrl) {
1607
- this.SetCurrReadOnly(isParkableCtrl);
1608
- yield Manager.SetReadOnlyControl(this, isParkableCtrl);
1609
- }
1610
- let mustInputProperty = this.GetComputedProperty(PropInterface.PROP_TYPE_MUST_INPUT);
1611
- if (mustInputProperty != null && mustInputProperty.isExpression()) {
1612
- let prevMustInput = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1613
- if (prevMustInput !== (yield this.checkProp(PropInterface.PROP_TYPE_MUST_INPUT, false)))
1614
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, !prevMustInput);
1615
- }
1616
- if (!this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_TAB_IN, true))
1617
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.TabIndex, -1);
1618
- }
1619
- });
1620
- }
1621
- ShouldComputeAndRefreshOnClosedForm() {
1622
- return true;
1623
- }
1624
- refreshProperties(onlyRepeatableProps) {
1625
- return __awaiter(this, void 0, void 0, function* () {
1626
- if (this._field !== null && this.DataType !== StorageAttribute.NONE && this._firstRefreshProperties)
1627
- Commands.addWithNumber(CommandType.SET_ATTRIBUTE, this, this.DataType.charCodeAt(0));
1628
- if (this._propTab !== null) {
1629
- try {
1630
- if (this._firstRefreshProperties) {
1631
- this.createDefaultProps();
1632
- yield this.ZoomButtonInitialization();
1633
- }
1634
- if (!(yield this._propTab.RefreshDisplay(false, onlyRepeatableProps))) {
1635
- Events.WriteExceptionToLog(NString.Format("Control '{0}': Not all properties could be set", this.getName()));
1636
- }
1637
- if (this._firstRefreshProperties) {
1638
- if (!onlyRepeatableProps) {
1639
- this._firstRefreshProperties = false;
1640
- }
1641
- }
1642
- }
1643
- catch (ex) {
1644
- if (ex instanceof Exception) {
1645
- let msg = new StringBuilder(NString.Format("Control '{0}': {1}", this.getName(), ex.Message));
1646
- Events.WriteExceptionToLog(msg.ToString());
1647
- }
1648
- else
1649
- throw ex;
1650
- }
1651
- }
1652
- });
1653
- }
1654
- refreshTabForLayerList(line) {
1655
- return __awaiter(this, void 0, void 0, function* () {
1656
- let currentLinkValue = null;
1657
- if (this.getForm().Opened) {
1658
- let indice = this.getCurrentIndexOfChoice();
1659
- let currentLayer = indice[0];
1660
- currentLinkValue = yield this.getLinkValue(currentLayer.toString(), line);
1661
- }
1662
- yield this.refreshAndSetItemsList(line, false);
1663
- if (this.getForm().Opened) {
1664
- yield this.SetAndRefreshDisplayValue(currentLinkValue, this.IsNull);
1665
- }
1666
- });
1667
- }
1668
- refreshAndSetItemsListForRadioButton(line, execComputeChoice) {
1669
- return __awaiter(this, void 0, void 0, function* () {
1670
- let displayList = yield this.refreshDispRange(execComputeChoice);
1671
- let options = displayList.map((displayValue, counter) => {
1672
- let index = counter.toString();
1673
- return { index, displayValue };
1674
- });
1675
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1676
- });
1677
- }
1678
- refreshAndSetItemsList(line, execComputeChoice) {
1679
- const _super = Object.create(null, {
1680
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
1681
- isTabControl: { get: () => super.isTabControl },
1682
- isRadio: { get: () => super.isRadio }
1683
- });
1684
- return __awaiter(this, void 0, void 0, function* () {
1685
- if (execComputeChoice) {
1686
- this.clearRange(line);
1687
- }
1688
- let optionsStrings = yield this.refreshDispRange(execComputeChoice);
1689
- if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this) || this.HasAutocomplete()) {
1690
- let options = optionsStrings.map((displayValue, index) => {
1691
- return { index, displayValue };
1692
- });
1693
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1694
- }
1695
- else {
1696
- if (_super.isRadio.call(this)) {
1697
- yield this.refreshAndSetItemsListForRadioButton(line, execComputeChoice);
1698
- }
1699
- }
1700
- });
1701
- }
1702
- refreshDispRange(execComputeChoice) {
1703
- return __awaiter(this, void 0, void 0, function* () {
1704
- let selectCmd = new Array(0);
1705
- let line = this.getDisplayLine(true);
1706
- if (line < 0) {
1707
- line = 0;
1708
- }
1709
- if (this.SupportsDataSource()) {
1710
- let dataView = this.getForm().getTask().DataView;
1711
- let dcv = dataView.getDcValues(this._dcValId);
1712
- let dispVals = yield this.getDispVals(line, execComputeChoice);
1713
- if (this._hasValidItmAndDispVal) {
1714
- selectCmd = MgControlBase.combineStringArrays(dispVals, dcv.getDispVals());
1715
- }
1716
- }
1717
- else {
1718
- selectCmd = yield this.getDispVals(line, execComputeChoice);
1719
- }
1720
- this._rangeChanged = true;
1721
- return yield this.getOrderedDispList(selectCmd, line);
1722
- });
1723
- }
1724
- refreshItmRange(execComputeChoice) {
1725
- return __awaiter(this, void 0, void 0, function* () {
1726
- Debug.Assert(this.SupportsDataSource());
1727
- let orderedItmList = new Array(0);
1728
- let line = this.getDisplayLine(false);
1729
- if (line < 0) {
1730
- line = 0;
1731
- }
1732
- if (execComputeChoice) {
1733
- yield this.computeChoice(line);
1734
- }
1735
- let linkVals = this._choiceLinks.get_Item(line);
1736
- let dataView = this.getForm().getTask().DataView;
1737
- let dcv = dataView.getDcValues(this._dcValId);
1738
- if (this._hasValidItmAndDispVal) {
1739
- orderedItmList = MgControlBase.combineStringArrays(linkVals, dcv.GetLinkVals());
1740
- }
1741
- return yield this.getOrderedDispList(orderedItmList, line);
1742
- });
1743
- }
1744
- GetItemsRange() {
1745
- return __awaiter(this, void 0, void 0, function* () {
1746
- return yield this.refreshItmRange(false);
1747
- });
1748
- }
1749
- GetDisplayRange() {
1750
- return __awaiter(this, void 0, void 0, function* () {
1751
- return yield this.refreshDispRange(false);
1752
- });
1753
- }
1754
- createDefaultProps() {
1755
- this.getProp(PropInterface.PROP_TYPE_VISIBLE);
1756
- this.getProp(PropInterface.PROP_TYPE_ENABLED);
1757
- if (super.isTableControl()) {
1758
- this.getProp(PropInterface.PROP_TYPE_SCROLL_BAR);
1759
- }
1760
- }
1761
- setLinkedParentIdx(linkedParentDitIdx) {
1762
- this._linkedParentDitIdx = linkedParentDitIdx;
1763
- }
1764
- buildPicture(oldVal, val) {
1765
- if (super.isTableControl() || super.isColumnControl())
1766
- return null;
1767
- if (this._picExpExists) {
1768
- this._vd = null;
1769
- }
1770
- if (this._vd === null) {
1771
- this._vd = new ValidationDetails(oldVal, val, this._range, this._pic, this);
1772
- }
1773
- else {
1774
- this._vd.setValue(val);
1775
- this._vd.setOldValue(oldVal);
1776
- }
1777
- return this._vd;
1778
- }
1779
- isDifferentValue(newValue, isNull, checkNullValue) {
1780
- let ctrlCurrValue = this.Value;
1781
- let valChanged = false;
1782
- if (newValue instanceof Date) {
1783
- if (this.DataType === StorageAttribute.DATE)
1784
- valChanged = !this.CompareDate(newValue, ctrlCurrValue);
1785
- else
1786
- valChanged = !this.CompareTime(newValue, ctrlCurrValue);
1787
- }
1788
- if (typeof newValue === 'boolean' || typeof newValue === 'number') {
1789
- if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string') {
1790
- let newValuestr = newValue.toString();
1791
- valChanged = (newValuestr !== ctrlCurrValue);
1792
- }
1793
- else {
1794
- valChanged = (newValue !== ctrlCurrValue);
1795
- }
1796
- }
1797
- else {
1798
- if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string' && Array.isArray(newValue)) {
1799
- let newValueStr = newValue.join(',').toString();
1800
- valChanged = !(StrUtil.rtrim(newValueStr) === StrUtil.rtrim(ctrlCurrValue));
1801
- }
1802
- else {
1803
- let ctrlCurrIsNull = this.IsNull;
1804
- valChanged = !(StrUtil.rtrim(newValue) === StrUtil.rtrim(ctrlCurrValue));
1805
- if (!valChanged && checkNullValue) {
1806
- valChanged = (isNull !== ctrlCurrIsNull);
1807
- }
1808
- }
1809
- }
1810
- return valChanged;
1811
- }
1812
- CompareDate(d1, d2) {
1813
- let retval;
1814
- if (d1 === null && d2 === null)
1815
- retval = true;
1816
- else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1817
- retval = false;
1818
- else if (d1.getFullYear() === d2.getFullYear()
1819
- && d1.getDate() === d2.getDate()
1820
- && d1.getMonth() === d2.getMonth())
1821
- retval = true;
1822
- return retval;
1823
- }
1824
- CompareTime(d1, d2) {
1825
- let retval;
1826
- if (d1 === null && d2 === null)
1827
- retval = true;
1828
- else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1829
- retval = false;
1830
- else if (d1.getHours() === d2.getHours()
1831
- && d1.getMinutes() === d2.getMinutes()
1832
- && d1.getSeconds() === d2.getSeconds())
1833
- retval = true;
1834
- return retval;
1835
- }
1836
- isColumnSortable() {
1837
- let isSortable = false;
1838
- if (this.Type === MgControlType.CTRL_TYPE_COLUMN && this._propTab.propExists(PropInterface.PROP_TYPE_SORT_COLUMN)) {
1839
- isSortable = this.GetComputedProperty(PropInterface.PROP_TYPE_SORT_COLUMN).GetComputedValueBoolean();
1840
- }
1841
- return isSortable;
1842
- }
1843
- getColumnChildControl() {
1844
- if (this.Type !== MgControlType.CTRL_TYPE_COLUMN)
1845
- return null;
1846
- let linkedControls = this._parentTable.getLinkedControls();
1847
- return linkedControls.find((control) => (control.getLayer() === this.getLayer() && control.Type !== MgControlType.CTRL_TYPE_COLUMN && !control.IsTableHeaderChild));
1848
- }
1849
- getControlNameForHandlerSearch() {
1850
- let childControl = this.getColumnChildControl();
1851
- let name;
1852
- if (childControl !== null) {
1853
- return childControl.Name;
1854
- }
1855
- else
1856
- return this.Name;
1857
- }
1858
- linkCtrl(ctrl) {
1859
- this._linkedControls.push(ctrl);
1860
- }
1861
- removeRefFromField() {
1862
- if (this._field !== null) {
1863
- this._field.RemoveControl(this);
1864
- }
1865
- }
1866
- getDitIdx() {
1867
- return this._ditIdx;
1868
- }
1869
- setDcValId(dcValId) {
1870
- this._dcValId = dcValId;
1871
- }
1872
- SetKeyboardLanguage() {
1873
- Commands.beginInvoke();
1874
- }
1875
- Init() {
1876
- }
1877
- IsParkable() {
1878
- return __awaiter(this, void 0, void 0, function* () {
1879
- return yield this.isParkable(true);
1880
- });
1881
- }
1882
- HasExpOrParentTaskField() {
1883
- let task = this.getForm().getTask();
1884
- return (this.getField() === null || this.getField().getTask() !== task);
1885
- }
1886
- isParkable(checkEnabledAndVisible) {
1887
- const _super = Object.create(null, {
1888
- isTableControl: { get: () => super.isTableControl },
1889
- isColumnControl: { get: () => super.isColumnControl },
1890
- isSubform: { get: () => super.isSubform },
1891
- isBrowserControl: { get: () => super.isBrowserControl }
1892
- });
1893
- return __awaiter(this, void 0, void 0, function* () {
1894
- let result;
1895
- result = !_super.isTableControl.call(this) && !_super.isColumnControl.call(this);
1896
- let task = this.getForm().getTask();
1897
- if (result) {
1898
- result = task.IsInteractive;
1899
- }
1900
- if (result && task.DataView.isEmptyDataview() && this._field !== null && this._field.PartOfDataview) {
1901
- result = false;
1902
- }
1903
- if (result) {
1904
- if (!_super.isSubform.call(this)) {
1905
- result = ((this._field !== null && this._field.getTask() === task) || this.isButton() || _super.isBrowserControl.call(this));
1906
- }
1907
- if (result && checkEnabledAndVisible) {
1908
- result = (this.isEnabled() && this.isVisible());
1909
- }
1910
- if ((result && this._parentTable !== null) && checkEnabledAndVisible) {
1911
- result = (this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true) && this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true));
1912
- }
1913
- }
1914
- return result;
1915
- });
1916
- }
1917
- RaiseControlHitOnLeftClickOfMouseDown() {
1918
- let raiseCtrlHit = false;
1919
- if (!super.IsHyperTextButton() && !super.isRadio() && !super.isTabControl()) {
1920
- raiseCtrlHit = true;
1921
- }
1922
- return raiseCtrlHit;
1923
- }
1924
- GetVarIndex() {
1925
- return 0;
1926
- }
1927
- RaiseControlHitOnMouseDown(leftClickWasPressed) {
1928
- let raiseCtrlHit = false;
1929
- if (leftClickWasPressed) {
1930
- if (this.RaiseControlHitOnLeftClickOfMouseDown()) {
1931
- raiseCtrlHit = true;
1932
- }
1933
- }
1934
- return raiseCtrlHit;
1935
- }
1936
- OnSubformClick() {
1937
- Manager.EventsManager.addGuiTriggeredEventWithTaskAndCode(this.getForm().getTask(), InternalInterface.MG_ACT_HIT);
1938
- }
1939
- GetSubformMgForm() {
1940
- return null;
1941
- }
1942
- PropertyExists(id) {
1943
- return this._propTab.propExists(id);
1944
- }
1945
- toString() {
1946
- return "{" + this.constructor.name + ": " + MgControlType[this.Type] + "}";
1947
- }
1948
- isDateZero(val) {
1949
- let zeroDate = false;
1950
- if (val instanceof Date) {
1951
- if (val.getMonth() === 0 && val.getFullYear() === 0 && val.getDay() === 0)
1952
- zeroDate = true;
1953
- }
1954
- return zeroDate;
1955
- }
1956
- IsDefaultRouterOutlet() {
1957
- return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_DEFAULT_OUTLET, false));
1958
- }
1959
- IsRouterOutlet() {
1960
- return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_IS_ROUTER_OUTLET, false));
1961
- }
1962
- ZoomButtonInitialization() {
1963
- return __awaiter(this, void 0, void 0, function* () {
1964
- if (this.isTextControl() && this.checkIfExistProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)) {
1965
- let connectedButton = this.Form.CtrlTab.GetControlByIsn((yield (yield this.getProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)).getValueInt()));
1966
- let imageFileName = null;
1967
- if (connectedButton.IsImageButton() && connectedButton.PropertyExists(PropInterface.PROP_TYPE_IMAGE_FILENAME)) {
1968
- imageFileName = yield (yield connectedButton.getProp(PropInterface.PROP_TYPE_IMAGE_FILENAME)).getValue();
1969
- if (!Misc.IsWebUrl(imageFileName))
1970
- imageFileName = "./assets/images/" + imageFileName;
1971
- Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, imageFileName);
1972
- }
1973
- this.ConnectedControl = connectedButton;
1974
- connectedButton.ConnectedControl = this;
1975
- }
1976
- });
1977
- }
1978
- }
1979
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMs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RiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgRGVidWcsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFJlZlBhcmFtLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7R3VpTWdDb250cm9sfSBmcm9tICcuLi8uLi9ndWkvR3VpTWdDb250cm9sJztcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7R3VpRmllbGRCYXNlfSBmcm9tICcuLi9kYXRhL0d1aUZpZWxkQmFzZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2hvaWNlVXRpbHMsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIE1hZ2ljUHJvcGVydGllcyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIE1pc2MsXHJcbiAgU0VRXzJfU1RSLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtNZ0Zvcm1CYXNlfSBmcm9tICcuL01nRm9ybUJhc2UnO1xyXG5pbXBvcnQge1BJQ30gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQge1Byb3BUYWJsZX0gZnJvbSAnLi9Qcm9wVGFibGUnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25EZXRhaWxzfSBmcm9tICcuL1ZhbGlkYXRpb25EZXRhaWxzJztcclxuaW1wb3J0IHtGaWVsZERlZn0gZnJvbSAnLi4vZGF0YS9GaWVsZERlZic7XHJcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gJy4vUHJvcGVydHknO1xyXG5pbXBvcnQge0d1aVRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7TWFuYWdlcn0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7Q29tbWFuZHN9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSAnLi9Qcm9wSW50ZXJmYWNlJztcclxuaW1wb3J0IHtFdmVudHN9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7RGNWYWx1ZXMsIEVNUFRZX0RDUkVGfSBmcm9tICcuLi9kYXRhL0RjVmFsdWVzJztcclxuaW1wb3J0IHtHdWlEYXRhVmlld0Jhc2V9IGZyb20gJy4uL2RhdGEvR3VpRGF0YVZpZXdCYXNlJztcclxuaW1wb3J0IHtEaXNwbGF5Q29udmVydG9yfSBmcm9tICcuL0Rpc3BsYXlDb252ZXJ0b3InO1xyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtWZWN0b3JUeXBlfSBmcm9tICcuLi9kYXRhL1ZlY3RvclR5cGUnO1xyXG5pbXBvcnQge09iamVjdFJlZmVyZW5jZX0gZnJvbSAnLi4vLi4vdXRpbC9PYmplY3RSZWZlcmVuY2UnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZH0gZnJvbSAndXRpbCc7XHJcbmltcG9ydCB7R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcn0gZnJvbSAnLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyJztcclxuaW1wb3J0IHtGb2N1c01hbmFnZXJ9IGZyb20gJy4uLy4uL0ZvY3VzTWFuYWdlcic7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBkYXRhIGZvciA8Y29udHJvbD4gLi4uPC9jb250cm9sPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nQ29udHJvbEJhc2UgZXh0ZW5kcyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcblxyXG4gIC8vIGZpeGVkIGRlZmVjdCAjOjgxNDk4LCB3aGlsZSBSVCBpcyBzZXQgZGVmYXVsdCB2YWx1ZSB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGNvbnRyb2xcclxuICAvLyB0byB0aGUgdmFsdWUgd2lsbCBzZXQgdG8gdGhlIGNvbnRyb2xcclxuXHJcbiAgX2RpdElkeDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9saW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7IC8vIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGlzIGNvbnRyb2xcclxuICBfZmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2xcclxuICBwcml2YXRlIF9waWNTdHI6IHN0cmluZyA9IG51bGw7XHJcbiAgX2Nob2ljZURpc3BzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGhvbGRzIHRoZVxyXG4gIF9jaG9pY2VMYXllckxpc3Q6IExpc3Q8c3RyaW5nW10+ID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9uIHdoaWNoIHRhYnMgdG8gYmUgZGlzcGxheWVkXHJcbiAgX2Nob2ljZUxpbmtzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIGhvbGRzIHRoZVxyXG4gIF9jaG9pY2VOdW1zOiBMaXN0PE5VTV9UWVBFW10+ID0gbnVsbDsgIC8vIGZvciBTRUxFQ1QgY29udHJvbHMsIHdpdGggbnVtZXJpY1xyXG4gIHByaXZhdGUgX2NvbnRhaW5lckRpdElkeDogbnVtYmVyID0gLTE7XHJcbiAgX2N1cnJSZWFkT25seTogTGlzdDxib29sZWFuPiA9IG51bGw7IC8vIGEgaGlzdG9yeSBhcnJheSBmb3IgcmVhZG9ubHkgcGFyYW1cclxuICBwcml2YXRlIF9kYXRhQ3RybDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUaGUgZGF0YSBjb250cm9sIGZsYWcgc3RhdGVzIHRoYXQgdGhpc1xyXG4gIF9kY1RhYmxlUmVmczogTGlzdDxudW1iZXI+ID0gbnVsbDsgLy8gcmVmZXJlbmNlcyB0byBkY1ZhbHMgZm9yIGVhY2ggbGluZSBvZiBhIGNvbnRyb2wgaXMgYSBkYXRhIGNvbnRyb2xcclxuICBwcml2YXRlIF9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9mb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9oYXNWYWxpZEl0bUFuZERpc3BWYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gLTE7IC8vIENvbnRyb2xJc24gb2YgdGhlIGNvbnRyb2wgKGZvciBzdWJmb3JtKVxyXG4gIHByaXZhdGUgX2NvbnRyb2xJc246IG51bWJlciA9IC0xOyAvLyBmb3IgY3VycmVudCBpc25cclxuXHJcbiAgcHJpdmF0ZSBfbGlua2VkUGFyZW50RGl0SWR4OiBudW1iZXIgPSAtMTsgLy8gbm90IHRyaWdnZXIgYW55IGV2ZW50IGhhbmRsZXIsIHdoaWxlIHBhcmtpbmcgaW4gdGhpcyBjb250cm9sXHJcbiAgX29yZ0Nob2ljZURpc3BzOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIGZvciBUQUIgQ29udHJvbCBzYXZlIHRoZSBvcmcgb3B0aW9uICh3aXRoIHRoZSAmKVxyXG4gIF9wYXJlbnRUYWJsZTogTWdDb250cm9sQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byBwYXJlbnQgTWFnaWMgVGFibGUgZm9yXHJcbiAgX3BpYzogUElDID0gbnVsbDtcclxuICBwcml2YXRlIF9waWNFeHBFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfcHJldklzTnVsbHM6IExpc3Q8Ym9vbGVhbj4gPSBudWxsOyAvLyBmb3IgTlVMTFxyXG4gIHByaXZhdGUgX3ByZXZQaWNFeHBSZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgX3ByZXZWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IG51bGw7IC8vIHJlZmVyZW5jZXMgdG8gcHJldmlvdXMgdmFsdWVzIG9mIHRoZVxyXG4gIF9wcm9wVGFiOiBQcm9wVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JhbmdlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JhbmdlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCB0cnVlIGlmIHRoZWlyIHJhbmdlXHJcbiAgcHJpdmF0ZSBfcnRmVmFsOiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5OyAvLyBmaWVsZCB0byBzdG9yZSB0aGUgcnRmIHRleHQgb2YgcmljaCBlZGl0IGNvbnRyb2xcclxuICBfdmFsRXhwSWQ6IG51bWJlciA9IDA7IC8vIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgZXhwcmVzc2lvblxyXG4gIHByaXZhdGUgX3ZkOiBWYWxpZGF0aW9uRGV0YWlscyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZGNWYWxJZDogbnVtYmVyID0gLTI7XHJcbiAgcGFyZW50OiBudW1iZXIgPSAwO1xyXG4gIHZlZUluZHg6IG51bWJlciA9IDA7XHJcbiAgRE5PYmplY3RSZWZlcmVuY2VGaWVsZDogRmllbGREZWYgPSBudWxsO1xyXG4gIFNvdXJjZVRhYmxlUmVmZXJlbmNlOiBPYmplY3RSZWZlcmVuY2UgPSBudWxsO1xyXG4gIENsaXBCb2FyZERhdGFFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBEYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTtcclxuICBLZXlTdHJva2VPbjogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIHRoZSB1c2VyIHByZXNzZWQgYSBrZXlcclxuICBNb2RpZmllZEJ5VXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIElzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcmNlUmVmcmVzaCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc01vZGFsIDogYm9vbGVhbjsgLy9hcHBsaWNhYmxlIGZvciBzdWJmb3JtLCBpZiBzdWJmb3JtIGlzIE1vZGFsXHJcblxyXG4gIHByb3RlY3RlZCBzZXQgRm9ybSh2YWx1ZTogTWdGb3JtQmFzZSkge1xyXG4gICAgdGhpcy5fZm9ybSA9IHZhbHVlO1xyXG4gICAgdGhpcy5HdWlNZ0Zvcm0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgQ29udHJvbElzbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xJc247XHJcbiAgfVxyXG5cclxuICBSZWZyZXNoT25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7IC8vIHRydWUsIGlmIHRoZSBzdWJmb3JtIG11c3QgYmUgcmVmcmVzaGVkIG9uIGJlY29tZSB2aXNpYmxlXHJcbiAgSW5Db250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgVmFsaWRhdGVDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJvbXB0SGVscDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8gdGhlIHByb21wdCBoZWxwIHRleHQgYXNzaWduZWQgdG8gY29udHJvbFxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlPzogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtPzogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbD86IG51bWJlcikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEodHlwZSwgcGFyZW50TWdGb3JtLCBwYXJlbnRDb250cm9sKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpbmtlZENvbnRyb2xzID0gbmV3IExpc3Q8TWdDb250cm9sQmFzZT4oKTtcclxuICAgIHRoaXMuRGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEodHlwZTogTWdDb250cm9sVHlwZSwgcGFyZW50TWdGb3JtOiBNZ0Zvcm1CYXNlLCBwYXJlbnRDb250cm9sOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5pbml0UmVmZXJlbmNlcyhwYXJlbnRNZ0Zvcm0pO1xyXG4gICAgdGhpcy5UeXBlID0gdHlwZTtcclxuICAgIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9IHBhcmVudENvbnRyb2w7XHJcbiAgICB0aGlzLl9saW5rZWRQYXJlbnREaXRJZHggPSBwYXJlbnRDb250cm9sO1xyXG4gICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcbiAgICB0aGlzLmNyZWF0ZUFycmF5cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgVW5pcXVlTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBUYXNrVGFnKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtLmdldFRhc2soKS5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2hlY2tJZkV4aXN0UHJvcChwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcEJ5SWQ6IFByb3BlcnR5ID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBleGlzdCA9IChwcm9wQnlJZCAhPT0gbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIElkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgZ2V0UHJvcChwcm9wSWQ6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgPT09IG51bGwpIHtcclxuICAgICAgICBwcm9wID0gUHJvcGVydHkuZ2V0RGVmYXVsdFByb3AocHJvcElkLCAnQycsIHRoaXMpO1xyXG5cclxuICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIC8vIGluIGFkZGl0aW9uIGFkZCB0aGlzIHByb3BlcnR5IHRvIHRoZSBwcm9wZXJ0aWVzIHRhYmxlXHJcbiAgICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuX3Byb3BUYWIuYWRkUHJvcChwcm9wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZvcm0gb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5Gb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb21wSWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGZpcnN0IHJlZnJlc2hcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSXNGaXJzdFJlZnJlc2hPZlByb3BzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXhwSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1R5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxlbmd0aFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNDZWxsVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWx3YXlzRXZhbHVhdGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIndhc0V2YWx1YXRlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbiwgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkLCByZXNUeXBlLCBsZW5ndGgsIGNvbnRlbnRUeXBlVW5pY29kZSwgcmVzQ2VsbFR5cGUsIGFsd2F5c0V2YWx1YXRlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5HZXRFeHByZXNzaW9uU3RvcmFnZShleHBJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sIHRoYXQgYWxyZWFkeSB3YXMgY29tcHV0ZWRcclxuICAvLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIGEgcHJvcGVydHkgaWYgaXQgaXNuJ3QgZXhpc3QuXHJcbiAgLy8vIE1heSB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHByb3BlcnR5IGFuZCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuXHJcbiAgLy8vIEluIFBoYXNlIDIgaW4gUmVmcmVzaFByb3BlcnRpZXMgbWV0aG9kIHdlJ2xsIGNyZWF0ZSBhbmQgY29tcHV0ZSBwcm9wZXJ0aWVzLFxyXG4gIC8vLyBwZXJoYXBzIHdlIG5lZWQgY3JlYXRlIGFsbCBwcm9wZXJ0aWVzIG5vdCBvbmx5IHRob3NlIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIEdldENvbXB1dGVkUHJvcGVydHkocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKVxyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5pdGlhbGl6aW5nIG9mIGlubmVyIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+cmVmZXJlbmNlIHRvIHRoZSB0YXNrIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRSZWZlcmVuY2VzKG1nRm9ybTogTWdGb3JtQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5Gb3JtID0gbWdGb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluIHRoZSBmaXJzdCB0aW1lIHRoYXQgd2UgcmVmcmVzaCB0aGUgY29udHJvbCBuZWVkIHRvIGNyZWF0ZSBhcnJheXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VDcmVhdGVBcnJheXNcIj5jcmVhdGUgYXJyYXlzIGluIGFueSBjYXNlPC9wYXJhbT5cclxuICBjcmVhdGVBcnJheXMoZm9yY2VDcmVhdGVBcnJheXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzIHx8IGZvcmNlQ3JlYXRlQXJyYXlzKSB7XHJcblxyXG4gICAgICAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBhbHdheXMgaW5pdGlhbGl6ZSBEQyB0YWJsZSBzaW5jZSB3ZSB1c2UgaXQgdG8gbWVyZ2UgY2hvaWNlcyBmcm9tIHRoZVxyXG4gICAgICAvLyBwcm9wIGxpc3Qgd2l0aCBjaG9pY2VzIGZyb20gdGhlIERBVEEgQ09OVFJPTC5cclxuICAgICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgICB0aGlzLl9kY1RhYmxlUmVmcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlZhbHVlcyA9IG5ldyBMaXN0KCk7XHJcblxyXG4gICAgICAvLyBUaGUgcHJvcGVydHkgUFJPUF9TRVRfUkVBRF9PTkxZIGlzIHNldCBvbmx5IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gQnkgZGVmYXVsdFxyXG4gICAgICAvLyB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLCBzbyB3ZSBkbyBub3Qgc2V0IGl0LlxyXG4gICAgICAvLyBCdXQgZm9yIHRoZSBwaGFudG9tIHRhc2sgaWYgdGhpcyBwcm9wZXJ0eSB3YXMgdHJ1ZSwgYW5kIHdlIGV4aXQgdGhlIHBoYW50b20gYW5kIGFnYWluIGVudGVyIGludG9cclxuICAgICAgLy8gdGhpcyBwaGFudG9tIHRoZSBwcm9wZXJ0eSBiZWNvbWVzIGZhbHNlLlxyXG4gICAgICAvLyBTbyB3ZSBuZWVkIHRvIHNhdmUgdGhlIHByZXZpb3VzIF9jdXJyUmVhZE9ubHkgdmFsdWUgZm9yIHRoZSBwaGFudG9tIHRhc2suXHJcbiAgICAgIGlmICghZm9yY2VDcmVhdGVBcnJheXMpIHtcclxuICAgICAgICB0aGlzLl9jdXJyUmVhZE9ubHkgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2Nob2ljZURpc3BzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VMaW5rcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZU51bXMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxscyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdCA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIGlmICghdGhpcy5Jc1JlcGVhdGFibGUgJiYgIXN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFycmF5cygxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0cyB0aGUgZm9jdXMgb24gdGhlIGNvbnRyb2wgYW5kIHJlZnJlc2hlcyBwcm9tcHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Q29udHJvbCB0byBoYXZlIGZvY3VzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+bGluZSBudW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlZnJlc2hQcm9tcHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFjdGl2YXRlRm9ybVwiPndoZXRoZXIgdG8gYWN0aXZhdGUgYSBmb3JtIGFmdGVyIHNldGZvY3VzIG9yIG5vdDwvcGFyYW0+XHJcbiAgYXN5bmMgU2V0Rm9jdXMoY3RybDogTWdDb250cm9sQmFzZSwgbGluZTogbnVtYmVyLCBhY3RpdmF0ZUZvcm06IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCksIGN0cmwsIGxpbmUsIGFjdGl2YXRlRm9ybSk7XHJcbiAgfVxyXG5cclxuICBJbnNlcnRBcnJheXMoaWR4OiBudW1iZXIsIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG5cclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5JbnNlcnRSYW5nZShuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX2Nob2ljZURpc3BzLkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3MuSW5zZXJ0UmFuZ2UoIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0Lkluc2VydFJhbmdlKCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX2Nob2ljZU51bXMuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSlcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuSW5zZXJ0UmFuZ2UobmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcm9wVGFiLkluc2VydFByZXZWYWx1ZUFycmF5KCBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIGFycmF5J3Mgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG5ld1NpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlQXJyYXlzKG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJvcFRhYi51cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWxBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+dG8gcGFyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGl0aWR4XCI+bnVtYmVyIG9mIHRoZSBDb250cm9sIGluIENvbnRyb2wgVGFibGU8L3BhcmFtPlxyXG4gIGZpbGxEYXRhKG1nRm9ybTogTWdGb3JtQmFzZSwgZGl0SWR4OiBudW1iZXIsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Gb3JtID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMobWdGb3JtKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RpdElkeCA9IGRpdElkeDtcclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBkYXRhdHlwZSBpcyBCTE9CLCBpdHMgcGljdHVyZSB3b3VsZCBiZSBibGFuay4gQnV0IGFmdGVyIHZlcnNpb24gIzk3XHJcbiAgICAvLyBvZiBBcHBTZXJpYWxpemVyLmNzIChjaGFuZ2VkIGZvciAjNDg1NzIyKSwgYmxhbmsgcGljdHVyZSBpcyBub3Qgc2VyaWFsaXplZC5cclxuICAgIC8vIFNvLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IHRvIGJsYW5rIGhlcmUuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3BpY1N0ciA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9waWNTdHIgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3BpY1N0ciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5EYXRhVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICB0aGlzLnNldFBJQyh0aGlzLl9waWNTdHIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUpXHJcbiAgICAgICAgICAgIHRoaXMuRGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9HUk9VUDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT05UQUlORVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSU5FOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5maWxsRGF0YSgpOiBtaXNzaW5nIGRhdGF0eXBlIG9yIHBpY3R1cmUgc3RyaW5nIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuRm9ybS5zZXRUYWJsZUN0cmwodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNyZWF0ZUFycmF5cyhmYWxzZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGlmIG5leHQgdGFnIGlzIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Byb3BUYWIgPT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcblxyXG4gICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdDJywgcGFyc2VyKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgdGhpcy5wYXJzZUF0dHJpYnV0ZXMocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCJTb3VyY2VUYWJsZVwiKVxyXG4gICAgICB0aGlzLlBhcnNlU291cmNlVGFibGUocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBDb250cm9sLiBJbnNlcnQgZWxzZSBpZiB0byBDb250cm9sLmluaXRJbm5lck9iamVjdHMgZm9yIHswfVwiLCBmb3VuZFRhZ05hbWUpKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQYXJzZVNvdXJjZVRhYmxlKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICBsZXQgb2JqUmVmU3RyOiBzdHJpbmcgPSBwYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgbGV0IHNvdXJjZVRhYmxlUmVmZXJlbmNlOiBPYmplY3RSZWZlcmVuY2UgPSBPYmplY3RSZWZlcmVuY2UuRnJvbVhNTChvYmpSZWZTdHIudHJpbSgpKTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVRhYmxlUmVmZXJlbmNlID0gc291cmNlVGFibGVSZWZlcmVuY2U7XHJcbiAgICAvLyBTa2lwIHRoZSBjbG9zaW5nIDwvcHJvcD4gdGFnXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjb250cm9sIGZyb20gdGhlIFhNTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwYXJzZUF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKS8qJ1wiJyovO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpICsgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuU2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIDEpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBDb250cm9sLkZpbGxOYW1lKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCB0aGUgY29udHJvbCBhdHRyaWJ1dGVzIGluIHBhcnNpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RZUEU6XHJcbiAgICAgICAgdGhpcy5UeXBlID0gdmFsdWVTdHJbMF0gYXMgTWdDb250cm9sVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9EQVRBX0NUUkw6XHJcbiAgICAgICAgdGhpcy5fZGF0YUN0cmwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTElOS0VEX1BBUkVOVDpcclxuICAgICAgICB0aGlzLnNldExpbmtlZFBhcmVudElkeChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVEFJTkVSOlxyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICB0aGlzLl9pZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfSVNOOlxyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xJc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19NT0RBTDpcclxuICAgICAgICB0aGlzLl9pc01vZGFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfWl9PUkRFUjpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0hPUl9BTElHTUVOVF9JU19JTkhFUklURUQ6XHJcbiAgICAgICAgLy9UT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBpbWFnZSBvbiB0aGUgY29udHJvbCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmlsZU5hbWVcIj48L3BhcmFtPlxyXG4gIHNldEltYWdlKCk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChuZXdWYWwgPT09IG51bGwgfHwgdGhpcy5Jc051bGwpIHtcclxuICAgICAgbmV3VmFsID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgLy8gVE9ETyAtIGNoZWNrIGlmIHNob3VsZCBiZSBzdXBwb3J0ZWQgLlxyXG4gICAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9JTUFHRV9EQVRBLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgQmxvYlR5cGUuZ2V0Qnl0ZXMobmV3VmFsKSwgcHJvcC5nZXRWYWx1ZUludCgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldEltYWdlV2l0aEZpbGVOYW1lKG5ld1ZhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbWFnZVdpdGhGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZmlsZU5hbWUgPT09IG51bGwpIHtcclxuICAgICAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgZmlsZU5hbWUgPSBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWUoZmlsZU5hbWUpO1xyXG5cclxuICAgIGlmICghTWlzYy5Jc1dlYlVybChmaWxlTmFtZSkpXHJcbiAgICAgIGZpbGVOYW1lID0gXCIuL2Fzc2V0cy9pbWFnZXMvXCIgKyBmaWxlTmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1NUWUxFLCB0aGlzLCAwLCBNYWdpY1Byb3BlcnRpZXMuSW1hZ2VGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuSW1hZ2UsIGZpbGVOYW1lKTtcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSBsYXlvdXQgb25seSBpZiB0aGUgcmFkaW8gaXMgbm90IG9uIHRhYmxlLiBmb3IgdGFibGUsIGl0IGlzIGRvbmVcclxuICAgIC8vIGZyb20gTGdSYWRpb0NvbnRhaW5lci5zZXRTcGVjaWZpY0NvbnRyb2xQcm9wZXJ0aWVzKCkuXHJcblxyXG4gICAgLy8gaWYgKHN1cGVyLmlzUmFkaW8oKSAmJiAhdGhpcy5Jc1JlcGVhdGFibGUpIHtcclxuICAgIC8vICAgQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuRVhFQ1VURV9MQVlPVVQsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmYWxzZSk7XHJcbiAgICAvL31cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbnRhaW5lcklkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXIoY29udGFpbmVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9IGNvbnRhaW5lcklkeDtcclxuICAgIGxldCBjb250YWluZXI6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTEpIHtcclxuICAgICAgY29udGFpbmVyID0gdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fY29udGFpbmVyRGl0SWR4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udGFpbmVyICE9PSBudWxsICYmIGNvbnRhaW5lci5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIHRoaXMuSXNSZXBlYXRhYmxlID0gKHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBuYW1lIG9mIHRoZSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBpZiAodGhpcy5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgLy8gICByZXR1cm4gc3VwZXIuZ2V0TmFtZSh0aGlzLkZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZENvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZENvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1JlcGVhdGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgfVxyXG5cclxuICBJc01vZGFsKCkgOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGN1cnJlbnQgZGlzcGxheSBsaW5lIG9mIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXNlTGluZUZvckl0ZW1zXCI+aWYgdHJ1ZSwgdXNlIGN1cnJlbnQgbGluZSBmb3IgdHJlZTwvcGFyYW0+XHJcbiAgZ2V0RGlzcGxheUxpbmUodXNlTGluZUZvckl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNSZXBlYXRhYmxlIHx8ICh1c2VMaW5lRm9ySXRlbXMgJiYgc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGluZSA9IHRoaXMuRm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH1cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyB2aXNpYmlsaXR5IGNvbnNpZGVyaW5nIHBhcmVudCB2aXNpYmlsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgZW5hYmxlZCBjb25zaWRlcmluZyBwYXJlbnQgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIG1vZGlmaWFibGUgYW5kIHRoZSB0YXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01vZGlmaWFibGUoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWFibGU6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEUsIHRydWUpO1xyXG4gICAgbGV0IHRhc2tJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWTtcclxuICAgIGxldCBtb2RpZnlJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbW9kaWZpYWJsZSAmJiAobW9kaWZ5SW5RdWVyeSB8fCAhdGFza0luUXVlcnkpO1xyXG4gICAgaWYgKHJlc3VsdCAmJiB0aGlzLl9maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLl9maWVsZC5EYk1vZGlmaWFibGUgfHwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBkYyB2YWx1ZXMgb2YgdGhpcyBkYXRhIGNvbnRyb2wgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjVmFscygpOiBEY1ZhbHVlcyB7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9kY1ZhbElkID09PSBFTVBUWV9EQ1JFRikge1xyXG4gICAgICBkY3YgPSAoKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gZGF0YVZpZXcuZ2V0RW1wdHlDaG9pY2VGb3JWZWN0b3JzKCkgOiBkYXRhVmlldy5nZXRFbXB0eUNob2ljZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZGNWYWxJZCA+IC0xKSB7XHJcbiAgICAgICAgZGN2ID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkY3Y7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdXJyZW50IGlzTnVsbCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBQcmV2SXNOdWxsIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldFByZXZJc051bGwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9wcmV2SXNOdWxscy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbShsaW5lLCBjdXJyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdXJyID0gPGJvb2xlYW4+Y3Vyck9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByZXZJc051bGwgdmFsdWUgb2YgdGhlIHByZXZJc051bGwgYXJyYXlcclxuICAvLy8gICB0aGUgbmV3VmFsdWUgY2FuIGJlIE5VTEwgb3IgYm9vbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBzZXRQcmV2SXNOdWxsKG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPjwvcGFyYW0+XHJcbiAgc2V0UElDKHBpY1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IChzdXBlci5Jc0ltYWdlQnV0dG9uKCkgPyBcIlwiICsgWE1MQ29uc3RhbnRzLkZJTEVfTkFNRV9TSVpFLnRvU3RyaW5nKCkgOiBFdmVudHMuVHJhbnNsYXRlKHBpY1N0cikpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IHBpY1N0cjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BpYyA9IG5ldyBQSUModGhpcy5fcGljU3RyLCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZGF0YUN0cmwgJiYgdGhpcy5fcGljU3RyLmluZGV4T2YoJ0gnKSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3BpYy5zZXRIZWJyZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZTwvcmV0dXJucz5cclxuICBnZXRQSUMoKTogUElDIHtcclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuXHJcbi8vLyA8cmV0dXJucz4gdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbCBjYW4gYmUgVGFibGVcXFRhYlxcQ2hvaWNlIGNvbnRyb2xcXEZvcm08L3JldHVybnM+XHJcbiAgZ2V0UGFyZW50KCk6IGFueSB7XHJcbiAgICBsZXQgcmV0UGFyZW50OiBhbnkgPSB0aGlzLkZvcm07XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFBhcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaWVsZCBhdHRhY2hlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RmllbGQoKTogR3VpRmllbGRCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9maWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IHRoZSBmaWVsZCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRcIj48L3BhcmFtPlxyXG4gIHNldEZpZWxkKGZpZWxkT3JGaWVsZFN0cklEOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZE9yRmllbGRTdHJJRCA9PT0gbnVsbCB8fCBmaWVsZE9yRmllbGRTdHJJRCBpbnN0YW5jZW9mIEd1aUZpZWxkQmFzZSkge1xyXG4gICAgICB0aGlzLnNldEZpZWxkXzAoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZpZWxkXzEoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0RmllbGRfMChmaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWVsZCA9IGZpZWxkO1xyXG4gICAgaWYgKGZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbCBieSBhIHN0cmluZyBmaWVsZCBpZGVudGlmaWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+dGhlIGZpZWxkIGlkZW50aWZpZXI6IFwicGFyZW50SWQsZmllbGRJZHhcIi9wYXJhbT5cclxuICBwcml2YXRlIHNldEZpZWxkXzEoZmllbGRTdHJJRDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcmV0dXJuRmllbGQ6IEd1aUZpZWxkQmFzZSA9IHRoaXMuZ2V0RmllbGRCeVZhbHVlU3RyKGZpZWxkU3RySUQpO1xyXG4gICAgaWYgKHJldHVybkZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkID0gcmV0dXJuRmllbGQ7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIENvbnRyb2wuc2V0RmllbGQoKTogaWxsZWdhbCBmaWVsZCBpZGVudGlmaWVyOiBcIiArIGZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtYXRcIj50aGUgZm9ybWF0IHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBJZFwiPmFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm1hdDwvcGFyYW0+XHJcbiAgc2V0UGljU3RyKGZvcm1hdDogc3RyaW5nLCBleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9waWNTdHIgPSBmb3JtYXQ7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIHRoaXMuX3BpY0V4cEV4aXN0cyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmFuZ2Ugb2YgdGhlIGNvbnRyb2wgYW5kIGNsZWFycyB0aGUgbWFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdSYW5nZVwiPmlzIHRoZSBuZXcgcmFuZ2U8L3BhcmFtPlxyXG4gIHNldFJhbmdlKG5ld1JhbmdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JhbmdlID0gbmV3UmFuZ2U7XHJcbiAgICB0aGlzLl92ZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YSByZWZlcmVuY2UgdG8gdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIHNldFZhbEV4cChleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWxFeHBJZCA9IGV4cElkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscyB3aXRoIG5ldyAmIG9sZCB2YWx1ZSB3aXRob3V0IGNoYW5naW5nIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZFZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBidWlsZENvcHlQaWN0dXJlKG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpIHx8IHN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBjb3B5VkQ6IFZhbGlkYXRpb25EZXRhaWxzID0gdGhpcy5nZXRDb3B5T2ZWRCgpO1xyXG4gICAgICBjb3B5VkQuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgICAgY29weVZELnNldE9sZFZhbHVlKG9sZFZhbCk7XHJcbiAgICAgIHJldHVybiBjb3B5VkQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgY29weSBvZiB2YWxpZGF0aW9uIGRldGFpbHMsIHdpdGhvdXQgaW5mbHVlbmNlIHRvIHRoZSByZWFsIHZhbGlkYXRpb24gZGV0YWlsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRDb3B5T2ZWRCgpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIGlmICh0aGlzLl92ZCA9PT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5WYWx1ZSwgdGhpcy5WYWx1ZSwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKHRoaXMuX3ZkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlZCB2YWx1ZSBmb3IgaW5wdXQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJhbmdlZFZhbHVlKG5ld1ZhbDogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgdmQgPSB0aGlzLmJ1aWxkQ29weVBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGxldCB2YWw6IGFueSAgPSB2ZC5nZXREaXNwVmFsdWUoKVxyXG4gICAgcmV0dXJuICh2YWwudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdXNlciBpbnB1dFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdmFsaWRhdGUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICBsZXQgbW9kaWZpZWQ6IGJvb2xlYW4gPSB0aGlzLk1vZGlmaWVkQnlVc2VyO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRDb3B5UGljdHVyZSh0aGlzLlZhbHVlLCBuZXdWYWwpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSBtb2RpZmllZDtcclxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZHMgdmFsdWUgd2FzIHdyb25nXHJcbiAgICBpZiAodmQuVmFsaWRhdGlvbkZhaWxlZClcclxuICAgICAgcmV0dXJuIHZkLkVycm9yTWVzc2FnZTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlWYWx1ZVN0cih2YWx1ZVN0cjogc3RyaW5nKTogR3VpRmllbGRCYXNlIHtcclxuXHJcbiAgICBsZXQgcmVmUGFyZW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4odGhpcy5wYXJlbnQpO1xyXG4gICAgbGV0IHJlZlZlZUluZHg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPih0aGlzLnZlZUluZHgpO1xyXG4gICAgbGV0IHJldDogR3VpRmllbGRCYXNlID0gPEd1aUZpZWxkQmFzZT50aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyLCByZWZQYXJlbnQsIHJlZlZlZUluZHgpO1xyXG4gICAgdGhpcy5wYXJlbnQgPSByZWZQYXJlbnQudmFsdWU7XHJcbiAgICB0aGlzLnZlZUluZHggPSByZWZWZWVJbmR4LnZhbHVlO1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgaGFzIGNvbnRhaW5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBoYXNDb250YWluZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIGxheWVyIG9mIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGF5ZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkxheWVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSBwaWMgdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljRXhwUmVzdWx0XCI+dGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZSA8L3JldHVybnM+XHJcbiAgY29tcHV0ZVBJQyhwaWNFeHBSZXN1bHQ6IHN0cmluZyk6IFBJQyB7XHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgbGV0IHBpY1Jlc3VsdDogc3RyaW5nID0gKHBpY0V4cFJlc3VsdCAhPT0gbnVsbCAmJiBzdXBlci5pc0J1dHRvbigpKSA/IEV2ZW50cy5UcmFuc2xhdGUocGljRXhwUmVzdWx0KSA6IHBpY0V4cFJlc3VsdDtcclxuXHJcbiAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgcGljdHVyZSBvbmx5IGlmIHRoZSBleHByZXNzaW9uIHJlc3VsdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMgcmVzdWx0XHJcbiAgICBpZiAodGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9PT0gbnVsbCB8fCAhKHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPT09IHBpY1Jlc3VsdCkpIHtcclxuICAgICAgdGhpcy5fcGljID0gbmV3IFBJQyhwaWNSZXN1bHQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICB0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID0gcGljUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hvaWNlIGluIHRoZSBjaG9pY2UgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmluZGV4IG9mIHRoZSBjdXJyZW50IGNob2ljZTwvcmV0dXJucz5cclxuICBnZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRJbmRpY2U6IG51bWJlcltdID0gWy0xXTtcclxuXHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpIHtcclxuICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSB2YWwuc3BsaXQoJywnLyonLCcqLyk7XHJcbiAgICAgIHNlbGVjdGVkSW5kaWNlID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkyLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBhcnJheTIubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgICBsZXQgbnVtOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGFycmF5MltpQ3RyXSk7XHJcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VbaUN0cl0gPSAoKG51bSA+PSAwKSA/IG51bSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaXMgbXVsdGkgc2VsZWN0aW9uIGxpc3QgYm94IGVsc2UgZmFsc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN1cGVyLmlzTGlzdEJveCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaWYgY29udHJvbCBwaWN0dXJlIGlzIGRhdGUgb3IgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0RhdGVUaW1lUGljdHVyZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9waWMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fcGljLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBzdXBwb3J0IGRhdGEgc291cmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFN1cHBvcnRzRGF0YVNvdXJjZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCBzdXBlci5pc1JhZGlvKCkgfHwgdGhpcy5IYXNBdXRvY29tcGxldGUoKSA7XHJcbiAgfVxyXG5cclxuICBIYXNBdXRvY29tcGxldGUoKSB7XHJcbiAgICBpZiAoc3VwZXIuaXNUZXh0Q29udHJvbCgpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQykuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgYXJyYXkgb2YgaW5kaWNlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmaWMgbGluayB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSByZXF1ZXN0ZWQgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNOdWxsXCI+dHJ1ZSBpZiBtZ1ZhbCByZXByZXNlbnRzIGEgbnVsbCB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhcnJheSBvZiBpbmRpY2U8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0SW5kZXhPZkNob2ljZShtZ1ZhbDogc3RyaW5nLCBsaW5lOiBudW1iZXIsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8bnVtYmVyW10+IHtcclxuXHJcbiAgICAvLyBpZiB0aGUgY29udHJvbCBpcyBsaXN0Ym94IHdpdGggc2luZ2xlIHNlbGVjdGlvbiBtb2RlLCBhbmQgdGhlIHZhbHVlIGlzIGNvbW1hIHNlcGFyYXRlZCwgdGhlbiB3ZSBzaG91bGQgbm90IHNwbGl0IHZhbHVlIG9uIGNvbW1hLlxyXG4gICAgbGV0IHNwbGl0Q29tbWFTZXBlcmF0ZWRWYWxzOiBib29sZWFuID0gdGhpcy5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuXHJcbiAgICBsZXQgaXNWZWN0b3JWYWx1ZTogYm9vbGVhbiA9IHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGNWYWxzKCkuZ2V0SW5kZXhPZihtZ1ZhbCwgaXNWZWN0b3JWYWx1ZSwgaXNOdWxsLCB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKSwgdGhpcy5fY2hvaWNlTnVtcy5nZXRfSXRlbShsaW5lKSwgc3BsaXRDb21tYVNlcGVyYXRlZFZhbHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBwYXJzZWQgY29udGVudCBvZiBQUk9QX1RZUEVfRElTUExBWV9MSVNUPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldERpc3BWYWxzKGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBpZiAoZXhlY0NvbXB1dGVDaG9pY2UpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vcmdDaG9pY2VEaXNwcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY2hvaWNlRGlzcHMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZW1wdHlDaG9pY2UobGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWU6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMCk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9vcmdDaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5zZXRfSXRlbShsaW5lLCB2YWx1ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMYXllckxpc3Quc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSBjaG9pY2VzIG9mIGEgU0VMRUNUIGNvbnRyb2wgdGhhdCBvcmlnaW5hdGUgZnJvbSB0aGUgY29udHJvbCdzIHByb3BlcnRpZXMgKGluIGNvbnRyYXN0IHRvXHJcbiAgLy8vICAgdGhlIG9uZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgdW5kZXJsYXlpbmcgdGFibGUgb2YgYSBkYXRhIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDaG9pY2UobGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZnJvbUhlbHA6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlxcXFxcXFxcXCIsIFwiXFxcXC1cIiwgXCJcXFxcLFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRvSGVscDogc3RyaW5nW10gPSBbXHJcbiAgICAgIFwiWFhcIiwgXCJYWFwiLCBcIlhYXCJcclxuICAgIF07XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgbGV0IGN1cnJEY0lkOiBudW1iZXIgPSB0aGlzLmdldERjUmVmKCk7XHJcbiAgICBsZXQgY2hvaWNlRGlzcFN0cjogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBjaG9pY2VMaW5rU3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IG9wdGlvbnNWYWxpZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgdHJpbVRvTGVuZ3RoOiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBkYXRhVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuRGF0YVR5cGU7XHJcbiAgICBsZXQgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAvLyByZS1jb21wdXRlIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIG5vdCB2YWxpZCBvciB0aGUgREMgd2FzIGNoYW5nZWQgKGR1ZSB0b0hlbHAgcmVjb21wdXRlKVxyXG4gICAgICBpZiAodGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSkgPT09IG51bGwgfHwgKHRoaXMuaXNEYXRhQ3RybCgpICYmIGN1cnJEY0lkICE9PSB0aGlzLl9kY1ZhbElkKSkge1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgZGF0YVR5cGUgPSB0aGlzLmdldEZpZWxkKCkuZ2V0Q2VsbHNUeXBlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkaXNwVmFsczogc3RyaW5nW10gPSBkY3YuZ2V0RGlzcFZhbHMoKTtcclxuICAgICAgICBsZXQgZGlzcFByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVCk7XHJcbiAgICAgICAgbGV0IGxpbmtQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCk7XHJcbiAgICAgICAgaWYgKGRpc3BQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gYXdhaXQgZGlzcFByb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxpbmtQcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gYXdhaXQgbGlua1Byb3AuZ2V0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNob2ljZUxpbmtTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VMaW5rU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hvaWNlRGlzcFN0ciA9PT0gbnVsbCB8fCBTdHJVdGlsLnJ0cmltKGNob2ljZURpc3BTdHIpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzRGF0YUN0cmwoKSB8fCBkaXNwVmFscyA9PT0gbnVsbCB8fCBkaXNwVmFscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGNob2ljZUxpbmtTdHI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IChjaG9pY2VMaW5rU3RyID0gXCJcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2hvaWNlRGlzcFN0ciA9IEV2ZW50cy5UcmFuc2xhdGUoY2hvaWNlRGlzcFN0cik7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHtcclxuICAgICAgICAgIGNob2ljZUxpbmtTdHIgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlTGlua1N0ciwgXCJcXFxcLVwiLCBcIi1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWxwU3RyOiBzdHJpbmcgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlTGlua1N0ciwgZnJvbUhlbHAsIHRvSGVscCk7XHJcbiAgICAgICAgbGV0IHNUb2s6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShoZWxwU3RyLCBcIixcIik7XHJcbiAgICAgICAgbGV0IGxpbmtTaXplOiBudW1iZXIgPSAoaGVscFN0ciAhPT0gXCJcIikgPyBzVG9rLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgbGV0IGhlbHBTdHJEaXNwOiBzdHJpbmcgPSBTdHJVdGlsLnNlYXJjaEFuZFJlcGxhY2UoY2hvaWNlRGlzcFN0ciwgZnJvbUhlbHAsIHRvSGVscCk7XHJcbiAgICAgICAgc1RvayA9IFN0clV0aWwudG9rZW5pemUoaGVscFN0ckRpc3AsIFwiLFwiKTtcclxuICAgICAgICBsZXQgZGlzcGxheVNpemU6IG51bWJlciA9IChoZWxwU3RyRGlzcCAhPT0gXCJcIikgPyBzVG9rLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICAgIGlmIChsaW5rU2l6ZSAhPT0gZGlzcGxheVNpemUgJiYgZGlzcGxheVNpemUgPiAwKSB7XHJcbiAgICAgICAgICBjaG9pY2VEaXNwU3RyID0gY2hvaWNlTGlua1N0cjtcclxuICAgICAgICAgIGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gbGlua1NpemU7XHJcbiAgICAgICAgbGV0IGNob2ljZUxpbms6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgY2hvaWNlTGluayk7XHJcbiAgICAgICAgaWYgKGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKSB7XHJcbiAgICAgICAgICB0aGlzLl9jaG9pY2VOdW1zLnNldF9JdGVtKGxpbmUsIG5ldyBBcnJheTxOVU1fVFlQRT4oc2l6ZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIGRpc3BsYXkgdmFsdWVzXHJcbiAgICAgICAgbGV0IG9yZ0Nob2ljZURpc3A6IHN0cmluZ1tdID0gQ2hvaWNlVXRpbHMuR2V0RGlzcGxheUxpc3RGcm9tU3RyaW5nKGNob2ljZURpc3BTdHIsIGZhbHNlLCB0cnVlLCAhaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCk7XHJcbiAgICAgICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgb3JnQ2hvaWNlRGlzcCk7XHJcbiAgICAgICAgbGV0IGNob2ljZURpc3A6IHN0cmluZ1tdID0gQ2hvaWNlVXRpbHMuR2V0RGlzcGxheUxpc3RGcm9tU3RyaW5nKGNob2ljZURpc3BTdHIsIHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpLCB0cnVlLCAhaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCk7XHJcbiAgICAgICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgY2hvaWNlRGlzcCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdHJpbVRvTGVuZ3RoID0gdGhpcy5nZXRGaWVsZCgpLmdldFNpemUoKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgdG9rZW46IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IGhlbHBUb2tlbjogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgdG9rZW5CdWZmZXI6IFN0cmluZ0J1aWxkZXI7XHJcbiAgICAgICAgLy8gQWRkIGxpbmsgdmFsdWVzLlxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGN1cnJQb3M6IG51bWJlciA9IDAsIG5leHRQb3MgPSAwOyBpIDwgc2l6ZSAmJiBvcHRpb25zVmFsaWQ7IGkrKykge1xyXG4gICAgICAgICAgbmV4dFBvcyA9IGN1cnJQb3M7XHJcbiAgICAgICAgICBuZXh0UG9zID0gaGVscFN0ci5pbmRleE9mKCcsJywgbmV4dFBvcyk7XHJcblxyXG4gICAgICAgICAgaWYgKG5leHRQb3MgPT09IGN1cnJQb3MpXHJcbiAgICAgICAgICAgIHRva2VuID0gaGVscFRva2VuID0gXCJcIjtcclxuICAgICAgICAgIGVsc2UgaWYgKG5leHRQb3MgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRva2VuID0gY2hvaWNlTGlua1N0ci5zdWJzdHIoY3VyclBvcyk7XHJcbiAgICAgICAgICAgIGhlbHBUb2tlbiA9IGhlbHBTdHIuc3Vic3RyKGN1cnJQb3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRva2VuID0gY2hvaWNlTGlua1N0ci5zdWJzdHIoY3VyclBvcywgKG5leHRQb3MpIC0gKGN1cnJQb3MpKTtcclxuICAgICAgICAgICAgaGVscFRva2VuID0gaGVscFN0ci5zdWJzdHIoY3VyclBvcywgKG5leHRQb3MpIC0gKGN1cnJQb3MpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjdXJyUG9zID0gbmV4dFBvcyArIDE7XHJcblxyXG4gICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5NRU1POlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICAgIHRva2VuID0gU3RyVXRpbC5sdHJpbSh0b2tlbik7XHJcbiAgICAgICAgICAgICAgaGVscFRva2VuID0gU3RyVXRpbC5sdHJpbShoZWxwVG9rZW4pO1xyXG4gICAgICAgICAgICAgIGlmIChoZWxwVG9rZW4uaW5kZXhPZignXFxcXCcpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRva2VuUG9zOiBudW1iZXIgPSAwOyB0b2tlblBvcyA8IGhlbHBUb2tlbi5sZW5ndGg7IHRva2VuUG9zKyspXHJcbiAgICAgICAgICAgICAgICAgIGlmIChoZWxwVG9rZW5bdG9rZW5Qb3NdICE9PSAnXFxcXCcpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIuQXBwZW5kKHRva2VuW3Rva2VuUG9zXSk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuUG9zID09PSBoZWxwVG9rZW4ubGVuZ3RoIC0gMSlcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlci5BcHBlbmQoJyAnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuQnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRva2VuID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHRva2VuLCBTRVFfMl9TVFIpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHRoaXMuaXNUYWJDb250cm9sKCkpXHJcbiAgICAgICAgICAgICAgICB0b2tlbiA9IENob2ljZVV0aWxzLlJlbW92ZUFjY2xDaGFyRnJvbU9wdGlvbnMobmV3IFN0cmluZ0J1aWxkZXIodG9rZW4pKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gY2hvaWNlTGluayBzaXplIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gc2l6ZSBvZiB0aGUgZmllbGQsIHNvIHRyaW0gaXQuXHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmltVG9MZW5ndGggIT09IC0xICYmIFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRva2VuKSA+IHRyaW1Ub0xlbmd0aClcclxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodG9rZW4sIHRyaW1Ub0xlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1Ub0xlbmd0aCAhPT0gLTEgJiYgdG9rZW4ubGVuZ3RoID4gdHJpbVRvTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cigwLCB0cmltVG9MZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9IHRva2VuO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgICAgICBsZXQgcGljdHVyZTogUElDID0gUElDLmJ1aWxkUGljdHVyZShkYXRhVHlwZSwgdG9rZW4sIHRhc2suZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgb3B0aW9uc1ZhbGlkID0gdGhpcy5vcHRpb25Jc1ZhbGlkKHRva2VuKTtcclxuICAgICAgICAgICAgICBjaG9pY2VMaW5rW2ldID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKHRva2VuLnRyaW0oKSwgcGljdHVyZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0Q29tcElkeCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pO1xyXG4gICAgICAgICAgICAgICgodGhpcy5fY2hvaWNlTnVtcy5nZXRfSXRlbShsaW5lKSkpW2ldID0gbmV3IE5VTV9UWVBFKGNob2ljZUxpbmtbaV0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9ICgxIC0gaSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnNWYWxpZClcclxuICAgICAgICAgIHRoaXMuZW1wdHlDaG9pY2UobGluZSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIG9wdGlvbnNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZW1wdHlDaG9pY2UobGluZSk7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX1cIiwgZXguR2V0VHlwZSgpLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsID0gb3B0aW9uc1ZhbGlkO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB0b3Btb3N0IGZvcm0gb2YgdGhlIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtKCkuZ2V0VG9wTW9zdEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsYWNlIHRoZSB1cmwgb24gYnJvd3NlciBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFVybCgpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCAwLCB0aGlzLlZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBpbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB3aXRob3V0IGNoYW5naW5nIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWxcIj50aGUgZGlzcGxheWVkIHZhbHVlIHdpdGggdGhlIG1hc2tpbmcgY2hhcmFjdGVyczwvcGFyYW0+XHJcbiAgYXN5bmMgZ2V0TWdWYWx1ZShkaXNwVmFsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IG1nVmFsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChzdXBlci5pc0NoZWNrQm94KCkpIHtcclxuICAgICAgbWdWYWwgPSBkaXNwVmFsID8gXCIxXCIgOiBcIjBcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCkgfHwgc3VwZXIuaXNUYWJDb250cm9sKCkgfHwgc3VwZXIuaXNSYWRpbygpKSB7XHJcblxyXG4gICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG5cclxuICAgICAgICBpZiAobGluZSA8IDApXHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwVmFsID09PSBcIm51bWJlclwiKVxyXG4gICAgICAgICAgZGlzcFZhbCA9IGRpc3BWYWwudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcFZhbCkpXHJcbiAgICAgICAgICBkaXNwVmFsID0gZGlzcFZhbC5qb2luKCcsJykudG9TdHJpbmcoKTtcclxuXHJcblxyXG4gICAgICAgIGlmIChkaXNwVmFsID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGRpc3BWYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbWdWYWwgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShkaXNwVmFsLCBsaW5lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBUaGUgZGF0YSBjb250cm9sIHdpbGwgbmV2ZXIgcmV0dXJuIGFuIGlsbGVnYWwgdmFsdWUgYXMgYSByZXN1bHQgb2YgYSB1c2VyIHNlbGVjdGlvblxyXG4gICAgICAgICAgLy8gYnV0IGFzIGEgcmVzdWx0IG9mIGFuIGluaXQgZXhwcmVzc2lvbiwgdXBkYXRlIG9wZXJhdGlvbiBvciB2YWx1ZXMgb2YgZGF0YSBpblxyXG4gICAgICAgICAgLy8gdGhlIHJlY29yZC4gVGhlcmVmb3JlLCB0aGUgc2FtZSBpbGxlZ2FsIHZhbHVlIHNob3VsZCBiZSB0YWtlbiBmcm9tIGl0cyBzb3VyY2UsXHJcbiAgICAgICAgICAvLyB3aGljaCBpcyBhIGZpZWxkIG9yIGFuIGV4cHJlc3Npb24uIChFaHVkIDE5LWp1bi0yMDAxKVxyXG4gICAgICAgICAgbGV0IHJlZk1nVmFsOiBSZWZQYXJhbTxzdHJpbmc+ID0gbmV3IFJlZlBhcmFtPHN0cmluZz4obWdWYWwpO1xyXG4gICAgICAgICAgbGV0IHJlZklzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4oaXNOdWxsKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWdWYWwgPSByZWZNZ1ZhbC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGJsb2JDb250ZW50VHlwZTogc3RyaW5nID0gKHRoaXMuX2ZpZWxkICE9PSBudWxsKSA/IHRoaXMuX2ZpZWxkLmdldENvbnRlbnRUeXBlKCkgOiBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTjtcclxuICAgICAgICBtZ1ZhbCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyhkaXNwVmFsLCB0aGlzLl9waWMsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGJsb2JDb250ZW50VHlwZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtZ1ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIGZvciBpbmRpY2UgcGFzc2VkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VsZWN0ZWRJbmRpY2VcIj5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+Y29tbWEgc2VwYXJhdGVkIHZhbHVlczwvcmV0dXJucz5cclxuICBhc3luYyBnZXRMaW5rVmFsdWUoc2VsZWN0ZWRJbmRpY2U6IHN0cmluZywgbGluZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gTlN0cmluZy5FbXB0eTtcclxuICAgIGxldCB0ZW1wOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jb21wdXRlQ2hvaWNlKGxpbmUpO1xyXG5cclxuICAgIGxldCBjaG9pY2VMaW5rOiBzdHJpbmdbXSA9IHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpO1xyXG5cclxuICAgIGlmIChjaG9pY2VMaW5rICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIGNvbXB1dGUgc2l6ZSBvZiBkaXNwbGF5ZWQgdmFsdWVzIGFycmF5XHJcbiAgICAgIHNpemUgPSBjaG9pY2VMaW5rLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGxldCBsaW5rSW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0TGlua0lkeEZyb21MYXllcihNaXNjLkdldEludEFycmF5KHNlbGVjdGVkSW5kaWNlKSk7XHJcblxyXG4gICAgbGV0IGFycmF5MjogbnVtYmVyW10gPSBsaW5rSW5kaWNlO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFycmF5Mi5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBhcnJheTJbaV07XHJcbiAgICAgIGlmIChpZHggPj0gc2l6ZSkge1xyXG4gICAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgICB0ZW1wLnB1c2goZGNWYWxzLmdldExpbmtWYWx1ZShpZHggLSBzaXplKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGNob2ljZUxpbmsubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0ZW1wLnB1c2goY2hvaWNlTGlua1tpZHhdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0ZW1wLnB1c2gobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbGV0IHZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZSh0aGlzLmdldEZpZWxkKCkpO1xyXG4gICAgICBmb3IgKGxldCBpbmR4OiBudW1iZXIgPSAwOyBpbmR4IDwgdGVtcC5sZW5ndGg7IGluZHggPSBpbmR4ICsgMSkge1xyXG4gICAgICAgIHZlY3RvclR5cGUuc2V0VmVjQ2VsbChpbmR4ICsgMSwgdGVtcC5nZXRfSXRlbShpbmR4KSwgdGVtcC5nZXRfSXRlbShpbmR4KSA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gdmVjdG9yVHlwZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXN1bHQgPSB0ZW1wLmpvaW4oXCIsXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IHRlbXAuZ2V0X0l0ZW0oMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRleHQgb24gdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0VGV4dCgpOiB2b2lkIHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBtbHNUcmFuc2xhdGVkVmFsdWU6IGFueSA9IHRoaXMuVmFsdWU7XHJcbiAgICBpZiAoc3VwZXIuaXNCdXR0b24oKSkge1xyXG4gICAgICBtbHNUcmFuc2xhdGVkVmFsdWUgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpIHx8IHRoaXMuaXNCdXR0b24oKSlcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGRpc3BsYXlMaW5lLCBtbHNUcmFuc2xhdGVkVmFsdWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGRpc3BsYXlMaW5lLCAvKlwiaW5uZXJIVE1MXCIqLyBIdG1sUHJvcGVydGllcy5UZXh0LCBtbHNUcmFuc2xhdGVkVmFsdWUpO1xyXG5cclxuICAgIC8vIENvbW1hbmRzLmFkZEFzeW5jKENvbW1hbmRUeXBlLlBST1BfU0VUX1RFWFQsIHRoaXMsIGRpc3BsYXlMaW5lLCBtbHNUcmFuc2xhdGVkVmFsdWUsIDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHJhZGlvIGJ1dHRvbiBjaGVja2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhZGlvTGluZVwiPmlzIHRoZSBsaW5lIG9mIHRoZSByYWRpbyB0aGF0IG5lZWQgdG8gYmUgU2V0PC9wYXJhbT5cclxuICBwcml2YXRlIHNldFJhZGlvQ2hlY2tlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBpbmRleCk7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG5cclxuICAgIC8vIHNldCBjb250cm9sIHRvIGZvY3VzXHJcbiAgICBpZiAoaW5kZXggIT09IEd1aUNvbnN0YW50cy5ERUZBVUxUX1ZBTFVFX0lOVCkge1xyXG4gICAgICB0aGlzLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDb250cm9sVG9Gb2N1cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLkNvbnRyb2xUb0ZvY3VzID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgQ2hlY2tCb3ggVmFsdWUgdG8gdGhlIGNoZWNrIGJveCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1ZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHNldENoZWNrQm94VmFsdWUobGluZTogbnVtYmVyLCBtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgY2hlY2tTdGF0ZTogYm9vbGVhbiA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKG1nVmFsKTtcclxuICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLCBsaW5lLCBjaGVja1N0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZUNoYW5nZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZTogbnVtYmVyLCB2YWx1ZUNoYW5nZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIGxldCBjdXJyRGNJZDogbnVtYmVyID0gdGhpcy5nZXREY1JlZigpO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIHJhbmdlIHdhcyBjaGFuZ2VkIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhlIGNvcnJlY3QgY2hvaWNlIG9wdGlvblxyXG4gICAgICBpZiAodGhpcy5fcmFuZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yYW5nZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhQ3RybCgpICYmIGN1cnJEY0lkICE9PSB0aGlzLl9kY1ZhbElkKSB7XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBzZXJ2ZXIgd3JpdGVzIG9wdGlvbkxpc3QgdG8gdGhlIEhUTUwuIE5vIG5lZWQgdG8gYXBwbHlcclxuICAgICAgICAvLyB0aGVtXHJcbiAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0aW1lLlxyXG4gICAgICAgIC8vIGZvcmNlIHVwZGF0ZSBvZiB0aGUgdmFsdWUgd2hlbmV2ZXIgdGhlIHNldCBvZiBvcHRpb25zIGlzIHJlcGxhY2VkXHJcbiAgICAgICAgLy8gaWYgKGZvcm0uZm9ybVJlZnJlc2hlZCgpIHx8IGZvcmNlUmVmcmVzaClcclxuXHJcbiAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXREY1JlZih0aGlzLl9kY1ZhbElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGRjcmVmIGZvciB0aGUgY3VycmVudCB0YWJsZSBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRjSWRcIj50aGUgbmV3IHJlZmVyZW5jZSB0byB0aGUgZGN2YWxzPC9wYXJhbT5cclxuICBzZXREY1JlZihkY0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RjVGFibGVSZWZzLnNldF9JdGVtKHRoaXMuZ2V0RGNMaW5lTnVtKCksIGRjSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlIGltYWdlIGxpc3Qgb2YgYW4gYnV0dG9uIGNvbnRyb2wgd2l0aCB0aGUgaW1hZ2UgYXQgdGhlIGdpdmVuIFVSTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW1hZ2VMaXN0KHVybDogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZSBib29sZWFuIHByb3BlcnR5KGV4OnZpc2libGVcXGVuYWJsZSkgb2YgY29udHJvbCBhbmQgaXQncyBjaGlsZHJlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5wcm9wZXJ0eSBpZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj5jb21tYW5kIHR5cGUgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3AgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInVwZGF0ZVRoaXNcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZVByb3BlcnR5TG9naWNOZXN0aW5nKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbiwgdXBkYXRlVGhpczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgKHZhbCAmJiB0aGlzLmhhdmVUb0NoZWNrUGFyZW50VmFsdWUoKSkge1xyXG4gICAgLy8gIHZhbCA9IHRoaXMuaXNQYXJlbnRQcm9wVmFsdWUocHJvcElkKTtcclxuICAgIC8vIH1cclxuICAgIGlmICh1cGRhdGVUaGlzKSB7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSA/IEh0bWxQcm9wZXJ0aWVzLlZpc2libGUgOiBIdG1sUHJvcGVydGllcy5FbmFibGVkLCB2YWwpO1xyXG5cclxuICAgIH1cclxuICAgIC8vIHRvZG86IHNob3VsZCBnbyBvdmVyIG9ubHkgbGlua2VkIGNvbnRyb2xzIC0gbm90IGNoaWxkcmVuIGNvbnRyb2xzLCBuZWVkIHRvIGNoZWNrIHdpdGggUE0gdGhpcyBiZWhhdmlvclxyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgU2V0RW5hYmxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQsIHZhbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlcyB2aXNpYmlsaXR5IG9mIGNvbnRyb2xzIGxpbmtlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29tbWFuZFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICBhc3luYyB1cGRhdGVDaGlsZHJlblByb3BWYWx1ZShwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoIXN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgLy8gaW4gdGFibGUgYWxsIGNoaWxkcmVuIGFyZSBjb250YWluZWQsXHJcbiAgICAgIC8vIHRhYmxlJ3MgdmlzaWJpbGl0eVxcZW5hYmxlIHdpbGwgYWZmZWN0IHRoZW1cclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9saW5rZWRDb250cm9scy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICBsZXQgY2hpbGQ6IE1nQ29udHJvbEJhc2UgPSB0aGlzLl9saW5rZWRDb250cm9scy5nZXRfSXRlbShpKTtcclxuICAgICAgICAvLyBEZWZlY3QgMTE3Mjk0LiBEbyBub3QgY29udGludWUgZm9yIHRoZSBmaXJzdCB0aW1lLiBJdCBhZmZlY3RzIG9uIHRoZSBwbGFjZW1lbnQuXHJcbiAgICAgICAgaWYgKGNoaWxkLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZFZhbHVlOiBib29sZWFuID0gKGNoaWxkLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpO1xyXG5cclxuICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGRWYWx1ZSAmJiB2YWw7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZE9uQ3VycmVudExheWVyOiBib29sZWFuID0gdGhpcy5pc0NoaWxkT25DdXJyZW50TGF5ZXIoY2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWFuZFR5cGUgPT09IENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUpIHtcclxuXHJcbiAgICAgICAgICBpZiAoY2hpbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICBjaGlsZFZhbHVlID0gY2hpbGRPbkN1cnJlbnRMYXllcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IGNoaWxkLnVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIGNoaWxkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc3VwZXIuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdWJmb3JtQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgdmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0cnVlIGlmIHRoaXMgY29udHJvbCBpcyBkZXNjZW5kYW50IG9mIHNwZWNpZmllZCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGVzY2VuZGVudE9mQ29udHJvbChjb250cm9sOiBHdWlNZ0NvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0NvbnRhaW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChjb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMuZ2V0UGFyZW50KCk7XHJcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZ0NvbnRyb2xCYXNlKSB7XHJcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gY29udHJvbCkge1xyXG4gICAgICAgICAgaXNDb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIGN1cnJlbnQgY29udHJvbCBiZWxvbmdzIHRvIHRhYmxlLCB0aGVuIGl0IGlzIGFsc28gYSBkZXNjZW5kYW50IG9mIHRoZSBjb2x1bW4gY29udHJvbCB0b1xyXG4gICAgICAgICAgLy8gd2hpY2ggaXQgYmVsb25ncy4gQWNjb3JkaW5nIHRvIG91ciBoaWVyYXJjaHksIHRoZSBjb250cm9sIGlzIGRpcmVjdCBkZXNjZW5kYW50IG9mIHRhYmxlXHJcbiAgICAgICAgICAvLyBjb250cm9sOyBoZW5jZSwgd2UgbmVlZCB0byBoYW5kbGUgY29sdW1uIGNvbnRyb2xcclxuXHJcbiAgICAgICAgICBsZXQgcGFyZW50Q29udHJvbDogTWdDb250cm9sQmFzZSA9ICgocGFyZW50IGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkgPyA8TWdDb250cm9sQmFzZT5wYXJlbnQgOiBudWxsKTtcclxuICAgICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTiAmJiBwYXJlbnRDb250cm9sICE9PSBudWxsICYmIHBhcmVudENvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY29udHJvbC5MYXllciA9PT0gdGhpcy5MYXllcilcclxuICAgICAgICAgICAgaXNDb250YWluZWQgPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpc0NvbnRhaW5lZCA9ICgoPE1nQ29udHJvbEJhc2U+cGFyZW50KS5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY29udHJvbCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzQ29udGFpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFVwZGF0ZXMgdmlzaWJpbGl0eSBvciBlbmFibGUgcHJvcGVydHkgb2Ygc3ViZm9ybSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5JZCBvZiB2aXNpYmlsaXR5IG9yIGVuYWJsZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPnR5cGUgb2YgdGhlIEdVSSBjb21tYW5kPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnZhbHVlIGZvciB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIHVwZGF0ZVN1YmZvcm1DaGlsZHJlblByb3BWYWx1ZShwcm9wSWQ6IG51bWJlciwgY29tbWFuZFR5cGU6IENvbW1hbmRUeXBlLCB2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgY2hpbGQncyBsYXllciBpcyBlcXVhbCB0byBjdXJyZW50IGxheWVyIG9mIHRoZSBwYXJlbnQsIHJlbGF2YW50IGZvciB0YWIgY29udHJvbCBmb3IgYWxsIG90aGVyXHJcbiAgLy8vICAgY29udHJvbHMgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoaWxkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgcGFyZW50IGlzIG5vdCB0YWIgY29udHJvbCBvciBwYXJlbnQgaXMgdGFiIGNvbnRyb2wgd2l0aCBzYW1lIGxheWVyPC9yZXR1cm5zPlxyXG4gIGlzQ2hpbGRPbkN1cnJlbnRMYXllcihjaGlsZDogTWdDb250cm9sQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyBjaGVjayB0aGF0IHRoZSBjb250cm9sIGhhcyBzYW1lIGxheWVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBvbiBpdCdzIHBhcmVudCB0YWIgY29udHJvbFxyXG4gICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgIGxldCBwYXJlbnRMYXllcjogbnVtYmVyID0gMDtcclxuICAgICAgaWYgKHRoaXMuVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICBwYXJlbnRMYXllciA9IHRoaXMuZ2V0Q3VycmVudExpbmtJZHgoKSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxheWVyOiBudW1iZXIgPSBjaGlsZC5nZXRMYXllcigpO1xyXG4gICAgICBpZiAocGFyZW50TGF5ZXIgIT09IGxheWVyICYmIGxheWVyID4gMCkge1xyXG4gICAgICAgIC8vIHNvbnMgb2YgbGF5ZXIgMCBkaXNwbGF5ZWQgYWx3YXlzXHJcbiAgICAgICAgcmV0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIGN1cnJlbnQgbGluayBJZHggb2YgY2hvaWNlIGNvbnRyb2xzLCBvciB6ZXJvIGZvciBvdGhlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q3VycmVudExpbmtJZHgoKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyTGlua0lkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkgfHwgdGhpcy5IYXNBdXRvY29tcGxldGUoKSkge1xyXG4gICAgICBsZXQgY3VycmVudExheWVyczogbnVtYmVyW10gPSB0aGlzLmdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk7XHJcbiAgICAgIGxldCBjdXJyTGlua0luZGljZTogbnVtYmVyW10gPSB0aGlzLmdldExpbmtJZHhGcm9tTGF5ZXIoY3VycmVudExheWVycyk7XHJcbiAgICAgIGN1cnJMaW5rSWR4ID0gY3VyckxpbmtJbmRpY2VbMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyckxpbmtJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgbGF5ZXIgZnJvbSB0aGUgc2VsZWN0ZWQgaW5kaWNlIHBhc3NlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmtJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hcnJheSBvZiBsYXllciB2YWx1ZXMuPC9yZXR1cm5zPlxyXG4gIGdldExheWVyRnJvbUxpbmtJZHgoaW5kaWNlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oaW5kaWNlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGluZGljZS5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBpbmRpY2VbaUN0cl07XHJcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGxheWVyID0gbGlua0lkeCB1bmxlc3MgaXQgaXMgYSBUYWIgY29udHJvbFxyXG5cclxuICAgICAgbGF5ZXJzW2lDdHJdID0gaWR4O1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpICYmIGlkeCA+PSAwKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgbGF5ZXJMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxheWVyc1tpQ3RyXSA9IGxheWVyTGlzdC5pbmRleE9mKChpZHggKyAxKS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsYXllcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIHNlbGVjdGVkIGluZGljZSBmb3Igc2VsZWN0ZWQgdmFsdWVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGF5ZXJzXCI+YW4gYXJyYXkgb2YgY3VycmVudCBsYXllcnMgdGFiIGNvbnRyb2xzLiBJdCBjYW4gYmUgYXJyYXkgYmVjYXVzZSBvZiBtdWx0aXBsZSBzZWxlY3Rpb24uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TGlua0lkeEZyb21MYXllcihsYXllcnM6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obGF5ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgbGF5ZXJzLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gbGF5ZXJzW2lDdHJdO1xyXG4gICAgICBsaW5rSW5kaWNlW2lDdHJdID0gbGF5ZXI7XHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIGlmIChsYXllciA8IDApIHtcclxuICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgICAgaWYgKGxheWVyTGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGF5ZXJMaXN0ICE9PSBcInVuZGVmaW5lZFwiICYmIGxheWVyTGlzdC5sZW5ndGggIT09IDAgJiYgbGF5ZXIgPCBsYXllckxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSBOTnVtYmVyLlBhcnNlKGxheWVyTGlzdFtsYXllcl0pIC0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsaW5rSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3Vyc2l2ZSBtZXRob2QsIGNoZWNrcyBpZiBwYXJlbnQgb2YgdGhlIGNoaWxkIGlzIHZpc2libGVcXGVuYWJsZSwgdWx0aWwgdGhlcmUgaXMgbm8gcGFyZW50IG9yIGZvdW5kXHJcbiAgLy8vICAgcGFyZW50IHRoYXQgaXMgaGlkZGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1BhcmVudFByb3BWYWx1ZShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvbHVtbjogTWdDb250cm9sQmFzZSA9IHRoaXMuRm9ybS5nZXRDb250cm9sQ29sdW1uKHRoaXMpO1xyXG4gICAgbGV0IHBhcmVudDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuZ2V0TGlua2VkUGFyZW50KHRydWUpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyBubyBtb3JlIHBhcmVudHNcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBwYXJlbnQgaXMgaGlkZGVuXHJcbiAgICAgIGlmICghcGFyZW50LkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpIHtcclxuICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkT25DdXJyZW50TGF5ZXIodGhpcykpIHtcclxuICAgICAgICAgIC8vIHBhcmVudCBpcyB0YWIgY29udHJvbCB3aXRoIGN1cnJlbnQgbGF5ZXJcclxuICAgICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIGNoaWxkJ3MgbGF5ZXJcclxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGZvciB0YWJsZSBjaGlsZHJlbiBjaGVjayBpZiBjb2x1bW4gdmlzaWJsZVxyXG4gICAgICAgICAgcmVzdWx0ID0gKCEoY29sdW1uICE9PSBudWxsICYmICFjb2x1bW4uR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSkgJiYgcGFyZW50LmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgY29udHJvbCB0byB3aGljaCB0aGlzIGNvbnRyb2wgaXMgbGlua2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrU3ViZm9ybUZhdGhlclwiPmlmIHRydWUgY2hlY2sgZm9yIFN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMaW5rZWRQYXJlbnQoY2hlY2tTdWJmb3JtRmF0aGVyOiBib29sZWFuKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGNoZWNrU3ViZm9ybUZhdGhlciAmJiB0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBjdXJyZW50IGxpbmUgdmFsdWUgb2YgdGhlIHJlYWRPbmx5IGhpc3RvcnkgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIFNldEN1cnJSZWFkT25seShuZXdWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3VycmVudCByZWFkT25seSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZWFkT25seSB2YWx1ZTwvcmV0dXJucz5cclxuICBHZXRDdXJyUmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gc3VwZXIuaXNUYWJsZUNvbnRyb2woKSA/IDAgOiB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX2N1cnJSZWFkT25seS5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0obGluZSwgY3Vycik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY3VyciA9IDxib29sZWFuPmN1cnJPYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VycjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBjb250cm9sIGlzIGEgRGF0YSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0RhdGFDdHJsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgZGNyZWYgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBkY0lkPC9yZXR1cm5zPlxyXG4gIGdldERjUmVmKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREY0xpbmVOdW0oKTtcclxuICAgIGxldCBvYmo6IGFueSA9IHRoaXMuX2RjVGFibGVSZWZzLmdldF9JdGVtKHRoaXMuZ2V0RGNMaW5lTnVtKCkpO1xyXG4gICAgbGV0IGRjSWQ6IG51bWJlcjtcclxuICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgZGNJZCA9IC0yO1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbShsaW5lLCBkY0lkKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkY0lkID0gPG51bWJlcj5vYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZvciBhIGRhdGEgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXREY0xpbmVOdW0oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZSA/IHRoaXMuRm9ybS5EaXNwbGF5TGluZSA6IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlIG9uZSBjaG9pY2Ugb3B0aW9uIGZyb20gaXRlbXMgbGlzdCBpcyB2YWxpZC4gVGhlIGNoZWNrIGlzIG9ubHkgZm9yIGl0ZW1zIGxpc3QgYW5kIG5vdCBmb3IgdGhlXHJcbiAgLy8vICAgZGF0YSBzb3VyY2Ugb3B0aW9ucywgKEZZSTogZm9yIHRoZSBvcHRpb24gZnJvbSB0aGUgRGF0YUN0cmwsIHdlIGFyZSBub3QgY2FsbGluZyB0aGlzXHJcbiAgLy8vICAgbWV0aG9kLCBOTyBDSEVDSyBJUyBET05FKSBpbiBvbmxpbmUgOmNpX2NoZWNrX3JhbmdlX3N0clxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcHRpb246XCI+b25lIG9wdGlvbiBmcm9tIHRoZSBpdGVtcyBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgb3B0aW9uSXNWYWxpZChvcHRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgJiYgb3B0aW9uLmxlbmd0aCA+IDAgJiYgb3B0aW9uLmluZGV4T2YoJzAnKSA9PT0gLTEpIHtcclxuICAgICAgbGV0IGNvbnZlcnROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIGNvbnZlcnROdW0ubnVtXzRfYV9zdGQob3B0aW9uKTtcclxuICAgICAgaWYgKGNvbnZlcnROdW0ubnVtX2lzX3plcm8oKSkge1xyXG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZXMgYW5kIHJldHVybnMgdGhlIG9yZGVyZWQgbGlzdCBiYXNlZCBvbiBsYXllcnMgaW4gbGF5ZXJMaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNob2ljZURpc3BMaXN0XCI+dW5vcmRlcmVkIGxpc3Q8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcmVkRGlzcExpc3QoY2hvaWNlRGlzcExpc3Q6IHN0cmluZ1tdLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcblxyXG4gICAgbGV0IGNob2ljZUxheWVyU3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGRpc3BBcnJ5TGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGxheWVyQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllclByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTEFZRVJTX0xJU1QpO1xyXG5cclxuICAgIGlmIChsYXllclByb3AgIT09IG51bGwpIHtcclxuICAgICAgY2hvaWNlTGF5ZXJTdHIgPSBhd2FpdCBsYXllclByb3AuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VMYXllclN0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmIChjaG9pY2VMYXllclN0ci5sZW5ndGggPiAwICYmIGNob2ljZURpc3BMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGxheWVyTGlzdDogc3RyaW5nW10gPSBjaG9pY2VMYXllclN0ci5zcGxpdChcIixcIik7XHJcbiAgICAgIGxldCBwb3NDb3B5SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gICAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBsYXllckxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgMSkge1xyXG4gICAgICAgIGxldCBjdXJyTGF5ZXJMaXN0VmFsOiBzdHJpbmcgPSBsYXllckxpc3RbaW5kZXhdLnRyaW0oKTtcclxuICAgICAgICBpZiAoIShsYXllckFycnlMaXN0LmluZGV4T2YoY3VyckxheWVyTGlzdFZhbCkgIT09IC0xKSkge1xyXG4gICAgICAgICAgbGV0IHJlZlBvc0NvcHlJbmRleDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBsZXQgaXNOdW1iZXI6IGJvb2xlYW4gPSBOTnVtYmVyLlRyeVBhcnNlKGN1cnJMYXllckxpc3RWYWwsIHJlZlBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBwb3NDb3B5SW5kZXggPSByZWZQb3NDb3B5SW5kZXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gcG9zQ29weUluZGV4IGlzIDFCYXNlZCwgc28gbXVzdCBub3QgYmUgemVyby4gQWxzbywgaXQgbXVzdCBub3QgYmVcclxuICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiBubyBvZiBlbGVtZW50cyBpbiB0aGUgRGlwbGF5TGlzdC5cclxuXHJcbiAgICAgICAgICBpZiAoaXNOdW1iZXIgJiYgcG9zQ29weUluZGV4ID4gMCAmJiBwb3NDb3B5SW5kZXggPD0gY2hvaWNlRGlzcExpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRpc3BBcnJ5TGlzdC5wdXNoKChjaG9pY2VEaXNwTGlzdFtwb3NDb3B5SW5kZXggLSAxXSkudHJpbSgpKTtcclxuICAgICAgICAgICAgbGF5ZXJBcnJ5TGlzdC5wdXNoKGN1cnJMYXllckxpc3RWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdO1xyXG4gICAgaWYgKGRpc3BBcnJ5TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0ID0gY2hvaWNlRGlzcExpc3Q7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8c3RyaW5nPigwKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oZGlzcEFycnlMaXN0Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgcmVzdWx0Lmxlbmd0aDsgKytfYWkpXHJcbiAgICAgICAgcmVzdWx0W19haV0gPSBudWxsO1xyXG5cclxuICAgICAgcmVzdWx0ID0gZGlzcEFycnlMaXN0LlRvQXJyYXkoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIGxheWVyQXJyeUxpc3QuVG9BcnJheSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIHByZXZpb3VzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWwoKTogdm9pZCB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLnNldFByZXZJc051bGxfVG9OdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gICBzZXRzIHRoZSBwcmV2SXNOdWxsIHZhbHVlIG9mIHRoZSBwcmV2SXNOdWxsIGFycmF5XHJcbiAgLy8vICAgdGhlIG5ld1ZhbHVlIGNhbiBiZSBOVUxMIG9yIGJvb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFByZXZJc051bGxfVG9OdWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhbiBleHByZXNzaW9uIHdhcyBzZXQgYXMgdGhlIGRhdGE8L3JldHVybnM+XHJcbiAgZXhwcmVzc2lvblNldEFzRGF0YSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl92YWxFeHBJZCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbGVkIHdoZW5ldmVyIHRoZSBjaG9pY2UgbGlzdCBvZiBhIFNFTEVDVCBjb250cm9sIGhhcyBjaGFuZ2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhclJhbmdlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhdmUgdG8gY2hlY2sgcGFyZW50IHZpc2liaWxpdHlcXGVuYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUsIGlmIHRoZSBjb250cm9sIGlzIGNvbm5lY3RlZCB0byBhIGNvbnRhaW5lciBvciB0aGUgdGFzayBpcyBhIHN1YmZvbTwvcmV0dXJucz5cclxuICBoYXZlVG9DaGVja1BhcmVudFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5lZEluTGlua2VkUGFyZW50KCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnRhaW5lZCB0YWIgY2hpbGRyZW4gb2YgYWxsIGxheWVycyBhcmUgb24gdGhlIHNhbWUgd2luZG93LFxyXG4gICAgICAvLyBzbyB3ZSBtdXN0IGhhbmRsZSB0aGVyZSB2aXNpYmlsaXR5XFxlbmFibGVcclxuXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzVGFiQ29udHJvbCgpIHx8IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCkuaXNHcm91cCgpKSB7XHJcbiAgICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBjb250cm9sIGlzIGNvbnRhaW4gaW4gaXRzIGxpbmtlZCBwYXJlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xICYmIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9PT0gdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbWJpbmUgdHdvIHN0cmluZ3MgYXJyYXkgaW50byBvbmUuIEVhY2ggb2YgdGhlIG9yaWdpbmFsIGFycmF5cyBtYXkgYmUgbnVsbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RTdHJpbmdzXCI+dGhlIGZpcnN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGZpcnN0IGFycmF5IGNlbGxzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxhc3RTdHJpbmdzXCI+dGhlIGxhc3Qgc3RyaW5ncyBhcnJheSB0aGF0IHdpbGwgYWx3YXlzIG9jY3VweSB0aGUgbGFzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21iaW5lZCBTdHJpbmdzIGFycmF5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGNvbWJpbmVTdHJpbmdBcnJheXMoZmlyc3RTdHJpbmdzOiBzdHJpbmdbXSwgbGFzdFN0cmluZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgIGlmIChmaXJzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZmlyc3RTdHJpbmdzKTtcclxuXHJcbiAgICBpZiAobGFzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobGFzdFN0cmluZ3MpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU/OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIChwcm9wSWQgPT09IG51bGwgfHwgcHJvcElkLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChkZWZhdWx0UmV0VmFsID09PSBudWxsIHx8IGRlZmF1bHRSZXRWYWwuY29uc3RydWN0b3IgPT09IEJvb2xlYW4pKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzEocHJvcElkLCBkZWZhdWx0UmV0VmFsLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBib29sZWFuIGNvbXB1dGVkIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sIC0gaWYgdGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBhbmQgdGhlIGxpbmUgaXNcclxuICAvLy8gZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG5cclxuICAgIGlmICh0aGlzLmlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZCkgJiYgdGhpcy5Gb3JtLkRpc3BsYXlMaW5lICE9PSBsaW5lKSB7XHJcbiAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IHByb3AuZ2V0UHJldlZhbHVlKGxpbmUpO1xyXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vICAgZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdFxyXG4gIC8vLyAgIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIG51bWJlciBpbiB0YWJsZSBpbiB3aGljaCB0aGUgY29udHJvbCBpcyBsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3BXaXRoTGluZShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3AocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcHJvcElkIHByb3BlcnR5IGlzIHJlcGVhdGFibGUgZm9yIHRoaXMgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1JlcGVhdGFibGU6IGJvb2xlYW4gPSB0aGlzLklzUmVwZWF0YWJsZTtcclxuICAgIGlmIChpc1JlcGVhdGFibGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaW4gbWFnaWMgaW50ZXJuYWwgZm9ybWF0IHRvIGJlIGRpc3BsYXllZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRjUmFuZ2VJc0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobWdWYWwgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgIC8vIFFDUiAzMDg0NzUgLSBjb250cm9scyB0aGF0IGFyZSBJbml0aWFsaXplZCB3aXRoIG51bGwgc2hvdWxkIGJlIGdpdmVuIG1hZ2ljIGRlZmF1bHQgdmFsdWUuXHJcbiAgICAgIGlmICghaXNOdWxsKVxyXG4gICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxheWVyczogbnVtYmVyW10gPSB0aGlzLmdldExheWVyRnJvbUxpbmtJZHgoYXdhaXQgdGhpcy5nZXRJbmRleE9mQ2hvaWNlKG1nVmFsLCBsaW5lLCBpc051bGwpKTtcclxuXHJcbiAgICAgICAgLy8gV2UgZG8gbm90IGFsbG93IG5vIHNlbGVjdGlvbiBmb3IgYSB0YWIgY29udHJvbC5cclxuICAgICAgICAvLyBTbywgaWYgdGhlcmUgaXMgbm8gVGFiIHRvIGJlIHNlbGVjdGVkLCBzZWxlY3QgdGhlIGZpcnN0IFRhYiBhbmRcclxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgZmllbGQncyB2YWx1ZSBhY2NvcmRpbmdseS5cclxuXHJcbiAgICAgICAgaWYgKGxheWVyc1swXSA8IDAgJiYgc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIGxheWVyc1swXSA9IDA7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGxheWVyc1swXS50b1N0cmluZygpLCBsaW5lKTtcclxuICAgICAgICAgIGlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIG1nVmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5VcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodGhpcy5fZmllbGQsIG1nVmFsLCBpc051bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbHVlID0gTWlzYy5HZXRDb21tYVNlcGVyYXRlZFN0cmluZyhsYXllcnMpO1xyXG4gICAgICAgIGRjUmFuZ2VJc0VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzQ1MDI0ODogYW4gZW1wdHkgcmFuZ2UgaW4gdGhlIGRhdGEgY29udHJvbCBjYXVzZWQgZGVsZXRpbmcgdGhlIHZhbHVlXHJcbiAgICAvLyBvZiB0aGUgY29udHJvbCB3aGVuIGxlYXZpbmcgaXQuIE5vdywgdGhlIHJhbmdlIG9mIHRoZSBjb250cm9sIGlzIHVzZWQgd2hlblxyXG4gICAgLy8gdGhlIGRhdGEgY29udHJvbCByYW5nZSBpcyBlbXB0eS5cclxuICAgIGlmIChkY1JhbmdlSXNFbXB0eSkge1xyXG4gICAgICBpZiAoIXN1cGVyLmlzQ2hlY2tCb3goKSAmJiAodGhpcy5fZmllbGQgPT09IG51bGwgfHwgIWlzTnVsbCB8fCAhdGhpcy5fZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5fZmllbGQgPT09IG51bGwgJiYgaXNOdWxsKSAmJiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgaW5Db250cm9sOiBib29sZWFuID0gdGhpcy5JbkNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChtZ1ZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdHJ1ZSwgc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCksIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGluQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIERlZmVjdCAjIDEzODgwMyA6IEZpeCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1bmlQYWFTLiBEbyBub3QgY2FsbCBydHJpbVZhbHVlKCkgd2hlbiByZWZyZXNoaW5nIHRoZSBkaXNwbGF5IGlmIHRoZSBkYXRhIHR5cGVcclxuICAgICAgICAgIC8vIGlzIG5vdCBudW1lcmljIG9yIGxlZnQganVzdGlmeSBwcm9wZXJ0eSBpcyBOby5cclxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5WYWx1ZSA9PT0gJ3N0cmluZycgJiYgKCF0aGlzLl9waWMuaXNBdHRyTnVtZXJpYygpIHx8IHRoaXMuX3BpYy5pc0xlZnQoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5ydHJpbVZhbHVlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoaW5uZXJFeGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChpbm5lckV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2w6ICd7MH0nLCBtZ3ZhbDogezF9XCIsIHRoaXMuTmFtZSwgbWdWYWwpLCBpbm5lckV4Y2VwdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLlZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgbWdWYWwgPSBGaWVsZERlZi5nZXRNYWdpY0RlZmF1bHRWYWx1ZSh0aGlzLkRhdGFUeXBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgaW5uZXJFeGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ2hlY2tCb3goKSlcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihtZ1ZhbCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBUcmFuc2xhdGUgbG9naWNhbCBuYW1lIGZvciBpbWFnZSBjb250cm9sLlxyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIG1nVmFsID0gRXZlbnRzLlRyYW5zbGF0ZUxvZ2ljYWxOYW1lKG1nVmFsKTtcclxuICAgIH1cclxuICAgIHRoaXMuSXNOdWxsID0gaXNOdWxsO1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIGlmIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgbW9kaWZpZWQgYW5kIGlmIHNvLCB1cGRhdGVzIHRoZSBNb2RpZmllZEJ5VXNlciA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGlmaWVkQnlVc2VyKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBGb3IgaW1hZ2UgY29udHJvbCBhbmQgaW1hZ2UgYnV0dG9uLCB0aGUgdmFsdWUgd291bGQgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuIEJ1dCwgaWYgaXQgaGFzXHJcbiAgICAvLyBhIGxvZ2ljYWwgbmFtZSwgaXQgaXMgcmVwbGFjZWQuIE9yIGlmIGl0IGlzIGZpbGVTZXJ2ZXIgZ2V0LCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgYnkgYSBzZXJ2ZXIgdXJsLlxyXG4gICAgLy8gSW4gYm90aCB0aGVzZSBjYXNlcywgd2Ugc2hvdWxkIG5vdCBtYXJrIGl0IGFzIG1vZGlmaWVkLlxyXG4gICAgaWYgKCEoc3VwZXIuaXNCdXR0b24oKSB8fCBzdXBlci5pc0ltYWdlQ29udHJvbCgpKSkge1xyXG4gICAgICBsZXQgY3RybEN1cnJJc051bGw6IGJvb2xlYW4gPSB0aGlzLklzTnVsbDtcclxuICAgICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSAodGhpcy5pc0RpZmZlcmVudFZhbHVlKG5ld1ZhbHVlLCBmYWxzZSwgZmFsc2UpKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBkaWRuJ3QgY2hhbmdlIHRoZW4gbGV0J3MgY2hlY2sgaWYgdGhlIG51bGxpdHkgaGF2ZSBjaGFuZ2VkXHJcbiAgICAgIGlmICghdmFsQ2hhbmdlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoY3RybEN1cnJJc051bGwgIT09IHRoaXMuaXNOdWxsVmFsdWUobmV3VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbENoYW5nZWQgfHwgdGhpcy5LZXlTdHJva2VPbikge1xyXG4gICAgICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUlRyaW1zIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHJ0cmltVmFsdWUoKTogdm9pZCB7XHJcbiAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbWluaW11bVZhbHVlTGVuZ3RoOiBudW1iZXIgPSB0aGlzLmdldE1pbmltdW1WYWx1ZUxlbmd0aCgpO1xyXG4gICAgICAvLyBSVHJpbSB0aGUgdmFsdWUgYmV5b25kIHRoaXMgaW5kZXhcclxuICAgICAgaWYgKHRoaXMuVmFsdWUubGVuZ3RoID4gbWluaW11bVZhbHVlTGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHN0cjogc3RyaW5nID0gdGhpcy5WYWx1ZS5zdWJzdHIobWluaW11bVZhbHVlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgLy8gY29weSB0aGUgbWluaW11bSBsZW5ndGggdmFsdWUgYXMgaXNcclxuICAgICAgICB0aGlzLlZhbHVlID0gdGhpcy5WYWx1ZS5zdWJzdHIoMCwgbWluaW11bVZhbHVlTGVuZ3RoKTtcclxuICAgICAgICAvLyBydHJpbSB0aGUgdmFsdWUgYmV5b25kIG1pbmltdW0gbGVuZ3RoXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUgKyBTdHJVdGlsLnJ0cmltV2l0aE51bGwoc3RyLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWx3YXlzIHRyaW0gdGhlIG51bWVyaWMgdmFsdWUuXHJcbiAgICAgIGlmIChzdXBlci5pc1RleHRDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUgbGVuZ3RoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldE1pbmltdW1WYWx1ZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbkxlbmd0aDogbnVtYmVyID0gdGhpcy5fcGljLmdldE1hc2tMZW5ndGgoKTtcclxuXHJcbiAgICAvLyB0cmF2ZXJzZSBmcm9tIHJpZ2h0IHRpbGwgYSB2YWxpZCBtYXNrIGNoYXIgaXMgZW5jb3VudGVyZWRcclxuICAgIHdoaWxlIChtaW5MZW5ndGggPiAwICYmICF0aGlzLl9waWMucGljSXNNYXNrKG1pbkxlbmd0aCAtIDEpKSB7XHJcbiAgICAgIG1pbkxlbmd0aCA9IG1pbkxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWluTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxWYWx1ZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldElzTnVsbENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkgJiYgc3RyID09PSBcIlwiKSB7XHJcbiAgICAgIHJldElzTnVsbENvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElzTnVsbENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBjb250cm9sIGNhbiBnZXQgbnVsbCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIGhpbXNlbGZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2FuR2V0TnVsbEZyb21Db250cm9sVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgc3BlY2lmaWMgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBudWxsIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDaG9pY2VOdWxsKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgcmV0dXJuIGRjVmFscy5pc051bGwoaWR4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wdXRlcyB0aGUgY29udHJvbCdzIHZhbHVlIGVpdGhlciBmcm9tIGV4cHJlc3Npb24gb3IgZmllbGQgYW5kIHJlZnJlc2hlcyB0aGUgR1VJIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JjZVJlZnJlc2hcIj48L3BhcmFtPlxyXG4gIGFzeW5jIENvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxFeHBJZCA+IDApIHtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogYm9vbGVhbjtcclxuICAgICAgbGV0IHJlZldhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4od2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICAgIGxldCByZXRFeHA6IHN0cmluZyA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fdmFsRXhwSWQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuX3BpYy5nZXRTaXplKCksIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgZmFsc2UsIHJlZldhc0V2YWx1YXRlZCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZCA9IHJlZldhc0V2YWx1YXRlZC52YWx1ZTtcclxuICAgICAgaWYgKHdhc0V2YWx1YXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShyZXRFeHAsIHJldEV4cCA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCByZWZWYWx1ZTogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KHZhbHVlKTtcclxuICAgICAgICBsZXQgcmVmSXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihpc051bGwpO1xyXG4gICAgICAgICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5nZXRGaWVsZERpc3BsYXlWYWx1ZSh0aGlzLl9maWVsZCwgcmVmVmFsdWUsIHJlZklzTnVsbCk7XHJcbiAgICAgICAgdmFsdWUgPSByZWZWYWx1ZS52YWx1ZTtcclxuICAgICAgICBpc051bGwgPSByZWZJc051bGwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKHZhbHVlLCBpc051bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVjaWRlcyBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgcmVmcmVzaGVkIHdoaWxlIGVudGVyaW5nIGEgY29udHJvbC4gVmFsdWVzIGZvciBzb21lIGRhdGEgdHlwZXNcclxuICAvLy8gYXJlIGRpc3BsYXllZCBkaWZmZXJlbnRseSB3aGlsZSBwYXJrZWQgb24gdGhlIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQgJiYgdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmICh0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHxcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheWVkIHZhbHVlIG9ubHkgKHdpdGhvdXQgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+aXMgdGhlIG1hZ2ljIGludGVybmFsIHZhbHVlIG9mIHRoZSBwcmVzZW50YXRpb24gdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzYXZlVmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdmFsdWVDaGFuZ2VkO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIC8vIEFUVEVOVElPTjpcclxuICAgIC8vIHRoZSB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGdldE5hbWUoKSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBuYW1lIG1lbWJlciB2YXJpYWJsZVxyXG4gICAgLy8gaXMgdG8gZW5oYW5jZSB0aGUgdXNlIG9mIGNvbnRyb2xzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYSB0YWJsZVxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgbGV0IHByZXZWYWx1ZTogc3RyaW5nID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgbGV0IHByZXZOdWxsOiBib29sZWFuID0gdGhpcy5nZXRQcmV2SXNOdWxsKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHRoaXMuRGF0YVR5cGUpKSB7XHJcbiAgICAgICAgaWYgKFN0clV0aWwucnRyaW0obWdWYWwpID09PSBTdHJVdGlsLnJ0cmltKHByZXZWYWx1ZSkgfHxcclxuICAgICAgICAgIChtZ1ZhbCAhPT0gbnVsbCAmJiBTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpKSkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICA7XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBwcmV2VmFsdWUgfHwgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwcmV2TnVsbCAhPT0gdGhpcy5Jc051bGwpXHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG1nVmFsKTtcclxuICAgICAgdGhpcy5zZXRQcmV2SXNOdWxsKHRoaXMuSXNOdWxsKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1RBVFVTX0JBUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TQl9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgJiYgdGhpcy5WYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnNldFVybCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfSU1BR0U6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRJbWFnZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCB8fCAgdGhpcy5mb3JjZVJlZnJlc2gpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tCb3hWYWx1ZShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk86XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICAgICAgc2F2ZVZhbHVlQ2hhbmdlZCA9IHZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyM6Nzc2MjE1LCA4MDA3NjMsOTQxODQxLCB0aGUgcHJldlZhbHVlIGlzIHNhdmUgYXMgbWd2YWwgbmVlZCB0byBjb252ZXJ0IHRvIGxheWVyXHJcbiAgICAgICAgICAgIGxldCBwcmV2RGlzcGxheVZhbHVlOiBudW1iZXJbXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBGaXggYnVnIzo3ODQzOTFcclxuICAgICAgICAgICAgLy8gSWYgSXRlbUxpc3Qgd2FzIHVwZGF0ZSByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UgdGhlbiB0aGUgdmFsdWUgbXVzdCBiZSBzZXRcclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlVmFsdWVDaGFuZ2VkID09PSB2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBpZiAocHJldlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2RGlzcGxheVZhbHVlID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShwcmV2VmFsdWUsIGxpbmUsIHByZXZOdWxsKSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcHJldkRpc3BsYXlWYWx1ZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocHJldkRpc3BsYXlWYWx1ZVtpXSA9PT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZVtpXSA9IEd1aUNvbnN0YW50cy5ERUZBVUxUX0xJU1RfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGluZGljZSA9IE1pc2MuR2V0SW50QXJyYXkodGhpcy5WYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFZhbHVlLCBpbmRpY2VbMF0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZExheWVyLCBjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgaW5kaWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsICt0aGlzLlZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5IYXNBdXRvY29tcGxldGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgLy8gaWYgKGZvcm0uZm9ybVJlZnJlc2hlZCgpIHx8IGZvcmNlUmVmcmVzaCB8fCB2YWxFeHAgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAvLyB2YWxFeHAuY29tcHV0ZWRCeUNsaWVudE9ubHkoKSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRJbWFnZVdpdGhGaWxlTmFtZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPOlxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UobGluZSwgdmFsdWVDaGFuZ2VkKTtcclxuICAgICAgICAgIGlmICghdmFsdWVDaGFuZ2VkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB0aGlzLnNldFJhZGlvQ2hlY2tlZCh0aGlzLlZhbHVlKTtcclxuICAgICAgICAgIC8vIHNldFJhZGlvQ2hlY2tlZCh2YWx1ZSAubGVuZ3RoKCkgPT0gMCA/IERFRkFVTFRfVkFMVUVfSU5UIDogSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpO1xyXG4gICAgICAgICAgLy8gaWYgKCF0YXNrLnN0YXJ0UHJvY2VzcygpKVxyXG4gICAgICAgICAgLy8gZ3VpTWFuYWdlci5zZXRGb2N1cyh0aGlzKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJpbiBDb250cm9sLlJlZnJlc2hEaXNwbGF5VmFsdWUoKSB1bmtub3duIHR5cGU6IHswfVwiLCB0aGlzLlR5cGUpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpICYmIHZhbHVlQ2hhbmdlZClcclxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb3BlcnR5TG9naWNOZXN0aW5nKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIENvbW1hbmRUeXBlLlBST1BfU0VUX1ZJU0lCTEUsIGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpLCBmYWxzZSk7XHJcbiAgICB9IGNhdGNoIChleF8zNjApIHtcclxuICAgICAgaWYgKGV4XzM2MCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgZm9yIGNvbnRyb2w6IHswfVwiLCB0aGlzLk5hbWUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgZXhfMzYwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkob25seVJlcGVhdGFibGVQcm9wcz86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChvbmx5UmVwZWF0YWJsZVByb3BzKSlcclxuICAgICAgb25seVJlcGVhdGFibGVQcm9wcyA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZXMgdGhlIGRpc3BsYXkgb2YgdGhlIGNvbnRyb2wgaW5jbHVkaW5nIGl0cyB2YWx1ZSBhbmQgaXRzIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlcGVhdGFibGVQcm9wc1wiPmlmIGNvbnRyb2wgdHJlZSAtIHJlZnJlc2hlcyBvbmx5IHJlcGVhdGFibGUgdHJlZSBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIFJlZnJlc2hEaXNwbGF5XzEob25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vICM0MjIyNTAuIFNraXAgdGhlIHJlZnJlc2ggZGlzcGxheSBvZiB0aGUgcGFyZW50J3Mgc3ViZm9ybSBjb250cm9sIGlmIHRoZSBmb3JtIGluc2lkZSBpdCBpcyBzdGlsbCBpbiBpdHMgUmVmcmVzaERpc3BsYXkuXHJcbiAgICBpZiAoIShzdXBlci5pc1N1YmZvcm0oKSAmJiB0aGlzLkdldFN1YmZvcm1NZ0Zvcm0oKSAhPT0gbnVsbCAmJiB0aGlzLkdldFN1YmZvcm1NZ0Zvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpKSB7XHJcblxyXG4gICAgICAvLyB1cGRhdGUgdGhlIHByb3BlcnRpZXNcclxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoUHJvcGVydGllcyhvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuXHJcbiAgICAgIC8vIGNvbXB1dGUgYW5kIGRpc3BsYXkgdGhlIHZhbHVlLlxyXG4gICAgICBpZiAodGhpcy5TaG91bGRDb21wdXRlQW5kUmVmcmVzaE9uQ2xvc2VkRm9ybSgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5Db21wdXRlQW5kUmVmcmVzaERpc3BsYXlWYWx1ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGV4ZWN1dGVzIHRoZSByZWFkb25seSBjb21tYW5kIG9ubHkgaWYgbmVlZGVkXHJcbiAgICAgIGxldCBpc1BhcmthYmxlQ3RybDogYm9vbGVhbiA9ICEoYXdhaXQgdGhpcy5pc1BhcmthYmxlKGZhbHNlKSkgfHwgISBhd2FpdCB0aGlzLmlzTW9kaWZpYWJsZSgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuR2V0Q3VyclJlYWRPbmx5KCkgIT09IGlzUGFya2FibGVDdHJsKSB7XHJcbiAgICAgICAgdGhpcy5TZXRDdXJyUmVhZE9ubHkoaXNQYXJrYWJsZUN0cmwpO1xyXG4gICAgICAgIGF3YWl0IE1hbmFnZXIuU2V0UmVhZE9ubHlDb250cm9sKHRoaXMsIGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG11c3RJbnB1dFByb3BlcnR5OiBQcm9wZXJ0eSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVUKTtcclxuICAgICAgLy8gbmVlZCB0byBjb21wdXRlIGFuZCByZWZyZXNoIHRoZSBkaXNwbGF5IGlmIHRoZSBjb250cm9sJ3MgZGF0YSBpcyBhbiBleHByZXNzaW9uXHJcbiAgICAgIC8vIG9yIHRoZSBmb3JtYXQgaXMgZXhwcmVzc2lvbi4gV2hlbiB0aGUgZm9ybWF0IGlzIGNoYW5nZWQsIHRoZSBkaXNwbGF5IHZhbCBtYXkgY2hhbmdlIGFzIHdlbGwuXHJcbiAgICAgIGlmIChtdXN0SW5wdXRQcm9wZXJ0eSAhPSBudWxsICYmIG11c3RJbnB1dFByb3BlcnR5LmlzRXhwcmVzc2lvbigpKSB7XHJcblxyXG4gICAgICAgIGxldCBwcmV2TXVzdElucHV0OiBib29sZWFuID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVULCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmV2TXVzdElucHV0ICE9PSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVVNUX0lOUFVULCBmYWxzZSkpXHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBIdG1sUHJvcGVydGllcy5NdXN0SW5wdXQsICFwcmV2TXVzdElucHV0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9JTiwgdHJ1ZSkpXHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuVGFiSW5kZXgsIC0xKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZvciBSaWNoIENsaWVudCBjb21wdXRlIGFuZCByZWZyZXNoIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBhbHdheXMsIGFsc28gaWYgdGhlIGZvcm0gaXMgbm90IHlldCBvcGVuZWQuXHJcbiAgLy8vIEZvciBPbmxpbmUgb25seSBmb3Igb3BlbmVkIGZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBTaG91bGRDb21wdXRlQW5kUmVmcmVzaE9uQ2xvc2VkRm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZWZyZXNoZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+PC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoUHJvcGVydGllcyhvbmx5UmVwZWF0YWJsZVByb3BzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSAmJiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKVxyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9BVFRSSUJVVEUsIHRoaXMsIHRoaXMuRGF0YVR5cGUuY2hhckNvZGVBdCgwKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0UHJvcHMoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ab29tQnV0dG9uSW5pdGlhbGl6YXRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuX3Byb3BUYWIuUmVmcmVzaERpc3BsYXkoZmFsc2UsIG9ubHlSZXBlYXRhYmxlUHJvcHMpKSkge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiBOb3QgYWxsIHByb3BlcnRpZXMgY291bGQgYmUgc2V0XCIsIHRoaXMuZ2V0TmFtZSgpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcykge1xyXG4gICAgICAgICAgaWYgKCFvbmx5UmVwZWF0YWJsZVByb3BzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgbXNnOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sICd7MH0nOiB7MX1cIiwgdGhpcy5nZXROYW1lKCksIGV4Lk1lc3NhZ2UpKTtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG1zZy5Ub1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hUYWJGb3JMYXllckxpc3QobGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudExpbmtWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgYWxyZWFkeSBvcGVuZWQsIGdldCB0aGUgY3VycmVudCBsaW5rIHZhbHVlIGJlZm9yZVxyXG4gICAgLy8gY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QgaS5lLiBiZWZvcmUgY2FsbGluZyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KCkuXHJcbiAgICAvLyBBbmQgdGhlbiwgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxheWVyIGxpc3QsIHNlbGVjdCB0aGUgVEFCIGNvcnJlc3BvbmRpbmdcclxuICAgIC8vIHRvIHRoZSBjdXJyZW50IGxpbmsgdmFsdWUuXHJcbiAgICBpZiAodGhpcy5nZXRGb3JtKCkuT3BlbmVkKSB7XHJcbiAgICAgIGxldCBpbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpO1xyXG4gICAgICBsZXQgY3VycmVudExheWVyOiBudW1iZXIgPSBpbmRpY2VbMF07XHJcbiAgICAgIGN1cnJlbnRMaW5rVmFsdWUgPSBhd2FpdCB0aGlzLmdldExpbmtWYWx1ZShjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSwgbGluZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgZmFsc2UpO1xyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLlNldEFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoY3VycmVudExpbmtWYWx1ZSwgdGhpcy5Jc051bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBvZiByYWRpbyBidXR0b25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj5EaXNwbGF5IGxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4ZWNDb21wdXRlQ2hvaWNlXCI+PC9wYXJhbT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0Rm9yUmFkaW9CdXR0b24obGluZTogbnVtYmVyLCBleGVjQ29tcHV0ZUNob2ljZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vIDEuIGNyZWF0ZSB0aGUgYnV0dG9uIGZvciBlYWNoIGl0ZW1zIGxpc3RcclxuICAgIGxldCBkaXNwbGF5TGlzdDogc3RyaW5nW10gPSBhd2FpdCB0aGlzLnJlZnJlc2hEaXNwUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2UpO1xyXG5cclxuICAgIGxldCBvcHRpb25zID0gZGlzcGxheUxpc3QubWFwKChkaXNwbGF5VmFsdWUsIGNvdW50ZXIpID0+IHtcclxuICAgICAgbGV0IGluZGV4OiBzdHJpbmcgPSBjb3VudGVyLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgIH0pO1xyXG4gICAgLy8gY3JlYXRlcyBuZXcgcmFkaW8gYnV0dG9ucyBmcm9tIGRpc3BsYXkgbGlzdC5cclxuXHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBhbmQgc2V0IGl0IGludG8gdGhlIGd1aSBjb250cm9sIGlmIGl0IGlzIGNvbWJvIGJveCAsIHJlZnJlc2ggYWxzbyB0aGUgdmlzaWJsZVxyXG4gIC8vLyAgIGxpbmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICB0aGlzLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9uc1N0cmluZ3M6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIGlmIChzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCB0aGlzLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IG9wdGlvbnNTdHJpbmdzLm1hcCgoZGlzcGxheVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc1JhZGlvKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3RGb3JSYWRpb0J1dHRvbihsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBjaG9pY2UgbGlzdCBvZiBhIFNFTEVDVCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgbGV0IHNlbGVjdENtZDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgICBsZXQgZGlzcFZhbHM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5nZXREaXNwVmFscyhsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsKSB7XHJcbiAgICAgICAgc2VsZWN0Q21kID0gTWdDb250cm9sQmFzZS5jb21iaW5lU3RyaW5nQXJyYXlzKGRpc3BWYWxzLCBkY3YuZ2V0RGlzcFZhbHMoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzZWxlY3RDbWQgPSBhd2FpdCB0aGlzLmdldERpc3BWYWxzKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JhbmdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRPcmRlcmVkRGlzcExpc3Qoc2VsZWN0Q21kLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVmcmVzaCB0aGUgaXRlbXMgbGlzdCBvZiB0aGUgc2VsZWN0aW9uIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleGVjQ29tcHV0ZUNob2ljZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyByZWZyZXNoSXRtUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZm9yIHNlbGVjdGlvbiBjb250cm9sLlxyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpO1xyXG4gICAgbGV0IG9yZGVyZWRJdG1MaXN0OiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuICAgIH1cclxuICAgIGxldCBsaW5rVmFsczogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgIGlmICh0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwpIHtcclxuICAgICAgb3JkZXJlZEl0bUxpc3QgPSBNZ0NvbnRyb2xCYXNlLmNvbWJpbmVTdHJpbmdBcnJheXMobGlua1ZhbHMsIGRjdi5HZXRMaW5rVmFscygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRPcmRlcmVkRGlzcExpc3Qob3JkZXJlZEl0bUxpc3QsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGl0ZW1zIHZhbHVlcyBmcm9tIGRhdGEgc291cmNlICYgaXRlbSBsaXN0IHByb3BlcnR5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRJdGVtc1JhbmdlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hJdG1SYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgZGlzcGxheSB2YWx1ZXMgZnJvbSBkYXRhIHNvdXJjZSAmIGRpc3BsYXkgbGlzdCBwcm9wZXJ0eS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0RGlzcGxheVJhbmdlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hEaXNwUmFuZ2UoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRQcm9wcygpIHtcclxuICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKTtcclxuXHJcbiAgICAvLyBGaXhlZCBidWcjOjc4MTc0MVxyXG4gICAgLy8gaW4gMS45IC0tPlxyXG4gICAgLy8gd2hlbiBhc2sgYWJvdXQgYW55IHByb3BlcnR5KFBST1BfVFlQRV9FTkFCTEVEKSB3ZSB3YXMgY3JlYXRlZCB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlKHRydWUpLlxyXG4gICAgLy8gYW5kIHdoZW4gZ2V0IHRvIFJlZnJlc2hQcm9wcyBvZiB0aGUgcHJvcGVydHkgXCJQUk9QX1RZUEVfRU5BQkxFRFwiIHdlIHdhcyBhZGQgY29tbWFuZCB0byB0aGUgcXVldWUgaW4gZ3VpIHRocmVhZFxyXG4gICAgLy8gdGhlIGNvbW1hbmQgd2FzIHdhcyB1cGRhdGUgdGhlIFRhZ0RhdGEuRW5hYmxlIHRvIGJlIFwidHJ1ZVwiXHJcbiAgICAvLyBpbiAyLjAgLS0+XHJcbiAgICAvLyB3ZSB1c2VpbmcgYSBuZXcgbWV0aG9kIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KCkgdGhhdCBub3QgY3JlYXRlZCBhbnkgZGVmYXVsdCBwcm9wZXJ0eSBhbmQgbm8gZ2V0IHRvIHJlZnJlc2hQcm9wXHJcbiAgICAvLyBvbiB0aGUgcHJvcGVydHkgYW5kIHRoZSB2YWx1ZSBvbiB0aGUgQ29udHJvbC5FbmFibGUgd2FzIHdyb25nXHJcbiAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCk7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgTGlua2VkIFBhcmVudCBJZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmtlZFBhcmVudERpdElkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRMaW5rZWRQYXJlbnRJZHgobGlua2VkUGFyZW50RGl0SWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCA9IGxpbmtlZFBhcmVudERpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbGlkYXRpb24gZGV0YWlscyBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYnVpbGRQaWN0dXJlKG9sZFZhbDogYW55LCB2YWw6IGFueSk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSB8fCBzdXBlci5pc0NvbHVtbkNvbnRyb2woKSlcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BpY0V4cEV4aXN0cykge1xyXG4gICAgICB0aGlzLl92ZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fdmQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdmQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHMob2xkVmFsLCB2YWwsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRoaXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZkLnNldFZhbHVlKHZhbCk7XHJcbiAgICAgIHRoaXMuX3ZkLnNldE9sZFZhbHVlKG9sZFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrcyBpZiB0aGUgc2VudCB2YWx1ZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udHJvbCdzIGV4aXN0aW5nIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJOZXdWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjaGVja051bGxWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0RpZmZlcmVudFZhbHVlKG5ld1ZhbHVlOiBhbnksIGlzTnVsbDogYm9vbGVhbiwgY2hlY2tOdWxsVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgY3RybEN1cnJWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKVxyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhdGhpcy5Db21wYXJlRGF0ZShuZXdWYWx1ZSwgY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIXRoaXMuQ29tcGFyZVRpbWUobmV3VmFsdWUsIGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgbmV3VmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpICYmIHR5cGVvZiBjdHJsQ3VyclZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGxldCBuZXdWYWx1ZXN0ciA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9IChuZXdWYWx1ZXN0ciAhPT0gY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9IChuZXdWYWx1ZSAhPT0gY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSAmJiB0eXBlb2YgY3RybEN1cnJWYWx1ZSA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpIHtcclxuICAgICAgICBsZXQgbmV3VmFsdWVTdHIgPSBuZXdWYWx1ZS5qb2luKCcsJykudG9TdHJpbmcoKTtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIShTdHJVdGlsLnJ0cmltKG5ld1ZhbHVlU3RyKSA9PT0gU3RyVXRpbC5ydHJpbShjdHJsQ3VyclZhbHVlKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGN0cmxDdXJySXNOdWxsOiBib29sZWFuID0gdGhpcy5Jc051bGw7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICEoU3RyVXRpbC5ydHJpbShuZXdWYWx1ZSkgPT09IFN0clV0aWwucnRyaW0oY3RybEN1cnJWYWx1ZSkpO1xyXG4gICAgICAgIGlmICghdmFsQ2hhbmdlZCAmJiBjaGVja051bGxWYWx1ZSkge1xyXG4gICAgICAgICAgdmFsQ2hhbmdlZCA9IChpc051bGwgIT09IGN0cmxDdXJySXNOdWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgQ29tcGFyZURhdGUoZDE6IERhdGUsIGQyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dmFsOiBib29sZWFuO1xyXG4gICAgaWYgKGQxID09PSBudWxsICYmIGQyID09PSBudWxsKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoKGQxID09PSBudWxsICYmIGQyICE9PSBudWxsKSB8fCAoZDEgIT09IG51bGwgJiYgZDIgPT09IG51bGwpKVxyXG4gICAgICByZXR2YWwgPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGQxLmdldEZ1bGxZZWFyKCkgPT09IGQyLmdldEZ1bGxZZWFyKClcclxuICAgICAgJiYgZDEuZ2V0RGF0ZSgpID09PSBkMi5nZXREYXRlKClcclxuICAgICAgJiYgZDEuZ2V0TW9udGgoKSA9PT0gZDIuZ2V0TW9udGgoKSlcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIHJldHVybiByZXR2YWw7XHJcbiAgfVxyXG5cclxuICBDb21wYXJlVGltZShkMTogRGF0ZSwgZDI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR2YWw6IGJvb2xlYW47XHJcbiAgICBpZiAoZDEgPT09IG51bGwgJiYgZDIgPT09IG51bGwpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICgoZDEgPT09IG51bGwgJiYgZDIgIT09IG51bGwpIHx8IChkMSAhPT0gbnVsbCAmJiBkMiA9PT0gbnVsbCkpXHJcbiAgICAgIHJldHZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSBpZiAoZDEuZ2V0SG91cnMoKSA9PT0gZDIuZ2V0SG91cnMoKVxyXG4gICAgICAmJiBkMS5nZXRNaW51dGVzKCkgPT09IGQyLmdldE1pbnV0ZXMoKVxyXG4gICAgICAmJiBkMS5nZXRTZWNvbmRzKCkgPT09IGQyLmdldFNlY29uZHMoKSlcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIHJldHVybiByZXR2YWw7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBjb2x1bW4ncyBzb3J0YWJsZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0NvbHVtblNvcnRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU29ydGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgdGhpcy5fcHJvcFRhYi5wcm9wRXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NPUlRfQ09MVU1OKSkge1xyXG4gICAgICBpc1NvcnRhYmxlID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NPUlRfQ09MVU1OKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc1NvcnRhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgZmlyc3QgY2hpbGQgTWdDb250cm9sIG9mIGNvbHVtbiBpLmUuIGZpZWxkIGF0dGFjaGVkIHRvIGNvbHVtblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuXHJcbiAgZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKHRoaXMuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgbGlua2VkQ29udHJvbHM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLl9wYXJlbnRUYWJsZS5nZXRMaW5rZWRDb250cm9scygpO1xyXG5cclxuICAgIHJldHVybiBsaW5rZWRDb250cm9scy5maW5kKChjb250cm9sOiBNZ0NvbnRyb2xCYXNlKSA9PiAoY29udHJvbC5nZXRMYXllcigpID09PSB0aGlzLmdldExheWVyKCkgJiYgY29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgIWNvbnRyb2wuSXNUYWJsZUhlYWRlckNoaWxkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wgbmFtZSBmb3IgaGFuZGxlciBzZWFyY2ggcHJvcG9zZS5cclxuICAvLy8gICBUaGUgY29udHJvbCBpdHNlbGYsIG1heSBub3QgaGF2ZSBhIG5hbWUgZm9yIGhhbmRsZXIgc2VhcmNoIChsaWtlIGNvbHVtbiBjb250cm9sLCBpbiB3aGljaCB3ZSBuZWVkIHRvIHVzZVxyXG4gIC8vLyAgIHRoZSBjaGlsZCBjb250cm9sIG5hbWUgZm9yIGhhbmRsZXJzIHNlYXJjaClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbE5hbWVGb3JIYW5kbGVyU2VhcmNoKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hpbGRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5nZXRDb2x1bW5DaGlsZENvbnRyb2woKTtcclxuICAgIGxldCBuYW1lOiBzdHJpbmc7XHJcbiAgICBpZiAoY2hpbGRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZENvbnRyb2wuTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIGxpbmtlZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBsaW5rQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scy5wdXNoKGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGNvbnRyb2wgZnJvbSB0aGUgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZkZyb21GaWVsZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9maWVsZC5SZW1vdmVDb250cm9sKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGRpdCBpbmRleCBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGl0SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGRjVmFsSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRjVmFsSWRcIj48L3BhcmFtPlxyXG4gIHNldERjVmFsSWQoZGNWYWxJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbElkID0gZGNWYWxJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiB0aGUgcGljdHVyZSBkZWZpbmUgYXMgaGVicmV3IHRoZW4gc2V0IHRoZSBsYW5nIHRvIGhlYnJldywgb3RoZXJ3aXNlIHJlc3RvcmUgdGhlIGxhbmdcclxuICAvLy8gICBUaGUgc2FtZSB3ZSBkb2luZyBmb3Igb25saW5lIDplZHRfZWRpdC5jcHAgOiBTZXRLZXlib2FyZExhbmd1YWdlKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdG9yZUxhbmdcIj48L3BhcmFtPlxyXG4gIFNldEtleWJvYXJkTGFuZ3VhZ2UoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbml0aWFsaXplIGNvbnRyb2wgcHJvcGVydGllcyBmb3IgZGVyaXZlZCBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4oaW50ZXJuYWwpXHJcbiAgLy8vIGNoZWNrcyBpZiBjb250cm9sIGlzIHBhcmthYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIElzUGFya2FibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pc1BhcmthYmxlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihpbnRlcm5hbClcclxuICAvLy8gY2hlY2tzIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgUGFyZW50IHRhc2sgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICByZXR1cm4gKHRoaXMuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCB0aGlzLmdldEZpZWxkKCkuZ2V0VGFzaygpICE9PSB0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tFbmFibGVkQW5kVmlzaWJsZVwiPmNoZWNrIGVuYWJsZWQgYW5kIHZpc2libGUgcHJvcGVydGllcyB0b288L3BhcmFtPlxyXG4gIGFzeW5jIGlzUGFya2FibGUoY2hlY2tFbmFibGVkQW5kVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcbiAgICByZXN1bHQgPSAhc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCk7XHJcblxyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gbm9uIGludGVyYWN0aXZlIC0+IG5vdCBwYXJrYWJsZS5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gdGFzay5Jc0ludGVyYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN1bHQgJiYgdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSAmJiB0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5QYXJ0T2ZEYXRhdmlldykge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgLy8gUUNSICM0NDExNzcuIFdoZW4gd2UgY2hlY2sgdGhlIHN1YmZvcm0gcGFyayBhYmlsaXR5LCB3ZSBuZWVkIHRvIGNoZWNrIGFsc28gaXQncyB2aXNpYmlsaXR5IGFuZCBlbmFibGUgcHJvcGVydGllcy5cclxuICAgICAgaWYgKCFzdXBlci5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gKCh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLl9maWVsZC5nZXRUYXNrKCkgPT09IHRhc2spIHx8IHRoaXMuaXNCdXR0b24oKSB8fCBzdXBlci5pc0Jyb3dzZXJDb250cm9sKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgY2hlY2tFbmFibGVkQW5kVmlzaWJsZSkge1xyXG4gICAgICAgIHJlc3VsdCA9ICh0aGlzLmlzRW5hYmxlZCgpICYmIHRoaXMuaXNWaXNpYmxlKCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKHJlc3VsdCAmJiB0aGlzLl9wYXJlbnRUYWJsZSAhPT0gbnVsbCkgJiYgY2hlY2tFbmFibGVkQW5kVmlzaWJsZSkge1xyXG4gICAgICAgIHJlc3VsdCA9ICh0aGlzLl9wYXJlbnRUYWJsZS5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlKSAmJiB0aGlzLl9wYXJlbnRUYWJsZS5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJhaXNlIEFDVF9DVFJMX0hJVCBvbiBsZWZ0IG1vdXNlIGNsaWNrIGlmIGl0IG1lZXRzIGZvbGxvd2luZyBjb25kaXRpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJhaXNlQ29udHJvbEhpdE9uTGVmdENsaWNrT2ZNb3VzZURvd24oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmFpc2VDdHJsSGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoIXN1cGVyLklzSHlwZXJUZXh0QnV0dG9uKCkgJiYgIXN1cGVyLmlzUmFkaW8oKSAmJiAhc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgcmFpc2VDdHJsSGl0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiByYWlzZUN0cmxIaXQ7XHJcbiAgfVxyXG5cclxuICBHZXRWYXJJbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlICdDb250cm9sIEhpdCcgZXZlbnQgc2hvdWxkIGJlIHJhaXNlZCBvbiBtb3VzZSBkb3duLlxyXG4gIC8vLyBUaGUgbWV0aG9kIHdhcyBleHRyYWN0ZWQgZnJvbSBwcm9jZXNzTW91c2VEb3duLCBzaW5jZSB3ZSBtaWdodCBoYXZlIGRpZmZlcmVudFxyXG4gIC8vLyBiZWhhdmlvcnMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0cmVlIGNvbnRyb2xzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVmdENsaWNrV2FzUHJlc3NlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBSYWlzZUNvbnRyb2xIaXRPbk1vdXNlRG93bihsZWZ0Q2xpY2tXYXNQcmVzc2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmFpc2VDdHJsSGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAobGVmdENsaWNrV2FzUHJlc3NlZCkge1xyXG4gICAgICBpZiAodGhpcy5SYWlzZUNvbnRyb2xIaXRPbkxlZnRDbGlja09mTW91c2VEb3duKCkpIHtcclxuICAgICAgICByYWlzZUN0cmxIaXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmFpc2VDdHJsSGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGUgTUdfQUNUX0hJVCBvbiB0aGUgc3ViZm9ybSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBPblN1YmZvcm1DbGljaygpOiB2b2lkIHtcclxuICAgIE1hbmFnZXIuRXZlbnRzTWFuYWdlci5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ISVQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIE1nRm9ybSBvZiB0aGUgc3ViZm9ybSBjb250cm9sIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldFN1YmZvcm1NZ0Zvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFByb3BlcnR5RXhpc3RzKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wVGFiLnByb3BFeGlzdHMoaWQpO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcIntcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiOiBcIiArIE1nQ29udHJvbFR5cGVbdGhpcy5UeXBlXSArIFwifVwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDaGVja3MgaWYgbmV3IGRhdGUgaXMgMDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPiBUaGUgdmFsdWUgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzRGF0ZVplcm8odmFsOiBEYXRlKSB7XHJcbiAgICBsZXQgemVyb0RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIGlmICh2YWwuZ2V0TW9udGgoKSA9PT0gMCAmJiB2YWwuZ2V0RnVsbFllYXIoKSA9PT0gMCAmJiB2YWwuZ2V0RGF5KCkgPT09IDApXHJcbiAgICAgICAgemVyb0RhdGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHplcm9EYXRlO1xyXG4gIH1cclxuXHJcbiAgSXNEZWZhdWx0Um91dGVyT3V0bGV0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gJiYgdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfT1VUTEVULCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgSXNSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSAmJiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfUk9VVEVSX09VVExFVCwgZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIFpvb21CdXR0b25Jbml0aWFsaXphdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmlzVGV4dENvbnRyb2woKSAmJiB0aGlzLmNoZWNrSWZFeGlzdFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09OTkVDVEVEX1pPT01fQ09OVFJPTCkpXHJcbiAgICB7XHJcbiAgICAgIGxldCBjb25uZWN0ZWRCdXR0b246IE1nQ29udHJvbEJhc2UgPSB0aGlzLkZvcm0uQ3RybFRhYi5HZXRDb250cm9sQnlJc24oKGF3YWl0IChhd2FpdCB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09OTkVDVEVEX1pPT01fQ09OVFJPTCkpLmdldFZhbHVlSW50KCkpKTtcclxuXHJcbiAgICAgIC8vIGltYWdlIGJ1dHRvbiAtIGNhbGN1bGF0ZSBhY2NvcmRpbmcgdG8gaW1hZ2VcclxuICAgICAgbGV0IGltYWdlRmlsZU5hbWUgOiBzdHJpbmcgID0gbnVsbDtcclxuICAgICAgaWYgKGNvbm5lY3RlZEJ1dHRvbi5Jc0ltYWdlQnV0dG9uKCkgJiYgY29ubmVjdGVkQnV0dG9uLlByb3BlcnR5RXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSlcclxuICAgICAge1xyXG4gICAgICAgIGltYWdlRmlsZU5hbWUgPSBhd2FpdChhd2FpdCBjb25uZWN0ZWRCdXR0b24uZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkpLmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKCFNaXNjLklzV2ViVXJsKGltYWdlRmlsZU5hbWUpKVxyXG4gICAgICAgICAgaW1hZ2VGaWxlTmFtZSA9IFwiLi9hc3NldHMvaW1hZ2VzL1wiICsgaW1hZ2VGaWxlTmFtZTtcclxuICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1NUWUxFLCB0aGlzLCAwLCBNYWdpY1Byb3BlcnRpZXMuSW1hZ2VGaWxlLCBpbWFnZUZpbGVOYW1lKTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHN0b3JlIHRoZSBlZGl0IGNvbnRyb2wgb24gdGhlIGJ1dHRvblxyXG4gICAgICB0aGlzLkNvbm5lY3RlZENvbnRyb2wgPSBjb25uZWN0ZWRCdXR0b247XHJcbiAgICAgIGNvbm5lY3RlZEJ1dHRvbi5Db25uZWN0ZWRDb250cm9sID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19