@magic-xpa/gui 4.1200.0-dev4120.7 → 4.1200.0-dev4120.70

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 (77) hide show
  1. package/fesm2022/magic-xpa-gui.mjs +5708 -245
  2. package/fesm2022/magic-xpa-gui.mjs.map +1 -1
  3. package/index.d.ts +3 -0
  4. package/package.json +2 -4
  5. package/src/GuiEnums.d.ts +3 -0
  6. package/esm2022/index.mjs +0 -71
  7. package/esm2022/magic-xpa-gui.mjs +0 -2
  8. package/esm2022/src/Commands.mjs +0 -184
  9. package/esm2022/src/Events.mjs +0 -425
  10. package/esm2022/src/EventsProcessor.mjs +0 -67
  11. package/esm2022/src/FocusManager.mjs +0 -34
  12. package/esm2022/src/GuiConstants.mjs +0 -68
  13. package/esm2022/src/GuiEnums.mjs +0 -301
  14. package/esm2022/src/GuiEnvironment.mjs +0 -4
  15. package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
  16. package/esm2022/src/Manager.mjs +0 -91
  17. package/esm2022/src/UIBridge.mjs +0 -33
  18. package/esm2022/src/env/IEnvironment.mjs +0 -2
  19. package/esm2022/src/gui/ControlBase.mjs +0 -3
  20. package/esm2022/src/gui/GuiMgControl.mjs +0 -123
  21. package/esm2022/src/gui/GuiMgForm.mjs +0 -4
  22. package/esm2022/src/gui/KeyboardItem.mjs +0 -135
  23. package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
  24. package/esm2022/src/gui/MgValue.mjs +0 -16
  25. package/esm2022/src/gui/PropParentInterface.mjs +0 -2
  26. package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
  27. package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
  28. package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
  29. package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
  30. package/esm2022/src/gui/low/Style.mjs +0 -20
  31. package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
  32. package/esm2022/src/management/data/BlobType.mjs +0 -281
  33. package/esm2022/src/management/data/DcValues.mjs +0 -214
  34. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
  35. package/esm2022/src/management/data/FieldDef.mjs +0 -331
  36. package/esm2022/src/management/data/FieldsTable.mjs +0 -54
  37. package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
  38. package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
  39. package/esm2022/src/management/data/IRecord.mjs +0 -2
  40. package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
  41. package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
  42. package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
  43. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
  44. package/esm2022/src/management/data/RecordUtils.mjs +0 -361
  45. package/esm2022/src/management/data/VectorType.mjs +0 -612
  46. package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
  47. package/esm2022/src/management/events/IActionManager.mjs +0 -2
  48. package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
  49. package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
  50. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
  51. package/esm2022/src/management/gui/ControlTable.mjs +0 -118
  52. package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
  53. package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
  54. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
  55. package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
  56. package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
  57. package/esm2022/src/management/gui/Helps.mjs +0 -237
  58. package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
  59. package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
  60. package/esm2022/src/management/gui/PIC.mjs +0 -1185
  61. package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
  62. package/esm2022/src/management/gui/PropInterface.mjs +0 -246
  63. package/esm2022/src/management/gui/PropTable.mjs +0 -221
  64. package/esm2022/src/management/gui/Property.mjs +0 -1362
  65. package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
  66. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
  67. package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
  68. package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
  69. package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
  70. package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
  71. package/esm2022/src/management/tasks/ITask.mjs +0 -2
  72. package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
  73. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
  74. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  75. package/esm2022/src/util/MemoryUtil.mjs +0 -35
  76. package/esm2022/src/util/ObjectReference.mjs +0 -36
  77. package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
@@ -1,612 +0,0 @@
1
- import { ApplicationException, Encoding, ISO_8859_1_Encoding, List, NNumber, NString, StringBuilder } from '@magic-xpa/mscorelib';
2
- import { BlobType } from './BlobType';
3
- import { StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode } from '@magic-xpa/utils';
4
- import { DisplayConvertor } from '../gui/DisplayConvertor';
5
- import { RecordUtils } from './RecordUtils';
6
- import { GuiConstants } from '../../GuiConstants';
7
- import { GuiEnvironment } from '../../GuiEnvironment';
8
- import { VectorTypeBase } from './VectorTypeBase';
9
- export class VectorType extends VectorTypeBase {
10
- static VERSION = 5;
11
- static EMPTY_BLOB_PREFIX_LEN = 7;
12
- static BLOB_TYPE_STRUCT_SIZE = 28;
13
- _cells = null;
14
- _encoding = null;
15
- _allowNull = false;
16
- _cellContentType = null;
17
- _cellSize = 0;
18
- _cellsAttr = null;
19
- _cellsDefaultVal = null;
20
- _cellsIsNullDefault = false;
21
- _dataBuf = null;
22
- _initialized = false;
23
- _nullBuf = null;
24
- _originalflatData = null;
25
- constructor(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length) {
26
- super();
27
- if (arguments.length === 6)
28
- this.constructor_0(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length);
29
- else if (arguments.length === 1 && (cellsTypeOrBlobStringOrFld === null || cellsTypeOrBlobStringOrFld.constructor === String))
30
- this.constructor_1(cellsTypeOrBlobStringOrFld);
31
- else
32
- this.constructor_2(cellsTypeOrBlobStringOrFld);
33
- }
34
- constructor_0(cellsType, contentType, defualt, isDefNull, nullAlowed, length) {
35
- this._cells = new List();
36
- this._cellsAttr = cellsType;
37
- this._cellContentType = contentType;
38
- this._cellsDefaultVal = defualt;
39
- this._cellsIsNullDefault = isDefNull;
40
- this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (length * 2) : length);
41
- this._initialized = true;
42
- this._allowNull = nullAlowed;
43
- this._nullBuf = new StringBuilder();
44
- this._dataBuf = new StringBuilder();
45
- this._originalflatData = this.toString();
46
- this._encoding = GuiEnvironment.Environment.GetEncoding();
47
- }
48
- constructor_1(blobString) {
49
- this._cells = new List();
50
- this._initialized = false;
51
- this._originalflatData = blobString;
52
- this._encoding = GuiEnvironment.Environment.GetEncoding();
53
- }
54
- constructor_2(fld) {
55
- this._cells = new List();
56
- this._cellsAttr = fld.getCellsType();
57
- this._cellContentType = fld.getVecCellsContentType();
58
- this._cellsDefaultVal = fld.getCellDefualtValue();
59
- this._cellsIsNullDefault = fld.isNullDefault();
60
- this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (fld.getVecCellsSize() * 2) : fld.getVecCellsSize());
61
- this._initialized = true;
62
- this._allowNull = fld.NullAllowed;
63
- this._nullBuf = new StringBuilder();
64
- this._dataBuf = new StringBuilder();
65
- this._originalflatData = this.toString();
66
- this._encoding = GuiEnvironment.Environment.GetEncoding();
67
- }
68
- init() {
69
- let tokens = null;
70
- let tokenIdx = 0;
71
- let currentToken = null;
72
- let isFlatDataTranslated = this.isUnicode(this._originalflatData);
73
- let isDbcsAlpha = false;
74
- let pos = BlobType.blobPrefixLength(this._originalflatData);
75
- tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
76
- let vecSize = 0;
77
- if (!this._initialized) {
78
- if (VectorType.validateBlobContents(this._originalflatData)) {
79
- let blobPrefix = BlobType.getPrefix(this._originalflatData);
80
- this._cellContentType = BlobType.getContentType(blobPrefix);
81
- pos = (pos + 4 + 5 + 1);
82
- tokenIdx++;
83
- currentToken = tokens[tokenIdx];
84
- pos = pos + (currentToken.length + 1);
85
- tokenIdx++;
86
- currentToken = tokens[tokenIdx];
87
- pos = pos + (currentToken.length + 1);
88
- tokenIdx++;
89
- currentToken = tokens[tokenIdx];
90
- this._cellsAttr = currentToken.charAt(0);
91
- pos = pos + 2;
92
- tokenIdx++;
93
- currentToken = tokens[tokenIdx];
94
- this._cellSize = NNumber.Parse(currentToken);
95
- pos = pos + (currentToken.length + 1);
96
- if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
97
- this._cellsDefaultVal = StrUtil.stringToHexaDump(this._originalflatData.substr(pos, this._cellSize), 2);
98
- else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
99
- if (UtilStrByteMode.isLocaleDefLangDBCS()) {
100
- isDbcsAlpha = true;
101
- isFlatDataTranslated = true;
102
- this._cellsDefaultVal = UtilStrByteMode.leftB(this._originalflatData.substr(pos), this._cellSize);
103
- }
104
- else
105
- this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
106
- if (this._encoding !== null && !isFlatDataTranslated) {
107
- try {
108
- let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
109
- this._cellsDefaultVal = this._encoding.GetString(ba, 0, ba.length);
110
- }
111
- catch (Exception) {
112
- }
113
- }
114
- }
115
- else if (this._cellsAttr === StorageAttribute.UNICODE) {
116
- this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
117
- try {
118
- let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
119
- this._cellsDefaultVal = Encoding.Unicode.GetString(ba, 0, ba.length);
120
- }
121
- catch (Exception) {
122
- }
123
- }
124
- else
125
- this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
126
- if (isDbcsAlpha)
127
- pos = pos + this._cellsDefaultVal.length + 1;
128
- else
129
- pos = (pos + this._cellSize + 1);
130
- tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
131
- tokenIdx = 0;
132
- currentToken = tokens[tokenIdx];
133
- this._cellsIsNullDefault = DisplayConvertor.toBoolean(currentToken);
134
- pos = pos + (currentToken.length + 1);
135
- tokenIdx++;
136
- currentToken = tokens[tokenIdx];
137
- this._allowNull = DisplayConvertor.toBoolean(currentToken);
138
- pos = pos + (currentToken.length + 1);
139
- tokenIdx++;
140
- currentToken = tokens[tokenIdx];
141
- pos = pos + (currentToken.length + 1);
142
- tokenIdx++;
143
- currentToken = tokens[tokenIdx];
144
- vecSize = NNumber.Parse(currentToken);
145
- pos = pos + (currentToken.length + 1);
146
- tokenIdx++;
147
- currentToken = tokens[tokenIdx];
148
- pos = pos + (currentToken.length + 1);
149
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
150
- tokenIdx++;
151
- currentToken = tokens[tokenIdx];
152
- pos = pos + (currentToken.length + 1);
153
- }
154
- let data;
155
- if (isDbcsAlpha) {
156
- data = UtilStrByteMode.leftB(this._originalflatData.substr(pos), (vecSize * this._cellSize));
157
- pos = pos + data.length + 1;
158
- }
159
- else {
160
- data = this._originalflatData.substr(pos, (vecSize * this._cellSize));
161
- pos = (pos + vecSize * this._cellSize + 1);
162
- }
163
- this._dataBuf = new StringBuilder(data.length);
164
- if (this._cellsAttr !== StorageAttribute.ALPHA && this._cellsAttr !== StorageAttribute.MEMO && this._cellsAttr !== StorageAttribute.UNICODE)
165
- this._dataBuf.Append(data);
166
- let nullBuf = this._originalflatData.substr(pos, vecSize);
167
- pos = (pos + vecSize + 1);
168
- this._nullBuf = new StringBuilder(nullBuf);
169
- if (this._cellsAttr !== StorageAttribute.BLOB && this._cellsAttr !== StorageAttribute.BLOB_VECTOR) {
170
- for (let i = 0; i < vecSize; i++) {
171
- let isNull = nullBuf.charAt(i) > '\0';
172
- if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
173
- this._cells.push(new CellElement(StrUtil.stringToHexaDump(data.substr((i * this._cellSize), this._cellSize), 2), isNull));
174
- else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
175
- let cellData;
176
- if (isDbcsAlpha)
177
- cellData = UtilStrByteMode.midB(data, (i * this._cellSize), this._cellSize);
178
- else
179
- cellData = data.substr((i * this._cellSize), this._cellSize);
180
- if (this._encoding !== null && !isFlatDataTranslated) {
181
- try {
182
- let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
183
- cellData = this._encoding.GetString(ba, 0, ba.length);
184
- }
185
- catch (SystemException) {
186
- }
187
- }
188
- this._dataBuf.Append(cellData);
189
- this._cells.push(new CellElement(cellData, isNull));
190
- }
191
- else if (this._cellsAttr === StorageAttribute.UNICODE) {
192
- let cellData = data.substr((i * this._cellSize), this._cellSize);
193
- try {
194
- let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
195
- cellData = Encoding.Unicode.GetString(ba, 0, ba.length);
196
- }
197
- catch (SystemException) {
198
- }
199
- this._dataBuf.Append(cellData);
200
- this._cells.push(new CellElement(cellData, isNull));
201
- }
202
- else
203
- this._cells.push(new CellElement(data.substr((i * this._cellSize), this._cellSize), isNull));
204
- }
205
- }
206
- else {
207
- for (let i = 0; i < vecSize; i++) {
208
- tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
209
- tokenIdx = 0;
210
- tokenIdx++;
211
- currentToken = tokens[tokenIdx];
212
- let size = NNumber.Parse(currentToken);
213
- pos = pos + (currentToken.length + 1);
214
- let blobHeader = "";
215
- for (let j = 0; j < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; j++) {
216
- tokenIdx++;
217
- currentToken = tokens[tokenIdx];
218
- blobHeader = blobHeader + currentToken;
219
- pos = pos + (currentToken.length + 1);
220
- if (j !== GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT - 1) {
221
- blobHeader = blobHeader + ",";
222
- }
223
- }
224
- let cellData = this._originalflatData.substr(pos, size);
225
- let isNull = nullBuf.charAt(i) > '\0';
226
- this._cells.push(new CellElement(cellData, isNull, blobHeader));
227
- pos = (pos + size + 1);
228
- }
229
- }
230
- if (this._dataBuf.Length === 0)
231
- this._dataBuf = new StringBuilder(data.length);
232
- this._initialized = true;
233
- }
234
- else
235
- throw new ApplicationException("in VectorType.init wrong vector format");
236
- }
237
- }
238
- toString() {
239
- let res = "";
240
- if (this._initialized) {
241
- res = res + 0 + "," + 0 + "," + "0" + "," + this._cellsAttr + "," + this._cellContentType + ";";
242
- res = res + this.buildHeadersString();
243
- if (this._cellsAttr === StorageAttribute.UNICODE) {
244
- let dataBufCharArry = new Array(this._dataBuf.Length * 2);
245
- for (let i = 0; i < this._dataBuf.Length; i = i + 1) {
246
- dataBufCharArry[i * 2] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) % 256);
247
- dataBufCharArry[i * 2 + 1] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) / 256);
248
- }
249
- res = res + NString.FromChars(dataBufCharArry) + ",";
250
- }
251
- else
252
- res = res + this._dataBuf + ",";
253
- res = res + this._nullBuf + ",";
254
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
255
- res = res + this.getBlobsBuf();
256
- res = res + VectorType.BLOB_TABLE_STR;
257
- }
258
- else
259
- res = this._originalflatData;
260
- return res;
261
- }
262
- getCellsAttr() {
263
- if (!this._initialized)
264
- return VectorType.getCellsAttr(this._originalflatData);
265
- else
266
- return this._cellsAttr;
267
- }
268
- getCellSize() {
269
- let retVal;
270
- if (!this._initialized)
271
- retVal = VectorType.getCellSize(this._originalflatData);
272
- else
273
- retVal = this._cellSize;
274
- if (this.getCellsAttr() === StorageAttribute.UNICODE)
275
- retVal = Math.floor(retVal / 2);
276
- return retVal;
277
- }
278
- getVecSize() {
279
- if (!this._initialized)
280
- return VectorType.getVecSize(this._originalflatData);
281
- else
282
- return this._cells.length;
283
- }
284
- getVecCell(idx) {
285
- let retVal = null;
286
- if (idx > 0) {
287
- this.init();
288
- if (idx <= this.getVecSize()) {
289
- retVal = this._cells.get_Item(idx - 1).data;
290
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
291
- retVal = this._cells.get_Item(idx - 1).blobFieldPrefix + ";" + retVal;
292
- if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
293
- retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
294
- if (this._cells.get_Item(idx - 1).isNull)
295
- retVal = null;
296
- }
297
- else if (!this._cellsIsNullDefault)
298
- retVal = this._cellsDefaultVal;
299
- }
300
- return retVal;
301
- }
302
- GetCellValues() {
303
- let retVal = null;
304
- let cellValues = null;
305
- this.init();
306
- if (this.getVecSize() > 0) {
307
- cellValues = new Array(this.getVecSize());
308
- for (let idx = 0; idx < this.getVecSize(); idx++) {
309
- retVal = this._cells.get_Item(idx).data;
310
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
311
- retVal = this._cells.get_Item(idx).blobFieldPrefix + ";" + retVal;
312
- if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
313
- retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
314
- if (this._cells.get_Item(idx).isNull)
315
- retVal = null;
316
- cellValues[idx] = retVal;
317
- }
318
- }
319
- else if (!this._cellsIsNullDefault) {
320
- cellValues = [
321
- this._cellsDefaultVal
322
- ];
323
- }
324
- return cellValues;
325
- }
326
- setVecCell(idx, newValue, isNull) {
327
- let res = false;
328
- let createBufferValForNumType = true;
329
- try {
330
- if (idx > 0) {
331
- this.init();
332
- let localCellSize = (this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize;
333
- if (isNull && !this._allowNull) {
334
- isNull = false;
335
- newValue = this._cellsDefaultVal;
336
- }
337
- if (idx <= this._cells.length) {
338
- let curr = this._cells.get_Item(idx - 1);
339
- if (!isNull) {
340
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
341
- let blobPrefixLength = BlobType.blobPrefixLength(newValue);
342
- curr.blobFieldPrefix = newValue.substr(0, blobPrefixLength - 1);
343
- if (newValue.length > blobPrefixLength)
344
- curr.data = newValue.substr(blobPrefixLength);
345
- else
346
- curr.data = "";
347
- }
348
- else {
349
- if (StorageAttributeCheck.isTypeLogical(this._cellsAttr)) {
350
- curr.data = (DisplayConvertor.toBoolean(newValue) ? new StringBuilder().Append(1).ToString() : new StringBuilder().Append('\0').ToString());
351
- newValue = curr.data;
352
- }
353
- else
354
- curr.data = newValue;
355
- let dataBufVal = newValue;
356
- if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
357
- dataBufVal = RecordUtils.byteStreamToString(dataBufVal);
358
- if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO)) {
359
- let baDataBuf = this._encoding.GetBytes(this._dataBuf.ToString());
360
- let baDataBufVal = this._encoding.GetBytes(dataBufVal);
361
- for (let i = 0; i < baDataBufVal.length && i < localCellSize; i++)
362
- baDataBuf[((idx - 1) * localCellSize) + i] = baDataBufVal[i];
363
- for (let i = baDataBufVal.length; i < localCellSize; i++)
364
- baDataBuf[((idx - 1) * localCellSize) + i] = ((this._cellsAttr === StorageAttribute.ALPHA) ? 32 : 0);
365
- this._dataBuf = new StringBuilder(this._encoding.GetString(baDataBuf, 0, baDataBuf.length));
366
- curr.data = this._encoding.GetString(baDataBuf, ((idx - 1) * localCellSize), localCellSize);
367
- }
368
- else {
369
- for (let i = 0; i < dataBufVal.length && i < localCellSize; i++)
370
- this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, dataBufVal.charAt(i));
371
- for (let i = dataBufVal.length; i < localCellSize; i++)
372
- this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
373
- if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE || this._cellsAttr === StorageAttribute.MEMO)
374
- curr.data = this._dataBuf.ToString().substr(((idx - 1) * localCellSize), localCellSize);
375
- }
376
- }
377
- this._nullBuf.set_Item(idx - 1, '\0');
378
- curr.isNull = false;
379
- }
380
- else {
381
- curr.data = null;
382
- if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
383
- curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\u0001');
384
- else
385
- curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\0');
386
- curr.isNull = true;
387
- this._nullBuf.set_Item(idx - 1, '\u0001');
388
- for (let i = 0; i < localCellSize; i++)
389
- this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, '\0');
390
- this._nullBuf.set_Item(idx - 1, '\u0001');
391
- }
392
- res = true;
393
- }
394
- else {
395
- let insertVal;
396
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
397
- if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
398
- insertVal = BlobType.getEmptyBlobPrefix('\u0001');
399
- else
400
- insertVal = BlobType.getEmptyBlobPrefix('\0');
401
- if (!this._cellsIsNullDefault)
402
- insertVal = insertVal + this._cellsDefaultVal;
403
- }
404
- else if (this._cellsIsNullDefault)
405
- insertVal = null;
406
- else
407
- insertVal = this._cellsDefaultVal;
408
- if (insertVal !== null && StorageAttributeCheck.isTypeLogical(this._cellsAttr))
409
- insertVal = (DisplayConvertor.toBoolean(insertVal) ? new StringBuilder().Append('\u0001').ToString() : new StringBuilder().Append('\0').ToString());
410
- let dataBufVal = insertVal;
411
- while (this._cells.length < idx) {
412
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
413
- this._cells.push(new CellElement(insertVal.substr(VectorType.EMPTY_BLOB_PREFIX_LEN), this._cellsIsNullDefault, insertVal.substr(0, VectorType.EMPTY_BLOB_PREFIX_LEN)));
414
- this._dataBuf.Append(this.getNullString(VectorType.BLOB_TYPE_STRUCT_SIZE));
415
- }
416
- else {
417
- this._cells.push(new CellElement(insertVal, this._cellsIsNullDefault));
418
- if (insertVal !== null) {
419
- if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME) {
420
- if (createBufferValForNumType) {
421
- createBufferValForNumType = false;
422
- dataBufVal = RecordUtils.byteStreamToString(insertVal);
423
- }
424
- }
425
- this._dataBuf.Append(dataBufVal);
426
- let valLen;
427
- if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
428
- valLen = UtilStrByteMode.lenB(dataBufVal);
429
- else
430
- valLen = dataBufVal.length;
431
- for (let i = valLen; i < localCellSize; i++)
432
- this._dataBuf.Append((this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
433
- }
434
- else
435
- this._dataBuf.Append(this.getNullString(localCellSize));
436
- }
437
- this._nullBuf.Insert(this._cells.length - 1, this._cellsIsNullDefault ? '\u0001' : '\0');
438
- }
439
- res = this.setVecCell(idx, newValue, isNull);
440
- }
441
- }
442
- }
443
- catch (ApplicationException) {
444
- res = false;
445
- }
446
- return res;
447
- }
448
- adjustToFit(field) {
449
- if (field.getType() === StorageAttribute.BLOB_VECTOR) {
450
- let srcAttr = this.getCellsAttr();
451
- let dstAttr = field.getCellsType();
452
- if (StorageAttributeCheck.isTheSameType(srcAttr, dstAttr)) {
453
- this.init();
454
- if (StorageAttributeCheck.IsTypeAlphaOrUnicode(srcAttr) && StorageAttributeCheck.IsTypeAlphaOrUnicode(dstAttr)) {
455
- let dstSizeInChars = field.getVecCellsSize();
456
- let srcSizeInChars = ((this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize);
457
- let isByteMode = UtilStrByteMode.isLocaleDefLangDBCS() && StorageAttributeCheck.isTypeAlpha(dstAttr);
458
- if (srcSizeInChars !== dstSizeInChars) {
459
- let adjData = new StringBuilder();
460
- for (let i = 0; i < dstSizeInChars; i = i + 1) {
461
- let curr = this._cells.get_Item(i);
462
- if (!curr.isNull) {
463
- if (srcSizeInChars > dstSizeInChars) {
464
- if (isByteMode)
465
- curr.data = UtilStrByteMode.leftB(curr.data, dstSizeInChars);
466
- else
467
- curr.data = curr.data.substr(0, dstSizeInChars);
468
- adjData.Append(curr.data);
469
- }
470
- else {
471
- let tmpData = new StringBuilder();
472
- tmpData.Append(curr.data);
473
- let dataLen = isByteMode ? UtilStrByteMode.lenB(curr.data) : curr.data.length;
474
- for (let j = dataLen; j < dstSizeInChars; j = j + 1)
475
- tmpData.Append(' ');
476
- adjData.Append(tmpData.ToString());
477
- curr.data = tmpData.ToString();
478
- }
479
- }
480
- else {
481
- let tmpData = new StringBuilder();
482
- for (let j = 0; j < dstSizeInChars; j = j + 1)
483
- tmpData.Append('\0');
484
- adjData.Append(tmpData.ToString());
485
- curr.data = tmpData.ToString();
486
- }
487
- }
488
- this._dataBuf = adjData;
489
- }
490
- }
491
- let newSize = field.getVecCellsSize();
492
- this._cellsAttr = field.getCellsType();
493
- this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (newSize * 2) : newSize);
494
- this._cellsDefaultVal = field.getCellDefualtValue();
495
- this._cellsIsNullDefault = field.isNullDefault();
496
- this._allowNull = field.NullAllowed;
497
- this._originalflatData = this.toString();
498
- return;
499
- }
500
- else
501
- throw new ApplicationException("in VectorType.adjustToFit vector basic types does not agree");
502
- }
503
- else
504
- throw new ApplicationException("in VectorType.adjustToFit " + field.getName() + " is not of type vector");
505
- }
506
- buildHeadersString() {
507
- let res = VectorType.BLOB_TABLE_STR + VectorType.VECTOR_STR + "," + VectorType.VERSION + "," + 1 + "," + this._cellsAttr + ",";
508
- res = res + this._cellSize + ",";
509
- let def = "";
510
- if (this._cellsDefaultVal !== null)
511
- if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
512
- def = RecordUtils.byteStreamToString(this._cellsDefaultVal);
513
- else
514
- def = this._cellsDefaultVal;
515
- if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
516
- def = def + this.getEmptyString(this._cellSize - UtilStrByteMode.lenB(def));
517
- else
518
- def = def + this.getEmptyString(this._cellSize - def.length);
519
- res = res + def + "," + (this._cellsIsNullDefault ? "1" : "0") + ",";
520
- res = res + (this._allowNull ? "1" : "0") + "," + this._cellSize + "," + this._cells.length + ",";
521
- res = res + ((this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) ? "1" : "0") + ",";
522
- if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
523
- res = res + "0,";
524
- return res;
525
- }
526
- getNullString(size) {
527
- let res = new StringBuilder();
528
- for (let i = 0; i < size; i = i + 1)
529
- res.Append('\0');
530
- return res.ToString();
531
- }
532
- getEmptyString(size) {
533
- let res = new StringBuilder();
534
- for (let i = 0; i < size; i = i + 1)
535
- res.Append(' ');
536
- return res.ToString();
537
- }
538
- getBlobsBuf() {
539
- let res = new StringBuilder();
540
- for (let i = 0; i < this._cells.length; i = i + 1) {
541
- let data = "";
542
- let blobSize = 0;
543
- let curr = this._cells.get_Item(i);
544
- if (curr.data !== null) {
545
- data = curr.data;
546
- blobSize = data.length;
547
- }
548
- res.Append(blobSize);
549
- res.Append("," + curr.blobFieldPrefix + "," + data + ";");
550
- }
551
- return (res + ",");
552
- }
553
- static getCellsAttr(blob) {
554
- if (VectorType.validateBlobContents(blob)) {
555
- let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
556
- return tokens[3].charAt(0);
557
- }
558
- else
559
- throw new ApplicationException("in static getCellsAttr the blob is in the wrong format");
560
- }
561
- static getCellSize(blob) {
562
- let cellsType = VectorType.getCellsAttr(blob);
563
- if (cellsType !== StorageAttribute.BLOB && cellsType !== StorageAttribute.BLOB_VECTOR) {
564
- let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
565
- return NNumber.Parse(tokens[4]);
566
- }
567
- else {
568
- return 2147483647;
569
- }
570
- }
571
- static getVecSize(blob) {
572
- if (VectorType.validateBlobContents(blob)) {
573
- let pos = BlobType.blobPrefixLength(blob);
574
- let tokens = StrUtil.tokenize(blob.substr(pos), ",");
575
- pos = pos + (tokens[0].length + 1);
576
- pos = pos + (tokens[1].length + 1);
577
- pos = pos + (tokens[2].length + 1);
578
- pos = pos + (tokens[3].length + 1);
579
- let cellsSize = tokens[4];
580
- pos = pos + (cellsSize.length + 1);
581
- pos = pos + (NNumber.Parse(cellsSize) + 1);
582
- tokens = StrUtil.tokenize(blob.substr(pos), ",");
583
- return NNumber.Parse(tokens[3]);
584
- }
585
- throw new ApplicationException("in static getVecSize the blob is in the wrong format");
586
- }
587
- isUnicode(flatData) {
588
- let start = BlobType.blobPrefixLength(flatData);
589
- let catcher = flatData.substr(start, VectorType.BLOB_TABLE_STR_LEN);
590
- return (catcher === VectorType.BLOB_TABLE_STR);
591
- }
592
- }
593
- export class CellElement {
594
- blobFieldPrefix = null;
595
- data = null;
596
- isNull = false;
597
- constructor(val, is_null, ctrlData) {
598
- if (arguments.length === 2)
599
- this.constructor_0(val, is_null);
600
- this.constructor_1(val, is_null, ctrlData);
601
- }
602
- constructor_0(val, is_null) {
603
- this.data = val;
604
- this.isNull = is_null;
605
- }
606
- constructor_1(val, is_null, ctrlData) {
607
- this.data = val;
608
- this.isNull = is_null;
609
- this.blobFieldPrefix = ctrlData;
610
- }
611
- }
612
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9kYXRhL1ZlY3RvclR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBTWxELE1BQU0sT0FBTyxVQUFXLFNBQVEsY0FBYztJQUU1QyxNQUFNLENBQUMsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMscUJBQXFCLEdBQVcsQ0FBQyxDQUFDO0lBR3pDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBVyxFQUFFLENBQUM7SUFFbEMsTUFBTSxHQUFzQixJQUFJLENBQUM7SUFDakMsU0FBUyxHQUFhLElBQUksQ0FBQztJQUMzQixVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGdCQUFnQixHQUFXLElBQUksQ0FBQztJQUNoQyxTQUFTLEdBQVcsQ0FBQyxDQUFDO0lBQ3RCLFVBQVUsR0FBcUIsSUFBSSxDQUFD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T0FBTyxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7O0FBT0gsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZUFBZSxHQUFXLElBQUksQ0FBQztJQUMvQixJQUFJLEdBQVcsSUFBSSxDQUFDO0lBQ3BCLE1BQU0sR0FBWSxLQUFLLENBQUM7SUFNeEIsWUFBWSxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxRQUFpQjtRQUMxRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUdPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7UUFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUdPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxRQUFnQjtRQUNuRSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIEVuY29kaW5nLFxyXG4gIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgRmllbGREZWYgfSBmcm9tICcuL0ZpZWxkRGVmJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgU3RvcmFnZUF0dHJpYnV0ZSwgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLCBTdHJVdGlsLCBVdGlsU3RyQnl0ZU1vZGUgfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4uL2d1aS9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHsgUmVjb3JkVXRpbHMgfSBmcm9tICcuL1JlY29yZFV0aWxzJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IFZlY3RvclR5cGVCYXNlIH0gZnJvbSAnLi9WZWN0b3JUeXBlQmFzZSc7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICByZXByZXNlbnRzIHRoZSBtYWdpYyB2ZWN0b3IgdHlwZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVmVjdG9yVHlwZSBleHRlbmRzIFZlY3RvclR5cGVCYXNlIHtcclxuXHJcbiAgc3RhdGljIFZFUlNJT046IG51bWJlciA9IDU7IC8vIHZlcnNpb24gbm8gNSBpbmNsdWRlcyB0aGUgY29udGVudCBmaWVsZFxyXG4gIHN0YXRpYyBFTVBUWV9CTE9CX1BSRUZJWF9MRU46IG51bWJlciA9IDc7XHJcblxyXG4gIC8vIEZPUiBFWFBMQU5BVElPTlMgUkVHQVJESU5HIFRISVMgTlVNQkVSIFBMRUFTIFNFRSBET0NVTUVOVEFUSU9OIElOU0lERSBpbml0IE1FVEhPRFxyXG4gIHN0YXRpYyBCTE9CX1RZUEVfU1RSVUNUX1NJWkU6IG51bWJlciA9IDI4O1xyXG5cclxuICBwcml2YXRlIF9jZWxsczogTGlzdDxDZWxsRWxlbWVudD4gPSBudWxsOyAvLyBhIHZlY3RvciBjb250YWluaW5nIENlbGxFbGVtZW50c1xyXG4gIHByaXZhdGUgX2VuY29kaW5nOiBFbmNvZGluZyA9IG51bGw7IC8vIHRvIGJlIHVzZWQgb25seSB3aXRoIGFscGhhIG9yIG1lbW9cclxuICBwcml2YXRlIF9hbGxvd051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jZWxsQ29udGVudFR5cGU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2VsbFNpemU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2VsbHNBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gbnVsbDsgLy8gYWxsIGNlbGxzIGluIHRoZSB2ZWN0b3IgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlXHJcbiAgcHJpdmF0ZSBfY2VsbHNEZWZhdWx0VmFsOiBzdHJpbmcgPSBudWxsOyAvLyBhbGwgY2VsbHMgaW4gdGhlIG1hZ2ljIHZlY3RvciBoYXMgdGhlIHNhbWUgZGVmYXVsdCB2YWx1ZVxyXG4gIHByaXZhdGUgX2NlbGxzSXNOdWxsRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBudWxsIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgYWxsIGNlbGxzIGluIHRoZSBtYWdpYyB2ZWN0b3JcclxuXHJcbiAgLy8gZGF0YSBidWZmZXJzIHRoYXQgd2UgY2hhbmdlIER5bmFtaWNhbGx5IHRvIGZhY2lsaXRhdGVcclxuICAvLyB0aGUgY3JlYXRpb24gb2YgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gIHByaXZhdGUgX2RhdGFCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7IC8vIG1hcmtzIHdoZXRoZXIgdGhlIHZlY3RvciB3YXMgaW5pdGlhbGl6ZWQgaWYgaXQgd2FzIG5vdCB0aGF0IGl0IGlzIGFuIGludmFsaWQgdmVjdG9yXHJcbiAgcHJpdmF0ZSBfbnVsbEJ1ZjogU3RyaW5nQnVpbGRlciA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWxmbGF0RGF0YTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBjb250ZW50VHlwZTogc3RyaW5nLCBkZWZ1YWx0OiBzdHJpbmcsIGlzRGVmTnVsbDogYm9vbGVhbiwgbnVsbEFsb3dlZDogYm9vbGVhbiwgbGVuZ3RoOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKGJsb2JTdHJpbmc6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoZmxkOiBGaWVsZERlZik7XHJcbiAgY29uc3RydWN0b3IoY2VsbHNUeXBlT3JCbG9iU3RyaW5nT3JGbGQ6IGFueSwgY29udGVudFR5cGU/OiBzdHJpbmcsIGRlZnVhbHQ/OiBzdHJpbmcsIGlzRGVmTnVsbD86IGJvb2xlYW4sIG51bGxBbG93ZWQ/OiBib29sZWFuLCBsZW5ndGg/OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNilcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkLCBjb250ZW50VHlwZSwgZGVmdWFsdCwgaXNEZWZOdWxsLCBudWxsQWxvd2VkLCBsZW5ndGgpO1xyXG5cclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkID09PSBudWxsIHx8IGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY2VsbHNUeXBlT3JCbG9iU3RyaW5nT3JGbGQpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCBidXQgZG9lcyBub3QgZmlsbCBpdCB3aXRoIGRhdGEgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgVmVjdG9yIHdlIG11c3QgaW52b2tlIG9uXHJcbiAgLy8vICAgaXQgdGhlIGl0cyBpbml0IG1ldGhvZCBhIFZlY3RvclR5cGUgd2hpY2ggd2FzIG5vdCBpbml0aWFsaXplZCBpcyBhbiB1bnZhbGlkIHZlY3Rvci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMChjZWxsc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNvbnRlbnRUeXBlOiBzdHJpbmcsIGRlZnVhbHQ6IHN0cmluZywgaXNEZWZOdWxsOiBib29sZWFuLCBudWxsQWxvd2VkOiBib29sZWFuLCBsZW5ndGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2NlbGxzQXR0ciA9IGNlbGxzVHlwZTtcclxuICAgIHRoaXMuX2NlbGxDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlO1xyXG4gICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gZGVmdWFsdDtcclxuICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA9IGlzRGVmTnVsbDtcclxuICAgIHRoaXMuX2NlbGxTaXplID0gKCh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAobGVuZ3RoICogMikgOiBsZW5ndGgpO1xyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5fYWxsb3dOdWxsID0gbnVsbEFsb3dlZDtcclxuICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gdGhpcy50b1N0cmluZygpO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGJ1dCBkb2VzIG5vdCBmaWxsIGl0IHdpdGggZGF0YSBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZSBWZWN0b3Igd2UgbXVzdCBpbnZva2Ugb25cclxuICAvLy8gICBpdCB0aGUgaXRzIGluaXQgbWV0aG9kIGEgVmVjdG9yVHlwZSB3aGljaCB3YXMgbm90IGluaXRpYWxpemVkIGlzIGFuIGludmFsaWQgdmVjdG9yLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iU3RyaW5nXCI+YSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJsb2IncyBkYXRhIGJ5dGVzPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoYmxvYlN0cmluZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZWxscyA9IG5ldyBMaXN0PENlbGxFbGVtZW50PigpO1xyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuX29yaWdpbmFsZmxhdERhdGEgPSBibG9iU3RyaW5nO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnN0cnVjdCB0aGUgb2JqZWN0IHdpdGggYSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hhcnNcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMihmbGQ6IEZpZWxkRGVmKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZWxscyA9IG5ldyBMaXN0PENlbGxFbGVtZW50PigpO1xyXG4gICAgdGhpcy5fY2VsbHNBdHRyID0gZmxkLmdldENlbGxzVHlwZSgpO1xyXG4gICAgdGhpcy5fY2VsbENvbnRlbnRUeXBlID0gZmxkLmdldFZlY0NlbGxzQ29udGVudFR5cGUoKTtcclxuICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGZsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBmbGQuaXNOdWxsRGVmYXVsdCgpO1xyXG4gICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPigodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKGZsZC5nZXRWZWNDZWxsc1NpemUoKSAqIDIpIDogZmxkLmdldFZlY0NlbGxzU2l6ZSgpKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FsbG93TnVsbCA9IGZsZC5OdWxsQWxsb3dlZDtcclxuICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gdGhpcy50b1N0cmluZygpO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyBhIFZlY3RvclR5cGUgZnJvbSBpdHMgZmxhdHRlbmVkIGJsb2IgcmVwcmVzZW50YXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlN0cmluZ1wiPmEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iJ3MgZGF0YSBieXRlczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBmYWxzZSBpcyB0aGUgZ2l2ZW4gYmxvYiBpcyBub3QgYSB2ZWN0b3IgKHRoZSBmbGF0dGVuIGZvcm1hdCBpcyB3cm9uZyk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBudWxsO1xyXG4gICAgbGV0IHRva2VuSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGN1cnJlbnRUb2tlbjogc3RyaW5nID0gbnVsbDsgLy8gdGhlIGN1cnJlbnQgdG9rZW4gd2UgYXJlIHBhcmluZ1xyXG4gICAgbGV0IGlzRmxhdERhdGFUcmFuc2xhdGVkOiBib29sZWFuID0gdGhpcy5pc1VuaWNvZGUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBsZXQgaXNEYmNzQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuXHJcbiAgICAvLyBwb3MgaXMgcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsZmxhdERhdGEgc3RyaW5nXHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgLy8gYmxvYlxyXG4gICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICBsZXQgdmVjU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpKSB7XHJcbiAgICAgICAgbGV0IGJsb2JQcmVmaXg6IHN0cmluZyA9IEJsb2JUeXBlLmdldFByZWZpeCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgICAgICB0aGlzLl9jZWxsQ29udGVudFR5cGUgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZShibG9iUHJlZml4KTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgdGhlIGhlYWRlcnMgb2YgdGhlIHRhYmxlIGFuZCB0aGUgdmVjdG9yIGFuZCB0aGUgZmlyc3QgJywnO1xyXG4gICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgNCArIDUgKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgdmVyc2lvblxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfIGluIHZlY3RvcnMgYWx3YXlzIGNvbnRhaW4gdmFsdWUgb2YgMVxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbCBhdHRyaWJ1dGUgaW4gdmVjdG9yIHRoZXJlIGlzIG9ubHkgb25lIGF0dHJpYnV0ZSBmbyB0aGUgZW50aXJlIHZlY3RvclxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsc0F0dHIgPSA8U3RvcmFnZUF0dHJpYnV0ZT5jdXJyZW50VG9rZW4uY2hhckF0KDApO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIDI7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBDb2x1bW5zTGVuXyB0aGF0IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgIC8vIHNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbiB3ZSBpbmNyZWFzZSBwb3MgYnkgY3VycmVudFRva2VuLmxlbmd0aCgpXHJcbiAgICAgICAgLy8gdGhpcyBudW1iZXIgaXMgc2FtZSBhcyB0aGUgQ29sdW1uc1RvdGFsTGVuXyBmb3IgdmVjdG9yc1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsU2l6ZSA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBjZWxsIGRlZmF1bHQgdmFsdWUgaXMgaXQgaXMgbnVtZXJpYyBpdCBpcyBzZW50IGFzIE5VTV9UWVBFXHJcbiAgICAgICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgbWF5IGNvbnRhaW4gYXMgdmFsdWUgY2hhcmN0ZXJzIGFzIHRoZSBkZWxpbWV0ZXJcclxuICAgICAgICAvLyB3ZSBjYW4gbm90IHVzZSB0aGUgU3RyaW5nVG9rZW5pemVyLlxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpLCAyKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pIHtcclxuICAgICAgICAgIC8vIFFDUiA0Mjk0NDUgc2luY2UgdGhlIHZlY3RvciBpcyBlbmNvZGVkIHRvIGJhc2U2NC9oZXggd2hlbiBpdCBpcyByZWNpdmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgLy8gd2UgbXVzdCB1c2UgdGhlIGNvcnJlY3QgY2hhci1zZXQgd2hlbiByZWNpdmluZyB2ZWN0b3Igb2YgYWxwaGEgb3IgbWVtbyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgIC8vIGluIHZlY3RvcnMgd2UgbXVzdCBjb25jaWRlciB0aGUgY2hhciBzZXQgc2luY2Ugd2hlbiB3ZSBnb3QgaXQgZnJvbSB0aGUgc2VydmVyIGl0IHdhcyBlbmNvZGVkXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICBpc0RiY3NBbHBoYSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlzRmxhdERhdGFUcmFuc2xhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcyksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2VuY29kaW5nICE9PSBudWxsICYmICFpc0ZsYXREYXRhVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyh0aGlzLl9jZWxsc0RlZmF1bHRWYWwpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKHRoaXMuX2NlbGxzRGVmYXVsdFZhbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKGJhLCAwLCBiYS5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgIGlmIChpc0RiY3NBbHBoYSlcclxuICAgICAgICAgIHBvcyA9IHBvcyArIHRoaXMuX2NlbGxzRGVmYXVsdFZhbC5sZW5ndGggKyAxO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgdGhpcy5fY2VsbFNpemUgKyAxKTsgLy8gc2lrcCB0aGUgZW5kaW5nICcsJ1xyXG5cclxuICAgICAgICAvLyBpbnJvcmRlciB0byBjb250aW51ZSB1c2luZyB0aGUgdG9rZW5pemVyIGZvciB0aGUgcmVzdCBvZiB0aGUgaGVhZGVycyBwYXJzaW5nXHJcbiAgICAgICAgLy8gcmVpbml0IGl0XHJcbiAgICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICAgICAgdG9rZW5JZHggPSAwO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbHMgbnVsbCBkZWZhdWx0IGZsYWdcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGxzIG51bGwgYWxsb3dlZCBmbGFnXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHRoaXMuX2FsbG93TnVsbCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgcGFyc2luZyBvZiBDb2x1bW5zVG90YWxMZW5fXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IgKCBSZWNvcmRzQ291bnRfKVxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB2ZWNTaXplID0gPG51bWJlcj5OTnVtYmVyLlBhcnNlKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gdGhlIGJsb2JzXyB3aWxsIGFsd2F5cyBjb250YWluIHZhbHVlIG9mIDEgc2luZSB3ZSBoYXZlIGluIHZlY3RvcnMgb25seSBvbmUgY29sbW5cclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gYmxvYnMgb2Zmc2V0IHRhYmxlIGluIHRoZSB2ZWN0b3IgY2FzZSB3aWxsIGFsd2F5IGNvbnRhaW4gb25seSBvbmUgdmFsdWUgZXF1YWxzIHRvIDBcclxuICAgICAgICAvLyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBjb2xtcyBpbiB0aGUgdmVjdG9yXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGRhdGEgYXJyYXlcclxuICAgICAgICBsZXQgZGF0YTogc3RyaW5nO1xyXG4gICAgICAgIGlmIChpc0RiY3NBbHBoYSkge1xyXG4gICAgICAgICAgZGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCA8bnVtYmVyPih2ZWNTaXplICogdGhpcy5fY2VsbFNpemUpKTtcclxuICAgICAgICAgIHBvcyA9IHBvcyArIGRhdGEubGVuZ3RoICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBkYXRhID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPih2ZWNTaXplICogdGhpcy5fY2VsbFNpemUpKTtcclxuICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgdmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplICsgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhbGxvY2F0ZSB0aGUgZGF0YUJ1ZlxyXG4gICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgJiYgdGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8gJiYgdGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpXHJcbiAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZChkYXRhKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgbGV0IG51bGxCdWY6IHN0cmluZyA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj52ZWNTaXplKTtcclxuICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHZlY1NpemUgKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2F2ZSB0aGUgbnVsbEJ1ZlxyXG4gICAgICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihudWxsQnVmKTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgb2YgdGhlIGNlbGxzXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZlY1NpemU7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gbnVsbEJ1Zi5jaGFyQXQoaSkgPiAnXFwwJztcclxuICAgICAgICAgICAgLy8gbnVtZXJpYyB0eXBlIGFyZSBzZW50IGFzIE5VTV9UWVBFIHNvIHdlIHRyYW5zbGF0ZSB0aGVtIHRvIGhleFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSksIDIpLCBpc051bGwpKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSB7XHJcbiAgICAgICAgICAgICAgLy8gUUNSIDQyOTQ0NSBzaW5jZSB0aGUgdmVjdG9yIGlzIGVuY29kZWQgdG8gYmFzZTY0L2hleCB3aGVuIGl0IGlzIHJlY2l2ZWQgZnJvbSB0aGVcclxuICAgICAgICAgICAgICAvLyBzZXJ2ZXIgd2UgbXVzdCB1c2UgdGhlIGNvcnJlY3QgY2hhci1zZXQgd2hlbiByZWNpdmluZyB2ZWN0b3Igb2YgYWxwaGEgb3IgbWVtbyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZztcclxuICAgICAgICAgICAgICBpZiAoaXNEYmNzQWxwaGEpXHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5taWRCKGRhdGEsIDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGEgPSBkYXRhLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fZW5jb2RpbmcgIT09IG51bGwgJiYgIWlzRmxhdERhdGFUcmFuc2xhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYmE6IFVpbnQ4QXJyYXkgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXMoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW1FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAgICAgICAgIGxldCBjZWxsRGF0YTogc3RyaW5nID0gZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICAgIGNlbGxEYXRhID0gRW5jb2RpbmcuVW5pY29kZS5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW1FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiB2ZWN0b3JzIG9yZiB2ZWN0b3JzIG9yIHZlY3RvcnMgb2YgYmxvYnMgd2UgbmVlZCB0byB0cmVhdCB0aGVtIGRpZmZlcmVudGxseVxyXG4gICAgICAgICAgLy8gZWFjaCBibG9iIG9yIHZlY3RvciBpcyBcImZsYXR0ZW5lZCBpbiB0aGUgZW5kIG9mIHRoZSBudWxsIGJ1ZmZcclxuICAgICAgICAgIC8vIGFzIGEgc3RyaW5nIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxyXG4gICAgICAgICAgLy8gQmxvYl9TaXplLE9iakhhbmRsZSxWYXJpYW50SWR4LFR5cGUsVmVjQ2VsbEF0dHIsLi4uLmRhdGEuLi4uO25leHRfYmxvYjtcclxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBlciBhIGJsb2IgY29tZSB0byB0aGUgY2xpZW50IG5veSB2aWEgdmVjdG9yIGl0cyBmb3JtYXQgaXM6XHJcbiAgICAgICAgICAvLyBPYmpIYW5kbGUsVmFyaWFudElkeCxUeXBlLFZlY0NlbGxBdHRyO2RhdGEgdGhlcmUgZm9yIHdlIG5lZWQgdG8gbWFrZSB0aGUgYWRqdXN0bWVudHNcclxuICAgICAgICAgIC8vIGluIHRoZSBwYXJzaW5nIHByb2Nlc3MgYW5kIGluIHZlY0dldCBhbmQgaW4gdG9TdHJpbmdcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2ZWNTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICAgICAgICAgIHRva2VuSWR4ID0gMDtcclxuXHJcbiAgICAgICAgICAgIC8vIHBhcnNlIGJsb2Igc2l6ZVxyXG4gICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gPG51bWJlcj5OTnVtYmVyLlBhcnNlKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgICAgICAvLyBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgYmxvYiBoZWFkZXJcclxuICAgICAgICAgICAgbGV0IGJsb2JIZWFkZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBHdWlDb25zdGFudHMuQkxPQl9QUkVGSVhfRUxFTUVOVFNfQ09VTlQ7IGorKykge1xyXG4gICAgICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICAgICAgICBibG9iSGVhZGVyID0gYmxvYkhlYWRlciArIGN1cnJlbnRUb2tlbjtcclxuICAgICAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoaiAhPT0gR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgYmxvYkhlYWRlciA9IGJsb2JIZWFkZXIgKyBcIixcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjZWxsRGF0YTogc3RyaW5nID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnNpemUpO1xyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRoZSBjZWxsIHRvIHRoZSB2ZWNcclxuICAgICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IG51bGxCdWYuY2hhckF0KGkpID4gJ1xcMCc7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwsIGJsb2JIZWFkZXIpKTtcclxuICAgICAgICAgICAgcG9zID0gPG51bWJlcj4oPG51bWJlcj5wb3MgKyBzaXplICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIGRhdGFCdWYgd2FzIG5vdCBidWlsdCBkdXJpbmcgXCJjZWxscyBncm93dGhcIiAtIGFsbG9jYXRlIGl0IHJpZ2h0IG5vdywgaW4gb25lLXNob3QuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFCdWYuTGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKGRhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBWZWN0b3JUeXBlLmluaXQgd3JvbmcgdmVjdG9yIGZvcm1hdFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYSBmbGF0dGVuIGJsb2Igc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdlIGFzc3VtZSBoZXJlIHRoYXQgYWxsIGNoYW5nZXMgYXJlIGR5bmFtaWNhbGx5IHNhdmUgaW50byB0aGVcclxuICAvLy8gICBidWZmcyBlYWNoIHRpbWUgdGhlIHZlY3RvciBjaGFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogc3RyaW5nID0gXCJcIjsgLy8gdGFrZVxyXG5cclxuICAgIC8vIGxhenkgZXZhbHVhdGlvbiBpZiB0aGUgdmVjdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgaXQgd2Fzbid0IGNoYW5nZWQgc28gcmV0dXJuIHRoZSBvcmlnaW5hbFxyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBoZWFkZXJzXHJcbiAgICAgIHJlcyA9IHJlcyArIDAgKyBcIixcIiArIDAgKyBcIixcIiArIFwiMFwiICsgXCIsXCIgKyA8c3RyaW5nPnRoaXMuX2NlbGxzQXR0ciArIFwiLFwiICsgdGhpcy5fY2VsbENvbnRlbnRUeXBlICsgXCI7XCI7XHJcbiAgICAgIC8vIHRoZSBibG9iIGhlYWRlciBvZiB0aGlzIGJsb2JcclxuICAgICAgcmVzID0gcmVzICsgdGhpcy5idWlsZEhlYWRlcnNTdHJpbmcoKTtcclxuICAgICAgLy8gKyBkYXRhQnVmLnRvU3RyaW5nKCkgKyBcIixcIiArIG51bGxCdWYudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgICAgbGV0IGRhdGFCdWZDaGFyQXJyeTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPih0aGlzLl9kYXRhQnVmLkxlbmd0aCAqIDIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZGF0YUJ1Zi5MZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgZGF0YUJ1ZkNoYXJBcnJ5W2kgKiAyXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHRoaXMuX2RhdGFCdWYuZ2V0X0l0ZW0oaSkuY2hhckNvZGVBdCgwKSkgJSAyNTYpO1xyXG4gICAgICAgICAgZGF0YUJ1ZkNoYXJBcnJ5W2kgKiAyICsgMV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCh0aGlzLl9kYXRhQnVmLmdldF9JdGVtKGkpLmNoYXJDb2RlQXQoMCkpIC8gMjU2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzID0gcmVzICsgTlN0cmluZy5Gcm9tQ2hhcnMoZGF0YUJ1ZkNoYXJBcnJ5KSArIFwiLFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXMgPSByZXMgKyB0aGlzLl9kYXRhQnVmICsgXCIsXCI7XHJcblxyXG4gICAgICByZXMgPSByZXMgKyB0aGlzLl9udWxsQnVmICsgXCIsXCI7XHJcblxyXG4gICAgICAvLyBpbiBibG9icyBhbmQgdmVjdG9yIHdlIGRvIG5vdCB1cGRhdGVcclxuICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICByZXMgPSByZXMgKyB0aGlzLmdldEJsb2JzQnVmKCk7XHJcblxyXG4gICAgICByZXMgPSByZXMgKyBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXMgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2VsbHMgYXR0cmlidXRlICggdGhlIHNhbmUgZm9yIGFsbCBjZWxscyBpbiB0aGUgdmVjdG9yKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2VsbHNBdHRyKCk6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZClcclxuICAgICAgcmV0dXJuIFZlY3RvclR5cGUuZ2V0Q2VsbHNBdHRyKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fY2VsbHNBdHRyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNlbGxzIHNpemUgKCBzYW1lIHNpemUgZm9yIGFsbCBjZWxscylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENlbGxTaXplKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0VmFsOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZClcclxuICAgICAgcmV0VmFsID0gVmVjdG9yVHlwZS5nZXRDZWxsU2l6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbFNpemU7XHJcblxyXG4gICAgLy8gdW5pY29kZSBjZWxsIHNpemUgaXMgc2F2ZWQgaW50ZXJuYWxseSBhcyBieXRlIGxlbmd0aCBzaW5jZSB0aGF0IGlzIHRoZSB3YXkgdGhlIHNlcnZlciBzYXZlIGl0XHJcbiAgICBpZiAodGhpcy5nZXRDZWxsc0F0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKVxyXG4gICAgICByZXRWYWwgPSBNYXRoLmZsb29yKHJldFZhbCAvIDIpO1xyXG5cclxuICAgIHJldHVybiByZXRWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmVjdG9yIHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFZlY1NpemUoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldHVybiBWZWN0b3JUeXBlLmdldFZlY1NpemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiA8bnVtYmVyPnRoaXMuX2NlbGxzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGdpdmUgY2VsbCBjZWxscyBpbmRleGVzIHN0YXJ0IGZyb20gMSB3cm9uZyBpbmRleGVzIG9yIGluZGV4ZXMgdGhlIGRvZXMgbm90IGV4aXN0XHJcbiAgLy8vICAgd2lsbCByZXR1cm4gZGVmYXVsdCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgY2VsbCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2VsbCB2YWx1ZSBUT0RPOiB5YXJpdiBjaGVjayB3aXRoIHJpbmEgd2hhdCB3ZSBzaG91bGQgZG8gd2l0aFxyXG4gIC8vLyAgIGJsb2JzIGV4dHJhIGZpZWxkc1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0VmVjQ2VsbChpZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmV0VmFsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgIGlmICg8bnVtYmVyPmlkeCA8PSB0aGlzLmdldFZlY1NpemUoKSkge1xyXG4gICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpLmRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5ibG9iRmllbGRQcmVmaXggKyBcIjtcIiArIHJldFZhbDtcclxuXHJcbiAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgcmV0VmFsID0gKChyZXRWYWwuY2hhckF0KDApID09PSAnXFwwJykgPyBcIjBcIiA6IFwiMVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpLmlzTnVsbClcclxuICAgICAgICAgIHJldFZhbCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBjZWxsIHZhbHVlcyBvZiBhIHZlY3RvciBpbiBzdHJpbmcgYXJyYXkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENlbGxWYWx1ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJldFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBjZWxsVmFsdWVzOiBzdHJpbmdbXSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5pbml0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0VmVjU2l6ZSgpID4gMClcclxuICAgIHtcclxuICAgICAgY2VsbFZhbHVlcyA9IG5ldyBBcnJheTxzdHJpbmc+KHRoaXMuZ2V0VmVjU2l6ZSgpKTtcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgdmVjdG9yIHZhbHVlXHJcbiAgICAgIGZvciAobGV0IGlkeDogbnVtYmVyID0gMDsgaWR4IDwgdGhpcy5nZXRWZWNTaXplKCk7IGlkeCsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4KS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4KS5ibG9iRmllbGRQcmVmaXggKyBcIjtcIiArIHJldFZhbDtcclxuXHJcbiAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgcmV0VmFsID0gKChyZXRWYWwuY2hhckF0KDApID09PSAnXFwwJykgPyBcIjBcIiA6IFwiMVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuaXNOdWxsKVxyXG4gICAgICAgICAgcmV0VmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgY2VsbFZhbHVlc1tpZHhdID0gcmV0VmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0KVxyXG4gICAge1xyXG4gICAgICAgIGNlbGxWYWx1ZXMgPSBbXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjZWxsVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluc2VydHMgb3IgY2hhbmdlcyBhIGNlbGxzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBjZWxsIGluZGV4IGlmIHRoZSBpbmRleCBpcyBub3Qgc2VxdWVudGlhbCBjcmVhdHMgZW1wdHkgY2VsbCB0aWxsIHRoZSBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgKCBpZiBpdCBpcyBhIGJsb2IgdHlwZSBvciB2ZWN0b3IgaXQgY29udGFpbnMgdGhlIHByZWZpeCBvZiB0aGUgY29udHJvbCBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHJldHVucz4gIGZhbHNlIGlmIHRoZSBpbmRleCBpcyB3cm9uZyBvciB0aGUgdmVjdG9yIGlsbGZvcm1lZCA8L3JldHVucz5cclxuICBzZXRWZWNDZWxsKGlkeDogbnVtYmVyLCBuZXdWYWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjcmVhdGVCdWZmZXJWYWxGb3JOdW1UeXBlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgIGxldCBsb2NhbENlbGxTaXplOiBudW1iZXIgPSAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gTWF0aC5mbG9vcih0aGlzLl9jZWxsU2l6ZSAvIDIpIDogdGhpcy5fY2VsbFNpemU7XHJcbiAgICAgICAgLy8gdHJ5aW5nIHRvIHNldCBudWxsIHZhbHVlIHdoZW4gbm90IGFsbG93ZWRcclxuICAgICAgICBpZiAoaXNOdWxsICYmICF0aGlzLl9hbGxvd051bGwpIHtcclxuICAgICAgICAgIGlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWR4IDw9IHRoaXMuX2NlbGxzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IGN1cnI6IENlbGxFbGVtZW50ID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4IC0gMSk7XHJcbiAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG5vdCBudWxsXHJcbiAgICAgICAgICBpZiAoIWlzTnVsbCkge1xyXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgYmxvYnMgYW5kIHZlY3RvcnNcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgZGF0YSBpbiB0aGUgY2VsbFxyXG4gICAgICAgICAgICAgIGxldCBibG9iUHJlZml4TGVuZ3RoOiBudW1iZXIgPSBCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICBjdXJyLmJsb2JGaWVsZFByZWZpeCA9IG5ld1ZhbHVlLnN1YnN0cigwLCBibG9iUHJlZml4TGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRyZWF0IGVtcHR5IGJsb2JcclxuICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID4gYmxvYlByZWZpeExlbmd0aClcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IG5ld1ZhbHVlLnN1YnN0cihibG9iUHJlZml4TGVuZ3RoKTtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNpbXBsZSB0eXBlXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSkge1xyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKG5ld1ZhbHVlKSA/IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKDEpLlRvU3RyaW5nKCkgOiBuZXcgU3RyaW5nQnVpbGRlcigpLkFwcGVuZCgnXFwwJykuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGN1cnIuZGF0YTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gbmV3VmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBkYXRhIGJ1ZiBhcyBudW0gdHlwZSBzbyB3ZVxyXG4gICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlbSB0byB0aGUgYnVmXHJcbiAgICAgICAgICAgICAgbGV0IGRhdGFCdWZWYWw6IHN0cmluZyA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICAgICAgICAgIGRhdGFCdWZWYWwgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcoZGF0YUJ1ZlZhbCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmFEYXRhQnVmOiBVaW50OEFycmF5ID0gdGhpcy5fZW5jb2RpbmcuR2V0Qnl0ZXModGhpcy5fZGF0YUJ1Zi5Ub1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIGxldCBiYURhdGFCdWZWYWw6IFVpbnQ4QXJyYXkgPSB0aGlzLl9lbmNvZGluZy5HZXRCeXRlcyhkYXRhQnVmVmFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YSBidWZcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBiYURhdGFCdWZWYWwubGVuZ3RoICYmIDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgYmFEYXRhQnVmWzxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpXSA9IGJhRGF0YUJ1ZlZhbFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3Qga2VlcCB0aGUgd2hvbGUgc2l6ZSBvZiB0aGUgYWxwaGFcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGJhRGF0YUJ1ZlZhbC5sZW5ndGg7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgYmFEYXRhQnVmWzxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpXSA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSA/IDMyIDogMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYURhdGFCdWYsIDAsIGJhRGF0YUJ1Zi5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYURhdGFCdWYsIDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSksIDxudW1iZXI+bG9jYWxDZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRhdGEgYnVmXHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IgOTg3OTQzIHRyaW0gdGhlIHZhbHVlIGlmIGl0IGlzIGxvbmdlciB0aGUgdGhlIGNlbGwgbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGF0YUJ1ZlZhbC5sZW5ndGggJiYgPG51bWJlcj5pIDwgbG9jYWxDZWxsU2l6ZTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLnNldF9JdGVtKDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpLCBkYXRhQnVmVmFsLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW4gYWxwaGEgYW5kIG51bSB0eXBlIHdlIGRvIG5vdCBrZWVwIHRoZSB3aG9sZSBzaXplIG9mIHRoZSBhbHBoYS9OVU1fVFlQRVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gZGF0YUJ1ZlZhbC5sZW5ndGg7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAnICcgOiAnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUUNSIDk4Nzk0MyB0cmltIHRoZSB2YWx1ZSBpZiBpdCBpcyBsb25nZXIgdGhlIHRoZSBjZWxsIGxlbmd0aFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTylcclxuICAgICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gdGhpcy5fZGF0YUJ1Zi5Ub1N0cmluZygpLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpLCA8bnVtYmVyPmxvY2FsQ2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgICAgIHRoaXMuX251bGxCdWYuc2V0X0l0ZW0oaWR4IC0gMSwgJ1xcMCcpO1xyXG4gICAgICAgICAgICBjdXJyLmlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBudWxsXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3Vyci5kYXRhID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgcHJlZml4IGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYmxvYiBpcyB2ZWN0b3Igb3Igbm90XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICAgICAgY3Vyci5ibG9iRmllbGRQcmVmaXggPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcdTAwMDEnKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGN1cnIuYmxvYkZpZWxkUHJlZml4ID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXDAnKTtcclxuICAgICAgICAgICAgY3Vyci5pc051bGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXHUwMDAxJyk7XHJcblxyXG4gICAgICAgICAgICAvLyByZWxldmFudCBvbmx5IGZvciBub25lIGJsb2JzXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLnNldF9JdGVtKDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpLCAnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgICAgIHRoaXMuX251bGxCdWYuc2V0X0l0ZW0oaWR4IC0gMSwgJ1xcdTAwMDEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG5ldyByZWNvcmRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpbnNlcnRWYWw6IHN0cmluZztcclxuICAgICAgICAgIC8vIGNob29zZXMgdGhlIHZhbHVlIGluc2VydGVkIHRvIHRoZSBza2lwcGVkIGNlbGxzXHJcbiAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgaXMgdmVjdG9yIGZsYWdcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcdTAwMDEnKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGluc2VydFZhbCA9IEJsb2JUeXBlLmdldEVtcHR5QmxvYlByZWZpeCgnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBpbnNlcnRWYWwgKyB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7IC8vIGNvbmNhdCByZWdvbGFyIGJsb2IgY250cm9sIGRhdGFcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICAgICAgaW5zZXJ0VmFsID0gbnVsbDtcclxuICAgICAgICAgIC8vIHNpbXBsZSBudWxsIHZhbHVlXHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IHRoaXMuX2NlbGxzRGVmYXVsdFZhbDsgLy8gZGVmYXVsdCBzaW1wbGUgdmFsdWVcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgNTAzNjkxIHRoZSB2YWx1ZSBvZiB0cnVlIG9yIGZhbHNlIGluIHRoZSBzZXJ2ZXIgYXJlIHRoZSBudW1lcmljIHZhbHVlcyBvZiAxIGFuZCAwXHJcbiAgICAgICAgICBpZiAoaW5zZXJ0VmFsICE9PSBudWxsICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKHRoaXMuX2NlbGxzQXR0cikpXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihpbnNlcnRWYWwpID8gbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcdTAwMDEnKS5Ub1N0cmluZygpIDogbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcMCcpLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgIC8vIGNyZWF0ZSBza2lwcGVkIHJlY29yZHNcclxuICAgICAgICAgIC8vIHdoZW4gYSB2ZWN0b3IgY2VsbCBpcyBzZXQgLCBpZiB0aGUgY2VsbCBpcyBiZXlvbmQgdGhlIGV4aXN0aW5nIHZlY3Rvci5cclxuICAgICAgICAgIC8vIHdlIHdpbGwgZmlsbCB0aGUgY2VsbHMgYmV0d2VlbiB2ZWN0b3Igc2l6ZSBhbmQgc2V0IGNlbGwgd2l0aCBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICAgICAgLy8gZm9yIGV4YW1wbGUgOiBpZiB2ZWN0b3Igc2l6ZSBpcyAwLCBhbmQgd2UgZG8gdmVjc2V0ICh2ZWNbNV0pLiBjZWxsIDUgbmVlZHMgdG8gYmUgc2V0XHJcbiAgICAgICAgICAvLyB3aXRoIHRoZSB2YWx1ZS4gY2VsbHMgMSB0byA0IHdpbGwgYmUgY3JlYXRlZCBhbmQgc2V0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXHJcbiAgICAgICAgICBsZXQgZGF0YUJ1ZlZhbDogc3RyaW5nID0gaW5zZXJ0VmFsO1xyXG5cclxuICAgICAgICAgIHdoaWxlICh0aGlzLl9jZWxscy5sZW5ndGggPCBpZHgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGluc2VydFZhbC5zdWJzdHIoVmVjdG9yVHlwZS5FTVBUWV9CTE9CX1BSRUZJWF9MRU4pLCB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQsIGluc2VydFZhbC5zdWJzdHIoMCwgVmVjdG9yVHlwZS5FTVBUWV9CTE9CX1BSRUZJWF9MRU4pKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQodGhpcy5nZXROdWxsU3RyaW5nKFZlY3RvclR5cGUuQkxPQl9UWVBFX1NUUlVDVF9TSVpFKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoaW5zZXJ0VmFsLCB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkYXRhIGJ1ZlxyXG4gICAgICAgICAgICAgIGlmIChpbnNlcnRWYWwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBkYXRhIGJ1ZiBhcyBudW0gdHlwZSBzbyB3ZVxyXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNsYXRlIHRoZW0gYmVmb3JlIGluc2VydGluZyB0aGVtIHRvIHRoZSBidWZcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB2YWx1ZSBmb3IgbnVtIHR5cGUgb25seSBvbmNlLCBhbmQgdXNlIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYWxsIHRoZSBjZWxscyB0byBiZSBpbml0aWFsaXplZC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgdHJhbnNsYXRpb24gb25seSBvbmNlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFCdWZWYWwgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcoaW5zZXJ0VmFsKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRhdGFCdWZWYWwgZWl0aGVyIGNvbnRhaW5zIG9yaWdpbmFsIGluc2VydFZhbCwgb3IgYSBzdHJpbmcgb2ZcclxuICAgICAgICAgICAgICAgIC8vIGJ5dGVTdHJlYW0gZm9yIG51bSB0eXBlcy5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGRhdGFCdWZWYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGFsd2F5IGtlZXAgdGhlIHdob2xlIGFscGhhXHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsTGVuOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSlcclxuICAgICAgICAgICAgICAgICAgdmFsTGVuID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGF0YUJ1ZlZhbCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHZhbExlbiA9IGRhdGFCdWZWYWwubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHZhbExlbjsgPG51bWJlcj5pIDwgbG9jYWxDZWxsU2l6ZTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZCgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/ICcgJyA6ICdcXDAnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQodGhpcy5nZXROdWxsU3RyaW5nKGxvY2FsQ2VsbFNpemUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLkluc2VydCh0aGlzLl9jZWxscy5sZW5ndGggLSAxLFxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA/ICdcXHUwMDAxJyA6ICdcXDAnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gdmVjdG9yIGhhcyBiZWVuIGZpbGxlZCB0aWxsIHRoZSByZXF1ZXN0ZWQgaWR4LlxyXG4gICAgICAgICAgLy8gbm93IGl0cyB0aW1lIHRvIHNldCB0aGUgcmVxdWVzdGVkIGNlbGwuXHJcbiAgICAgICAgICByZXMgPSB0aGlzLnNldFZlY0NlbGwoaWR4LCBuZXdWYWx1ZSwgaXNOdWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICByZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlIHRoZSB2ZWN0b3IgdG8gZml0IHRoZSBkZWZpbml0aW9ucyBvZiBhIGRpZmZlcmVudCB2ZWN0b3IgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkXCI+dGhlIG5ldyBmaWVsZDwvcGFyYW0+XHJcbiAgYWRqdXN0VG9GaXQoZmllbGQ6IEZpZWxkRGVmKTogdm9pZCB7XHJcbiAgICBpZiAoZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCBzcmNBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRDZWxsc0F0dHIoKTtcclxuICAgICAgbGV0IGRzdEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUaGVTYW1lVHlwZShzcmNBdHRyLCBkc3RBdHRyKSkge1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG5cclxuICAgICAgICAvLyB0cmltIGRhdGEgaWYgbmVlZGVkICggb25seSBmb3IgYWxwaGEgb3IgbWVtbylcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHNyY0F0dHIpICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShkc3RBdHRyKSkge1xyXG4gICAgICAgICAgICBsZXQgZHN0U2l6ZUluQ2hhcnM6IG51bWJlciA9IGZpZWxkLmdldFZlY0NlbGxzU2l6ZSgpO1xyXG4gICAgICAgICAgICBsZXQgc3JjU2l6ZUluQ2hhcnM6IG51bWJlciA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gTWF0aC5mbG9vcih0aGlzLl9jZWxsU2l6ZSAvIDIpIDogdGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgbGV0IGlzQnl0ZU1vZGU6IGJvb2xlYW4gPSBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVBbHBoYShkc3RBdHRyKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3JjU2l6ZUluQ2hhcnMgIT09IGRzdFNpemVJbkNoYXJzKSB7XHJcbiAgICAgICAgICAgIGxldCBhZGpEYXRhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdvZXMgb3ZlciBhbGwgY2VsbHMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZHN0U2l6ZUluQ2hhcnM7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyOiBDZWxsRWxlbWVudCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgICAgIC8vIHRyaW0gaXMgbmVlZGVkXHJcbiAgICAgICAgICAgICAgaWYgKCFjdXJyLmlzTnVsbCkgeyAvLyB1bmljb2RlIGNlbGwgc2l6ZSBhcmUgc2F2ZWQgaW50ZXJuYWxseSBhcyBieXRlIGxlbmd0aCB3aGlsZSB0aGUgZmllbGQgcmV0dXJucyBjaGFyXHJcbiAgICAgICAgICAgICAgICAvLyBsZW5ndGhcclxuICAgICAgICAgICAgICAgIGlmIChzcmNTaXplSW5DaGFycyA+IGRzdFNpemVJbkNoYXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc0J5dGVNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihjdXJyLmRhdGEsIGRzdFNpemVJbkNoYXJzKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IGN1cnIuZGF0YS5zdWJzdHIoMCwgZHN0U2l6ZUluQ2hhcnMpO1xyXG4gICAgICAgICAgICAgICAgICBhZGpEYXRhLkFwcGVuZChjdXJyLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZyBpcyBuZWVkZWRcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdG1wRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRtcERhdGEuQXBwZW5kKGN1cnIuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhTGVuOiBudW1iZXIgPSBpc0J5dGVNb2RlID8gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoY3Vyci5kYXRhKSA6IGN1cnIuZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBwYWQgd2l0aCBibGFua3NcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gZGF0YUxlbjsgaiA8IGRzdFNpemVJbkNoYXJzOyBqID0gaiArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS5BcHBlbmQoJyAnKTtcclxuICAgICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQodG1wRGF0YS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgdmVjdG9yIGNlbGxcclxuICAgICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gdG1wRGF0YS5Ub1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCB0bXBEYXRhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBkc3RTaXplSW5DaGFyczsgaiA9IGogKyAxKVxyXG4gICAgICAgICAgICAgICAgICB0bXBEYXRhLkFwcGVuZCgnXFwwJyk7XHJcbiAgICAgICAgICAgICAgICBhZGpEYXRhLkFwcGVuZCh0bXBEYXRhLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgdmVjdG9yIGNlbGxcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRtcERhdGEuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0vLyBlbmQgbG9vcFxyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQnVmID0gYWRqRGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFFDUiA3NDc4MDEgaW4gdGhlIGZpbGVkIHRoZSBzaXplIG9mIG51bWVyaWMvZGF0ZS90aW1lIGlzIHRoaWVyIGhleCBzaXplXHJcbiAgICAgICAgLy8gd2hlcmVhcyBoZXJlIGl0IGlzIHRoZWlyIE5VTV9UWVBFIHNpemVcclxuICAgICAgICBsZXQgbmV3U2l6ZTogbnVtYmVyID0gZmllbGQuZ2V0VmVjQ2VsbHNTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgaGVhZGVycyBkYXRhIHN1Y2ggYXMgY2VsbCB0eXBlIGFuZCBjZWxscyBzaXplXHJcbiAgICAgICAgdGhpcy5fY2VsbHNBdHRyID0gZmllbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcbiAgICAgICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPigodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKG5ld1NpemUgKiAyKSA6IG5ld1NpemUpO1xyXG4gICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGZpZWxkLmdldENlbGxEZWZ1YWx0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBmaWVsZC5pc051bGxEZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5fYWxsb3dOdWxsID0gZmllbGQuTnVsbEFsbG93ZWQ7XHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFZlY3RvclR5cGUuYWRqdXN0VG9GaXQgdmVjdG9yIGJhc2ljIHR5cGVzIGRvZXMgbm90IGFncmVlXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiAgVmVjdG9yVHlwZS5hZGp1c3RUb0ZpdCBcIiArIGZpZWxkLmdldE5hbWUoKSArIFwiIGlzIG5vdCBvZiB0eXBlIHZlY3RvclwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIHZlYyBzaXplIGluIHRoZSBoZWFkZXJzIGJ1ZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgbmV3IHNpemU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBzdHJpbmcgPSBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSICsgVmVjdG9yVHlwZS5WRUNUT1JfU1RSICsgXCIsXCIgKyBWZWN0b3JUeXBlLlZFUlNJT04gKyBcIixcIiArIDEgKyBcIixcIiArIDxzdHJpbmc+dGhpcy5fY2VsbHNBdHRyICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyB0aGlzLl9jZWxsU2l6ZSArIFwiLFwiO1xyXG5cclxuICAgIC8vIGFwcGVuZCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgbGV0IGRlZjogc3RyaW5nID0gXCJcIjtcclxuICAgIGlmICh0aGlzLl9jZWxsc0RlZmF1bHRWYWwgIT09IG51bGwpXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICBkZWYgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcodGhpcy5fY2VsbHNEZWZhdWx0VmFsKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGRlZiA9IHRoaXMuX2NlbGxzRGVmYXVsdFZhbDtcclxuXHJcbiAgICAvLyBpbiBzdHJpbmcgd2UgZG8gbm90IGtlZXAgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnJ3b3NlciBjbGllbnRcclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pKVxyXG4gICAgICBkZWYgPSBkZWYgKyB0aGlzLmdldEVtcHR5U3RyaW5nKHRoaXMuX2NlbGxTaXplIC0gPG51bWJlcj5VdGlsU3RyQnl0ZU1vZGUubGVuQihkZWYpKTtcclxuICAgIGVsc2VcclxuICAgICAgZGVmID0gZGVmICsgdGhpcy5nZXRFbXB0eVN0cmluZyh0aGlzLl9jZWxsU2l6ZSAtIDxudW1iZXI+ZGVmLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gY29udGludWUgYnVpbGRpbmcgdGhlIGhlYWRlcnNcclxuICAgIHJlcyA9IHJlcyArIGRlZiArIFwiLFwiICsgKHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyAodGhpcy5fYWxsb3dOdWxsID8gXCIxXCIgOiBcIjBcIikgKyBcIixcIiArIHRoaXMuX2NlbGxTaXplICsgXCIsXCIgKyB0aGlzLl9jZWxscy5sZW5ndGggKyBcIixcIjtcclxuICAgIHJlcyA9IHJlcyArICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCI7XHJcblxyXG4gICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgcmVzID0gcmVzICsgXCIwLFwiO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLyByZXR1cm5zIGEgc3RyaW5nIHdpdGggc2l6ZSBudWxsIGNoYXJlY3RlcnNcclxuICBwcml2YXRlIGdldE51bGxTdHJpbmcoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSlcclxuICAgICAgcmVzLkFwcGVuZCgnXFwwJyk7XHJcbiAgICByZXR1cm4gcmVzLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLyByZXR1cm5zIGEgc3RyaW5nIHdpdGggc2l6ZSBibGFuayBjaGFyZWN0ZXJzXHJcbiAgcHJpdmF0ZSBnZXRFbXB0eVN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2l6ZTsgaSA9IGkgKyAxKVxyXG4gICAgICByZXMuQXBwZW5kKCcgJyk7XHJcbiAgICByZXR1cm4gcmVzLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ29lcyBvdmVyIHRoZSBjZWxscyBvZiB0aGUgdmVjdG9ycyBhbmQgYnVpbGRzIHRoZSBkYXRhIGJ1ZiBvZiBibG9icyBzaW5jZSBpdCBpcyB0aGUgb25seSB0aGluZyBub3RcclxuICAvLy8gICB1cGRhdGVkIGR5bmFtaWNhbGx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEJsb2JzQnVmKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9jZWxscy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgbGV0IGJsb2JTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY3VycjogQ2VsbEVsZW1lbnQgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyLmRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICBkYXRhID0gY3Vyci5kYXRhO1xyXG4gICAgICAgIGJsb2JTaXplID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcy5BcHBlbmQoYmxvYlNpemUpO1xyXG4gICAgICByZXMuQXBwZW5kKFwiLFwiICsgY3Vyci5ibG9iRmllbGRQcmVmaXggKyBcIixcIiArIGRhdGEgKyBcIjtcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHJlcyArIFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAvKiBzdGF0aWMgdXRpbGl0eSBtZXRob2RzICovXHJcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlcyB0aGUgY2VsbCBhdHRyaWJ1dGUgb2YgdGhlIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iXCI+YSB2ZWN0b3IgaW4gYSBmbGF0dGVuZWQgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGF0dCB0aGUgdGhlIHZlY3RvcidzIGNlbGxzIGF0dHJpYnV0ZTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0Q2VsbHNBdHRyKGJsb2I6IHN0cmluZyk6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgaWYgKFZlY3RvclR5cGUudmFsaWRhdGVCbG9iQ29udGVudHMoYmxvYikpIHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYikpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IHRva2VuIGlzIHRoZSBjZWxscyBhdHRyaWJ1dGVcclxuICAgICAgcmV0dXJuIDxTdG9yYWdlQXR0cmlidXRlPnRva2Vuc1szXS5jaGFyQXQoMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIHN0YXRpYyBnZXRDZWxsc0F0dHIgdGhlIGJsb2IgaXMgaW4gdGhlIHdyb25nIGZvcm1hdFwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZXMgdGhlIHNpemUgb2YgZWFjaCBjZWxsIGluIHRoZSB2ZWN0b3IgYWxsIGNlbGwgaGFzIHRoZSBzYW1lIHNpemUgZXhjZXB0IHdoZW4gdGhlIHZlY3RvciBjZWxscyBhcmVcclxuICAvLy8gICBvZiB0eXBlIGJsb2Igb3IgdmVjdG9yXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JcIj5hIHZlY3RvciBpbiBhIGZsYXR0ZW5lZCBmb3JtYXQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGNlbGxzIHNpemUgb3IgLTEgaWYgdGhlcmUgaXMgZW5jb2RpbmcgcHJvYmxlbTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0Q2VsbFNpemUoYmxvYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBjZWxsc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBWZWN0b3JUeXBlLmdldENlbGxzQXR0cihibG9iKTtcclxuICAgIGlmIChjZWxsc1R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiBjZWxsc1R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYikpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHR5cGVcclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIGNlbGxzIHNpemVcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodG9rZW5zWzRdKTtcclxuICAgIH1cclxuICAgIGVsc2UgeyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5cclxuICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2VzIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlwiPmEgdmVjdG9yIGluIGEgZmxhdHRlbmVkIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRWZWNTaXplKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKFZlY3RvclR5cGUudmFsaWRhdGVCbG9iQ29udGVudHMoYmxvYikpIHtcclxuICAgICAgbGV0IHBvczogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChibG9iKTtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKHBvcyksIFwiLFwiKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIE1HQlRNR1ZFQ1xyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzBdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgdmVyc2lvblxyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzFdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgQ29sdW1uc0NvdW50X1xyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzJdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbHMgdHlwZVxyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzNdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbHMgc2l6ZVxyXG4gICAgICBsZXQgY2VsbHNTaXplOiBzdHJpbmcgPSB0b2tlbnNbNF07XHJcbiAgICAgIHBvcyA9IHBvcyArIChjZWxsc1NpemUubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBjZWxsIGRlZmF1bHQgdmFsdWUgYW5kIHJlLWluaXQgdGhlIHRva2VuaXplclxyXG4gICAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBtYXkgY29udGFpbiB0aGUgZGVsaW1ldGVyIGNoYXJlY3RlciBhcyBkYXRhXHJcbiAgICAgIHBvcyA9IHBvcyArIChOTnVtYmVyLlBhcnNlKGNlbGxzU2l6ZSkgKyAxKTtcclxuICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihwb3MpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIGlzIGNlbGwgbnVsbCBkZWZhdWx0XHJcblxyXG4gICAgICAvLyBza2lwIGlzIG51bGwgYWxsb3dlZFxyXG5cclxuICAgICAgLy8gc2tpcCBjb2x1bW5zIHRvdGFsIGxlbmd0aFxyXG5cclxuICAgICAgLy8gdGhlIG5leHQgZWxlbWVudCBpcyB0aGUgdmVjdG9yIHNpemVcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodG9rZW5zWzNdKTtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIHN0YXRpYyBnZXRWZWNTaXplIHRoZSBibG9iIGlzIGluIHRoZSB3cm9uZyBmb3JtYXRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgZmxhdERhdGEgY29udGVudCB3YXMgdHJhbnNsYXRlZCB0byB1bmljb2RlIG9yIG5vdC4gZmxhdERhdGEgY29udGFpbnMgdGhlIHZlY3RvcidzIGNlbGxzIGluIGZsYXRcclxuICAvLy8gICAobm9uLWFycmF5KSBmb3JtYXQuIFRoaXMgaXMgaG93IHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGRhdGEuIEhvd2V2ZXIgdGhlIHNlcnZlciBkb2VzIG5vdCBzZW5kIGl0IHRvIHVzXHJcbiAgLy8vICAgaW4gYSBVTklDT0RFIGZvcm1hdC4gVGh1cyB3ZSB0cmFuc2xhdGUgaXQgdG8gdW5pY29kZSBkdXJpbmcgdGhlIGZpcnN0IHRpbWUgd2UgXCJkZS1zZXJpYWxpemVcIiB0aGVcclxuICAvLy8gICBmbGF0LWRhdGEgaW50byBhIHZlY3Rvci4gRHVyaW5nIHRoZSBkZS1zZXJpYWxpemF0aW9uIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHRpbWUgd2UgXCJkZS1zZXJpYWxpemVcIlxyXG4gIC8vLyAgIHRoZSBmbGF0LWRhdGEgaW50byBhIHZlY3Rvci4gRHVyaW5nIHRoZSBkZS1zZXJpYWxpemF0aW9uIG9wZXJhdGlvbiB3ZSBtb2RpZnkgdGhlIEJMT0ItVEFCTGUgZXllIGNhdGNoZXJcclxuICAvLy8gICBmcm9tIHVwcGVyIGNhc2UgdG8gbG93ZXIgY2FzZSwgdGhpcyB3YXkgd2Uga25vdyBpZiBhIHRyYW5zbGF0aW9uIHdhcyBkb25lIG9yIGlzIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmFtZVwiPmZsYXREYXRhIFRoZSB2ZWN0b3IncyBmbGF0IGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gVFJVRSBpZiB0aGUgZmxhdCBkYXRhIGlzIGFscmVhZHkgaW4gdW5pY29kZSBmb3JtYXQ8L3JldHVybnM+XHJcbiAgaXNVbmljb2RlKGZsYXREYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBzdGFydDogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChmbGF0RGF0YSk7XHJcbiAgICBsZXQgY2F0Y2hlcjogc3RyaW5nID0gZmxhdERhdGEuc3Vic3RyKHN0YXJ0LCBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSX0xFTik7XHJcbiAgICByZXR1cm4gKGNhdGNoZXIgPT09IFZlY3RvclR5cGUuQkxPQl9UQUJMRV9TVFIpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGlubmVyIGNsYXNzIHJlcHJlc2VudHMgYSBjZWxsIGluIHRoZSBtYWdpYyB2ZWN0b3IgZWFjaCBkYXRhIHRoYXQgdGhlIG1hZ2ljIHZlY3RvciBrZWVwcyBwZXIgY2VsbFxyXG4vLy8gICB3aWxsIGJlIGtlcHQgaW4gdGhlIENlbGxFbGVtZW50XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBDZWxsRWxlbWVudCB7XHJcbiAgYmxvYkZpZWxkUHJlZml4OiBzdHJpbmcgPSBudWxsO1xyXG4gIGRhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIGFsbCB0aGlzIHZhcmlhYmxlcyBhcmUgdXNlZCBvbmx5IGlmIHRoZSB2ZWN0b3IgY2VsbCBpcyBvZiB0eXBlIHZlY3RvciBvciBibG9iXHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbDogc3RyaW5nLCBpc19udWxsOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3Rvcih2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbiwgY3RybERhdGE6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKHZhbCwgaXNfbnVsbCk7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEodmFsLCBpc19udWxsLCBjdHJsRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyBjb25zdHJ1Y3RzIGEgbmV3IGNlbGwgZWxlbWVudCBmb3IgdmVjdG9ycyB3aG9zIGNlbGxzIGFyZSBub3Qgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCh2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgdGhpcy5pc051bGwgPSBpc19udWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc3RydWN0cyBhIG5ldyBjZWxsIGVsZW1lbnQgZm9yIHZlY3RvcnMgd2hvcyBjZWxscyBhcmUgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbiwgY3RybERhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgdGhpcy5pc051bGwgPSBpc19udWxsO1xyXG4gICAgdGhpcy5ibG9iRmllbGRQcmVmaXggPSBjdHJsRGF0YTtcclxuICB9XHJcbn1cclxuIl19