@magic-xpa/gui 4.1100.0-dev4110.25 → 4.1100.0-dev4110.252
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.
- package/{esm2020 → esm2022}/index.mjs +71 -71
- package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
- package/esm2022/src/Commands.mjs +184 -0
- package/esm2022/src/Events.mjs +425 -0
- package/esm2022/src/EventsProcessor.mjs +67 -0
- package/esm2022/src/FocusManager.mjs +34 -0
- package/esm2022/src/GuiConstants.mjs +68 -0
- package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
- package/esm2022/src/GuiEnvironment.mjs +4 -0
- package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
- package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
- package/esm2022/src/UIBridge.mjs +33 -0
- package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
- package/esm2022/src/gui/GuiMgControl.mjs +123 -0
- package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
- package/esm2022/src/gui/KeyboardItem.mjs +135 -0
- package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
- package/esm2022/src/gui/MgValue.mjs +16 -0
- package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
- package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
- package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
- package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
- package/esm2022/src/gui/low/Style.mjs +20 -0
- package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
- package/esm2022/src/management/data/BlobType.mjs +281 -0
- package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
- package/esm2022/src/management/data/FieldDef.mjs +331 -0
- package/esm2022/src/management/data/FieldsTable.mjs +54 -0
- package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
- package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
- package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
- package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
- package/esm2022/src/management/data/RecordUtils.mjs +361 -0
- package/esm2022/src/management/data/VectorType.mjs +612 -0
- package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
- package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
- package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
- package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
- package/esm2022/src/management/gui/ControlTable.mjs +118 -0
- package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
- package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
- package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
- package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
- package/esm2022/src/management/gui/Helps.mjs +237 -0
- package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
- package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
- package/esm2022/src/management/gui/PIC.mjs +1185 -0
- package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
- package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
- package/esm2022/src/management/gui/PropTable.mjs +221 -0
- package/esm2022/src/management/gui/Property.mjs +1362 -0
- package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
- package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
- package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
- package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
- package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
- package/esm2022/src/util/MemoryUtil.mjs +35 -0
- package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
- package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
- package/fesm2022/magic-xpa-gui.mjs.map +1 -0
- package/index.d.ts +70 -70
- package/package.json +6 -12
- package/src/Commands.d.ts +40 -39
- package/src/Events.d.ts +157 -155
- package/src/EventsProcessor.d.ts +13 -13
- package/src/FocusManager.d.ts +8 -8
- package/src/GuiConstants.d.ts +65 -65
- package/src/GuiEnums.d.ts +282 -282
- package/src/GuiEnvironment.d.ts +4 -4
- package/src/IFlowMonitorQueue.d.ts +3 -3
- package/src/Manager.d.ts +26 -26
- package/src/UIBridge.d.ts +16 -16
- package/src/env/IEnvironment.d.ts +31 -31
- package/src/gui/ControlBase.d.ts +4 -4
- package/src/gui/GuiMgControl.d.ts +38 -38
- package/src/gui/GuiMgForm.d.ts +3 -3
- package/src/gui/KeyboardItem.d.ts +18 -18
- package/src/gui/LastFocusedVal.d.ts +7 -7
- package/src/gui/MgValue.d.ts +15 -15
- package/src/gui/PropParentInterface.d.ts +13 -13
- package/src/gui/low/DialogHandler.d.ts +4 -4
- package/src/gui/low/GuiCommand.d.ts +37 -37
- package/src/gui/low/GuiCommandQueue.d.ts +13 -13
- package/src/gui/low/GuiInteractive.d.ts +55 -53
- package/src/gui/low/Style.d.ts +19 -19
- package/src/management/RuntimeContextBase.d.ts +23 -23
- package/src/management/data/BlobType.d.ts +29 -29
- package/src/management/data/DcValues.d.ts +33 -33
- package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
- package/src/management/data/FieldDef.d.ts +53 -53
- package/src/management/data/FieldsTable.d.ts +16 -16
- package/src/management/data/GuiDataViewBase.d.ts +27 -27
- package/src/management/data/GuiFieldBase.d.ts +17 -17
- package/src/management/data/IRecord.d.ts +12 -12
- package/src/management/data/IReferencedObject.d.ts +5 -5
- package/src/management/data/NUM_TYPE.d.ts +103 -103
- package/src/management/data/ObjectReferenceBase.d.ts +16 -16
- package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
- package/src/management/data/RecordUtils.d.ts +21 -21
- package/src/management/data/VectorType.d.ts +52 -52
- package/src/management/data/VectorTypeBase.d.ts +8 -8
- package/src/management/events/IActionManager.d.ts +7 -7
- package/src/management/events/IGuiEventsManager.d.ts +20 -20
- package/src/management/exp/ExpressionInterface.d.ts +242 -242
- package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
- package/src/management/gui/ControlTable.d.ts +28 -28
- package/src/management/gui/DisplayConvertor.d.ts +103 -103
- package/src/management/gui/FieldValidator.d.ts +35 -35
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
- package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
- package/src/management/gui/HebrewDate.d.ts +46 -46
- package/src/management/gui/Helps.d.ts +51 -51
- package/src/management/gui/MgControlBase.d.ts +223 -223
- package/src/management/gui/MgFormBase.d.ts +160 -160
- package/src/management/gui/PIC.d.ts +108 -108
- package/src/management/gui/PropDefaults.d.ts +7 -7
- package/src/management/gui/PropInterface.d.ts +244 -243
- package/src/management/gui/PropTable.d.ts +33 -33
- package/src/management/gui/Property.d.ts +121 -121
- package/src/management/gui/ValidationDetails.d.ts +52 -52
- package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
- package/src/management/gui/WrongFormatException.d.ts +9 -9
- package/src/management/tasks/GuiDataCollection.d.ts +4 -4
- package/src/management/tasks/GuiTaskBase.d.ts +150 -150
- package/src/management/tasks/IMGDataTable.d.ts +10 -10
- package/src/management/tasks/ITask.d.ts +6 -6
- package/src/management/tasks/MgTimer.d.ts +8 -8
- package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
- package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
- package/src/util/MemoryUtil.d.ts +6 -6
- package/src/util/ObjectReference.d.ts +9 -9
- package/src/util/UsernamePasswordCredentials.d.ts +18 -18
- package/esm2020/src/Commands.mjs +0 -177
- package/esm2020/src/Events.mjs +0 -420
- package/esm2020/src/EventsProcessor.mjs +0 -67
- package/esm2020/src/FocusManager.mjs +0 -34
- package/esm2020/src/GuiConstants.mjs +0 -68
- package/esm2020/src/GuiEnvironment.mjs +0 -4
- package/esm2020/src/UIBridge.mjs +0 -32
- package/esm2020/src/gui/GuiMgControl.mjs +0 -125
- package/esm2020/src/gui/KeyboardItem.mjs +0 -135
- package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2020/src/gui/MgValue.mjs +0 -16
- package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
- package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
- package/esm2020/src/gui/low/Style.mjs +0 -20
- package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
- package/esm2020/src/management/data/BlobType.mjs +0 -281
- package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2020/src/management/data/FieldDef.mjs +0 -331
- package/esm2020/src/management/data/FieldsTable.mjs +0 -54
- package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
- package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
- package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
- package/esm2020/src/management/data/RecordUtils.mjs +0 -361
- package/esm2020/src/management/data/VectorType.mjs +0 -612
- package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2020/src/management/gui/ControlTable.mjs +0 -118
- package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
- package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
- package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2020/src/management/gui/Helps.mjs +0 -237
- package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
- package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
- package/esm2020/src/management/gui/PIC.mjs +0 -1185
- package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2020/src/management/gui/PropTable.mjs +0 -221
- package/esm2020/src/management/gui/Property.mjs +0 -1356
- package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
- package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2020/src/util/MemoryUtil.mjs +0 -35
- package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
- package/fesm2015/magic-xpa-gui.mjs +0 -16364
- package/fesm2015/magic-xpa-gui.mjs.map +0 -1
- package/fesm2020/magic-xpa-gui.mjs.map +0 -1
|
@@ -0,0 +1,612 @@
|
|
|
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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QUFNLEdBQVksS0FBSyxDQUFDO0lBTXhCLFlBQVksR0FBVyxFQUFFLE9BQWdCLEVBQUUsUUFBaUI7UUFDMUQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFHTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWdCO1FBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFHTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWdCLEVBQUUsUUFBZ0I7UUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBFbmNvZGluZyxcclxuICBJU09fODg1OV8xX0VuY29kaW5nLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIFN0cmluZ0J1aWxkZXJcclxufSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IEZpZWxkRGVmIH0gZnJvbSAnLi9GaWVsZERlZic7XHJcbmltcG9ydCB7IEJsb2JUeXBlIH0gZnJvbSAnLi9CbG9iVHlwZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VBdHRyaWJ1dGUsIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjaywgU3RyVXRpbCwgVXRpbFN0ckJ5dGVNb2RlIH0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IERpc3BsYXlDb252ZXJ0b3IgfSBmcm9tICcuLi9ndWkvRGlzcGxheUNvbnZlcnRvcic7XHJcbmltcG9ydCB7IFJlY29yZFV0aWxzIH0gZnJvbSAnLi9SZWNvcmRVdGlscyc7XHJcbmltcG9ydCB7IEd1aUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBWZWN0b3JUeXBlQmFzZSB9IGZyb20gJy4vVmVjdG9yVHlwZUJhc2UnO1xyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgcmVwcmVzZW50cyB0aGUgbWFnaWMgdmVjdG9yIHR5cGVcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFZlY3RvclR5cGUgZXh0ZW5kcyBWZWN0b3JUeXBlQmFzZSB7XHJcblxyXG4gIHN0YXRpYyBWRVJTSU9OOiBudW1iZXIgPSA1OyAvLyB2ZXJzaW9uIG5vIDUgaW5jbHVkZXMgdGhlIGNvbnRlbnQgZmllbGRcclxuICBzdGF0aWMgRU1QVFlfQkxPQl9QUkVGSVhfTEVOOiBudW1iZXIgPSA3O1xyXG5cclxuICAvLyBGT1IgRVhQTEFOQVRJT05TIFJFR0FSRElORyBUSElTIE5VTUJFUiBQTEVBUyBTRUUgRE9DVU1FTlRBVElPTiBJTlNJREUgaW5pdCBNRVRIT0RcclxuICBzdGF0aWMgQkxPQl9UWVBFX1NUUlVDVF9TSVpFOiBudW1iZXIgPSAyODtcclxuXHJcbiAgcHJpdmF0ZSBfY2VsbHM6IExpc3Q8Q2VsbEVsZW1lbnQ+ID0gbnVsbDsgLy8gYSB2ZWN0b3IgY29udGFpbmluZyBDZWxsRWxlbWVudHNcclxuICBwcml2YXRlIF9lbmNvZGluZzogRW5jb2RpbmcgPSBudWxsOyAvLyB0byBiZSB1c2VkIG9ubHkgd2l0aCBhbHBoYSBvciBtZW1vXHJcbiAgcHJpdmF0ZSBfYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2VsbENvbnRlbnRUeXBlOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NlbGxTaXplOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2NlbGxzQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IG51bGw7IC8vIGFsbCBjZWxscyBpbiB0aGUgdmVjdG9yIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZVxyXG4gIHByaXZhdGUgX2NlbGxzRGVmYXVsdFZhbDogc3RyaW5nID0gbnVsbDsgLy8gYWxsIGNlbGxzIGluIHRoZSBtYWdpYyB2ZWN0b3IgaGFzIHRoZSBzYW1lIGRlZmF1bHQgdmFsdWVcclxuICBwcml2YXRlIF9jZWxsc0lzTnVsbERlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gbnVsbCBkZWZhdWx0IGRlZmluaXRpb24gZm9yIGFsbCBjZWxscyBpbiB0aGUgbWFnaWMgdmVjdG9yXHJcblxyXG4gIC8vIGRhdGEgYnVmZmVycyB0aGF0IHdlIGNoYW5nZSBEeW5hbWljYWxseSB0byBmYWNpbGl0YXRlXHJcbiAgLy8gdGhlIGNyZWF0aW9uIG9mIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICBwcml2YXRlIF9kYXRhQnVmOiBTdHJpbmdCdWlsZGVyID0gbnVsbDtcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBtYXJrcyB3aGV0aGVyIHRoZSB2ZWN0b3Igd2FzIGluaXRpYWxpemVkIGlmIGl0IHdhcyBub3QgdGhhdCBpdCBpcyBhbiBpbnZhbGlkIHZlY3RvclxyXG4gIHByaXZhdGUgX251bGxCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgX29yaWdpbmFsZmxhdERhdGE6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNlbGxzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgY29udGVudFR5cGU6IHN0cmluZywgZGVmdWFsdDogc3RyaW5nLCBpc0RlZk51bGw6IGJvb2xlYW4sIG51bGxBbG93ZWQ6IGJvb2xlYW4sIGxlbmd0aDogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3RvcihibG9iU3RyaW5nOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGZsZDogRmllbGREZWYpO1xyXG4gIGNvbnN0cnVjdG9yKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkOiBhbnksIGNvbnRlbnRUeXBlPzogc3RyaW5nLCBkZWZ1YWx0Pzogc3RyaW5nLCBpc0RlZk51bGw/OiBib29sZWFuLCBudWxsQWxvd2VkPzogYm9vbGVhbiwgbGVuZ3RoPzogbnVtYmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDYpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCwgY29udGVudFR5cGUsIGRlZnVhbHQsIGlzRGVmTnVsbCwgbnVsbEFsb3dlZCwgbGVuZ3RoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCA9PT0gbnVsbCB8fCBjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSlcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMihjZWxsc1R5cGVPckJsb2JTdHJpbmdPckZsZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29uc3RydWN0IHRoZSBvYmplY3QgYnV0IGRvZXMgbm90IGZpbGwgaXQgd2l0aCBkYXRhIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhlIFZlY3RvciB3ZSBtdXN0IGludm9rZSBvblxyXG4gIC8vLyAgIGl0IHRoZSBpdHMgaW5pdCBtZXRob2QgYSBWZWN0b3JUeXBlIHdoaWNoIHdhcyBub3QgaW5pdGlhbGl6ZWQgaXMgYW4gdW52YWxpZCB2ZWN0b3IuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBjb250ZW50VHlwZTogc3RyaW5nLCBkZWZ1YWx0OiBzdHJpbmcsIGlzRGVmTnVsbDogYm9vbGVhbiwgbnVsbEFsb3dlZDogYm9vbGVhbiwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NlbGxzID0gbmV3IExpc3Q8Q2VsbEVsZW1lbnQ+KCk7XHJcbiAgICB0aGlzLl9jZWxsc0F0dHIgPSBjZWxsc1R5cGU7XHJcbiAgICB0aGlzLl9jZWxsQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcclxuICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGRlZnVhbHQ7XHJcbiAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBpc0RlZk51bGw7XHJcbiAgICB0aGlzLl9jZWxsU2l6ZSA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKGxlbmd0aCAqIDIpIDogbGVuZ3RoKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FsbG93TnVsbCA9IG51bGxBbG93ZWQ7XHJcbiAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCBidXQgZG9lcyBub3QgZmlsbCBpdCB3aXRoIGRhdGEgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgVmVjdG9yIHdlIG11c3QgaW52b2tlIG9uXHJcbiAgLy8vICAgaXQgdGhlIGl0cyBpbml0IG1ldGhvZCBhIFZlY3RvclR5cGUgd2hpY2ggd2FzIG5vdCBpbml0aWFsaXplZCBpcyBhbiBpbnZhbGlkIHZlY3Rvci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlN0cmluZ1wiPmEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iJ3MgZGF0YSBieXRlczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGJsb2JTdHJpbmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gYmxvYlN0cmluZztcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIGEgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoYXJzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzIoZmxkOiBGaWVsZERlZik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2NlbGxzQXR0ciA9IGZsZC5nZXRDZWxsc1R5cGUoKTtcclxuICAgIHRoaXMuX2NlbGxDb250ZW50VHlwZSA9IGZsZC5nZXRWZWNDZWxsc0NvbnRlbnRUeXBlKCk7XHJcbiAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBmbGQuZ2V0Q2VsbERlZnVhbHRWYWx1ZSgpO1xyXG4gICAgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0ID0gZmxkLmlzTnVsbERlZmF1bHQoKTtcclxuICAgIHRoaXMuX2NlbGxTaXplID0gPG51bWJlcj4oKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IChmbGQuZ2V0VmVjQ2VsbHNTaXplKCkgKiAyKSA6IGZsZC5nZXRWZWNDZWxsc1NpemUoKSk7XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB0aGlzLl9hbGxvd051bGwgPSBmbGQuTnVsbEFsbG93ZWQ7XHJcbiAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuX2VuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgYSBWZWN0b3JUeXBlIGZyb20gaXRzIGZsYXR0ZW5lZCBibG9iIHJlcHJlc2VudGF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JTdHJpbmdcIj5hIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYidzIGRhdGEgYnl0ZXM8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZmFsc2UgaXMgdGhlIGdpdmVuIGJsb2IgaXMgbm90IGEgdmVjdG9yICh0aGUgZmxhdHRlbiBmb3JtYXQgaXMgd3JvbmcpPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gbnVsbDtcclxuICAgIGxldCB0b2tlbklkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBjdXJyZW50VG9rZW46IHN0cmluZyA9IG51bGw7IC8vIHRoZSBjdXJyZW50IHRva2VuIHdlIGFyZSBwYXJpbmdcclxuICAgIGxldCBpc0ZsYXREYXRhVHJhbnNsYXRlZDogYm9vbGVhbiA9IHRoaXMuaXNVbmljb2RlKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgbGV0IGlzRGJjc0FscGhhOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogREJDUyBzdXBwb3J0XHJcblxyXG4gICAgLy8gcG9zIGlzIHBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbGZsYXREYXRhIHN0cmluZ1xyXG4gICAgbGV0IHBvczogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIC8vIGJsb2JcclxuICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgbGV0IHZlY1NpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICBpZiAoVmVjdG9yVHlwZS52YWxpZGF0ZUJsb2JDb250ZW50cyh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKSkge1xyXG4gICAgICAgIGxldCBibG9iUHJlZml4OiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRQcmVmaXgodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICAgICAgdGhpcy5fY2VsbENvbnRlbnRUeXBlID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoYmxvYlByZWZpeCk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHRoZSBoZWFkZXJzIG9mIHRoZSB0YWJsZSBhbmQgdGhlIHZlY3RvciBhbmQgdGhlIGZpcnN0ICcsJztcclxuICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIDQgKyA1ICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgQ29sdW1uc0NvdW50XyBpbiB2ZWN0b3JzIGFsd2F5cyBjb250YWluIHZhbHVlIG9mIDFcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGwgYXR0cmlidXRlIGluIHZlY3RvciB0aGVyZSBpcyBvbmx5IG9uZSBhdHRyaWJ1dGUgZm8gdGhlIGVudGlyZSB2ZWN0b3JcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdGhpcy5fY2VsbHNBdHRyID0gPFN0b3JhZ2VBdHRyaWJ1dGU+Y3VycmVudFRva2VuLmNoYXJBdCgwKTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAyO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgQ29sdW1uc0xlbl8gdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoZSB2ZWN0b3JcclxuICAgICAgICAvLyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4gd2UgaW5jcmVhc2UgcG9zIGJ5IGN1cnJlbnRUb2tlbi5sZW5ndGgoKVxyXG4gICAgICAgIC8vIHRoaXMgbnVtYmVyIGlzIHNhbWUgYXMgdGhlIENvbHVtbnNUb3RhbExlbl8gZm9yIHZlY3RvcnNcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPk5OdW1iZXIuUGFyc2UoY3VycmVudFRva2VuKTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbCBkZWZhdWx0IHZhbHVlIGlzIGl0IGlzIG51bWVyaWMgaXQgaXMgc2VudCBhcyBOVU1fVFlQRVxyXG4gICAgICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG1heSBjb250YWluIGFzIHZhbHVlIGNoYXJjdGVycyBhcyB0aGUgZGVsaW1ldGVyXHJcbiAgICAgICAgLy8gd2UgY2FuIG5vdCB1c2UgdGhlIFN0cmluZ1Rva2VuaXplci5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKSwgMik7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgNDI5NDQ1IHNpbmNlIHRoZSB2ZWN0b3IgaXMgZW5jb2RlZCB0byBiYXNlNjQvaGV4IHdoZW4gaXQgaXMgcmVjaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgIC8vIHdlIG11c3QgdXNlIHRoZSBjb3JyZWN0IGNoYXItc2V0IHdoZW4gcmVjaXZpbmcgdmVjdG9yIG9mIGFscGhhIG9yIG1lbW8gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAvLyBpbiB2ZWN0b3JzIHdlIG11c3QgY29uY2lkZXIgdGhlIGNoYXIgc2V0IHNpbmNlIHdoZW4gd2UgZ290IGl0IGZyb20gdGhlIHNlcnZlciBpdCB3YXMgZW5jb2RlZFxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgaXNEYmNzQWxwaGEgPSB0cnVlO1xyXG4gICAgICAgICAgICBpc0ZsYXREYXRhVHJhbnNsYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9lbmNvZGluZyAhPT0gbnVsbCAmJiAhaXNGbGF0RGF0YVRyYW5zbGF0ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBsZXQgYmE6IFVpbnQ4QXJyYXkgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXModGhpcy5fY2VsbHNEZWZhdWx0VmFsKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyh0aGlzLl9jZWxsc0RlZmF1bHRWYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBFbmNvZGluZy5Vbmljb2RlLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICBpZiAoaXNEYmNzQWxwaGEpXHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyB0aGlzLl9jZWxsc0RlZmF1bHRWYWwubGVuZ3RoICsgMTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHRoaXMuX2NlbGxTaXplICsgMSk7IC8vIHNpa3AgdGhlIGVuZGluZyAnLCdcclxuXHJcbiAgICAgICAgLy8gaW5yb3JkZXIgdG8gY29udGludWUgdXNpbmcgdGhlIHRva2VuaXplciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcnMgcGFyc2luZ1xyXG4gICAgICAgIC8vIHJlaW5pdCBpdFxyXG4gICAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgICAgIHRva2VuSWR4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGxzIG51bGwgZGVmYXVsdCBmbGFnXHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBjZWxscyBudWxsIGFsbG93ZWQgZmxhZ1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9hbGxvd051bGwgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNraXAgdGhlIHBhcnNpbmcgb2YgQ29sdW1uc1RvdGFsTGVuX1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yICggUmVjb3Jkc0NvdW50XylcclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgdmVjU2l6ZSA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHRoZSBibG9ic18gd2lsbCBhbHdheXMgY29udGFpbiB2YWx1ZSBvZiAxIHNpbmUgd2UgaGF2ZSBpbiB2ZWN0b3JzIG9ubHkgb25lIGNvbG1uXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIGJsb2JzIG9mZnNldCB0YWJsZSBpbiB0aGUgdmVjdG9yIGNhc2Ugd2lsbCBhbHdheSBjb250YWluIG9ubHkgb25lIHZhbHVlIGVxdWFscyB0byAwXHJcbiAgICAgICAgLy8gc2luY2UgdGhlcmUgaXMgb25seSBvbmUgY29sbXMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBkYXRhIGFycmF5XHJcbiAgICAgICAgbGV0IGRhdGE6IHN0cmluZztcclxuICAgICAgICBpZiAoaXNEYmNzQWxwaGEpIHtcclxuICAgICAgICAgIGRhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgPG51bWJlcj4odmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplKSk7XHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyBkYXRhLmxlbmd0aCArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZGF0YSA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj4odmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplKSk7XHJcbiAgICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHZlY1NpemUgKiB0aGlzLl9jZWxsU2l6ZSArIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWxsb2NhdGUgdGhlIGRhdGFCdWZcclxuICAgICAgICB0aGlzLl9kYXRhQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKVxyXG4gICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgIGxldCBudWxsQnVmOiBzdHJpbmcgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dmVjU2l6ZSk7XHJcbiAgICAgICAgcG9zID0gPG51bWJlcj4oPG51bWJlcj5wb3MgKyB2ZWNTaXplICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHNhdmUgdGhlIG51bGxCdWZcclxuICAgICAgICB0aGlzLl9udWxsQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIobnVsbEJ1Zik7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBjZWxsc1xyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiB0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2ZWNTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IG51bGxCdWYuY2hhckF0KGkpID4gJ1xcMCc7XHJcbiAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZSBhcmUgc2VudCBhcyBOVU1fVFlQRSBzbyB3ZSB0cmFuc2xhdGUgdGhlbSB0byBoZXhcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcChkYXRhLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpLCAyKSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTykge1xyXG4gICAgICAgICAgICAgIC8vIFFDUiA0Mjk0NDUgc2luY2UgdGhlIHZlY3RvciBpcyBlbmNvZGVkIHRvIGJhc2U2NC9oZXggd2hlbiBpdCBpcyByZWNpdmVkIGZyb20gdGhlXHJcbiAgICAgICAgICAgICAgLy8gc2VydmVyIHdlIG11c3QgdXNlIHRoZSBjb3JyZWN0IGNoYXItc2V0IHdoZW4gcmVjaXZpbmcgdmVjdG9yIG9mIGFscGhhIG9yIG1lbW8gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgICAgbGV0IGNlbGxEYXRhOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgaWYgKGlzRGJjc0FscGhhKVxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubWlkQihkYXRhLCA8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGNlbGxEYXRhID0gZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuY29kaW5nICE9PSBudWxsICYmICFpc0ZsYXREYXRhVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbERhdGEgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZyA9IGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhjZWxsRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKGJhLCAwLCBiYS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSksIGlzTnVsbCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGluIGNhc2Ugb2YgdmVjdG9ycyBvcmYgdmVjdG9ycyBvciB2ZWN0b3JzIG9mIGJsb2JzIHdlIG5lZWQgdG8gdHJlYXQgdGhlbSBkaWZmZXJlbnRsbHlcclxuICAgICAgICAgIC8vIGVhY2ggYmxvYiBvciB2ZWN0b3IgaXMgXCJmbGF0dGVuZWQgaW4gdGhlIGVuZCBvZiB0aGUgbnVsbCBidWZmXHJcbiAgICAgICAgICAvLyBhcyBhIHN0cmluZyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcclxuICAgICAgICAgIC8vIEJsb2JfU2l6ZSxPYmpIYW5kbGUsVmFyaWFudElkeCxUeXBlLFZlY0NlbGxBdHRyLC4uLi5kYXRhLi4uLjtuZXh0X2Jsb2I7XHJcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgZXIgYSBibG9iIGNvbWUgdG8gdGhlIGNsaWVudCBub3kgdmlhIHZlY3RvciBpdHMgZm9ybWF0IGlzOlxyXG4gICAgICAgICAgLy8gT2JqSGFuZGxlLFZhcmlhbnRJZHgsVHlwZSxWZWNDZWxsQXR0cjtkYXRhIHRoZXJlIGZvciB3ZSBuZWVkIHRvIG1ha2UgdGhlIGFkanVzdG1lbnRzXHJcbiAgICAgICAgICAvLyBpbiB0aGUgcGFyc2luZyBwcm9jZXNzIGFuZCBpbiB2ZWNHZXQgYW5kIGluIHRvU3RyaW5nXHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmVjU2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG4gICAgICAgICAgICB0b2tlbklkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICAvLyBwYXJzZSBibG9iIHNpemVcclxuICAgICAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGJsb2IgaGVhZGVyXHJcbiAgICAgICAgICAgIGxldCBibG9iSGVhZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UOyBqKyspIHtcclxuICAgICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgICAgICAgYmxvYkhlYWRlciA9IGJsb2JIZWFkZXIgKyBjdXJyZW50VG9rZW47XHJcbiAgICAgICAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGogIT09IEd1aUNvbnN0YW50cy5CTE9CX1BSRUZJWF9FTEVNRU5UU19DT1VOVCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIGJsb2JIZWFkZXIgPSBibG9iSGVhZGVyICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZyA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj5zaXplKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgY2VsbCB0byB0aGUgdmVjXHJcbiAgICAgICAgICAgIGxldCBpc051bGw6IGJvb2xlYW4gPSBudWxsQnVmLmNoYXJBdChpKSA+ICdcXDAnO1xyXG4gICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChjZWxsRGF0YSwgaXNOdWxsLCBibG9iSGVhZGVyKSk7XHJcbiAgICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgc2l6ZSArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBkYXRhQnVmIHdhcyBub3QgYnVpbHQgZHVyaW5nIFwiY2VsbHMgZ3Jvd3RoXCIgLSBhbGxvY2F0ZSBpdCByaWdodCBub3csIGluIG9uZS1zaG90LlxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhQnVmLkxlbmd0aCA9PT0gMClcclxuICAgICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gVmVjdG9yVHlwZS5pbml0IHdyb25nIHZlY3RvciBmb3JtYXRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgZmxhdHRlbiBibG9iIHN0cmluZyByZXByZXNlbnRhdGlvbiB3ZSBhc3N1bWUgaGVyZSB0aGF0IGFsbCBjaGFuZ2VzIGFyZSBkeW5hbWljYWxseSBzYXZlIGludG8gdGhlXHJcbiAgLy8vICAgYnVmZnMgZWFjaCB0aW1lIHRoZSB2ZWN0b3IgY2hhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IHN0cmluZyA9IFwiXCI7IC8vIHRha2VcclxuXHJcbiAgICAvLyBsYXp5IGV2YWx1YXRpb24gaWYgdGhlIHZlY3RvciB3YXMgbm90IGluaXRpYWxpemVkIGl0IHdhc24ndCBjaGFuZ2VkIHNvIHJldHVybiB0aGUgb3JpZ2luYWxcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICAvLyBidWlsZCB0aGUgaGVhZGVyc1xyXG4gICAgICByZXMgPSByZXMgKyAwICsgXCIsXCIgKyAwICsgXCIsXCIgKyBcIjBcIiArIFwiLFwiICsgPHN0cmluZz50aGlzLl9jZWxsc0F0dHIgKyBcIixcIiArIHRoaXMuX2NlbGxDb250ZW50VHlwZSArIFwiO1wiO1xyXG4gICAgICAvLyB0aGUgYmxvYiBoZWFkZXIgb2YgdGhpcyBibG9iXHJcbiAgICAgIHJlcyA9IHJlcyArIHRoaXMuYnVpbGRIZWFkZXJzU3RyaW5nKCk7XHJcbiAgICAgIC8vICsgZGF0YUJ1Zi50b1N0cmluZygpICsgXCIsXCIgKyBudWxsQnVmLnRvU3RyaW5nKCkgKyBcIixcIjtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAgIGxldCBkYXRhQnVmQ2hhckFycnk6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4odGhpcy5fZGF0YUJ1Zi5MZW5ndGggKiAyKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2RhdGFCdWYuTGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIGRhdGFCdWZDaGFyQXJyeVtpICogMl0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCh0aGlzLl9kYXRhQnVmLmdldF9JdGVtKGkpLmNoYXJDb2RlQXQoMCkpICUgMjU2KTtcclxuICAgICAgICAgIGRhdGFCdWZDaGFyQXJyeVtpICogMiArIDFdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgodGhpcy5fZGF0YUJ1Zi5nZXRfSXRlbShpKS5jaGFyQ29kZUF0KDApKSAvIDI1Nik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcyA9IHJlcyArIE5TdHJpbmcuRnJvbUNoYXJzKGRhdGFCdWZDaGFyQXJyeSkgKyBcIixcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmVzID0gcmVzICsgdGhpcy5fZGF0YUJ1ZiArIFwiLFwiO1xyXG5cclxuICAgICAgcmVzID0gcmVzICsgdGhpcy5fbnVsbEJ1ZiArIFwiLFwiO1xyXG5cclxuICAgICAgLy8gaW4gYmxvYnMgYW5kIHZlY3RvciB3ZSBkbyBub3QgdXBkYXRlXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgcmVzID0gcmVzICsgdGhpcy5nZXRCbG9ic0J1ZigpO1xyXG5cclxuICAgICAgcmVzID0gcmVzICsgVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmVzID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNlbGxzIGF0dHJpYnV0ZSAoIHRoZSBzYW5lIGZvciBhbGwgY2VsbHMgaW4gdGhlIHZlY3RvcilcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENlbGxzQXR0cigpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldHVybiBWZWN0b3JUeXBlLmdldENlbGxzQXR0cih0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuX2NlbGxzQXR0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjZWxscyBzaXplICggc2FtZSBzaXplIGZvciBhbGwgY2VsbHMpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDZWxsU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldFZhbDogbnVtYmVyO1xyXG5cclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldFZhbCA9IFZlY3RvclR5cGUuZ2V0Q2VsbFNpemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxTaXplO1xyXG5cclxuICAgIC8vIHVuaWNvZGUgY2VsbCBzaXplIGlzIHNhdmVkIGludGVybmFsbHkgYXMgYnl0ZSBsZW5ndGggc2luY2UgdGhhdCBpcyB0aGUgd2F5IHRoZSBzZXJ2ZXIgc2F2ZSBpdFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2VsbHNBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSlcclxuICAgICAgcmV0VmFsID0gTWF0aC5mbG9vcihyZXRWYWwgLyAyKTtcclxuXHJcbiAgICByZXR1cm4gcmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZlY3RvciBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRWZWNTaXplKCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKVxyXG4gICAgICByZXR1cm4gVmVjdG9yVHlwZS5nZXRWZWNTaXplKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gPG51bWJlcj50aGlzLl9jZWxscy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgYSBnaXZlIGNlbGwgY2VsbHMgaW5kZXhlcyBzdGFydCBmcm9tIDEgd3JvbmcgaW5kZXhlcyBvciBpbmRleGVzIHRoZSBkb2VzIG5vdCBleGlzdFxyXG4gIC8vLyAgIHdpbGwgcmV0dXJuIGRlZmF1bHQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIGNlbGwgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNlbGwgdmFsdWUgVE9ETzogeWFyaXYgY2hlY2sgd2l0aCByaW5hIHdoYXQgd2Ugc2hvdWxkIGRvIHdpdGhcclxuICAvLy8gICBibG9icyBleHRyYSBmaWVsZHNcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldFZlY0NlbGwoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJldFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICBpZiAoPG51bWJlcj5pZHggPD0gdGhpcy5nZXRWZWNTaXplKCkpIHtcclxuICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4IC0gMSkuYmxvYkZpZWxkUHJlZml4ICsgXCI7XCIgKyByZXRWYWw7XHJcblxyXG4gICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSlcclxuICAgICAgICAgIHJldFZhbCA9ICgocmV0VmFsLmNoYXJBdCgwKSA9PT0gJ1xcMCcpID8gXCIwXCIgOiBcIjFcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5pc051bGwpXHJcbiAgICAgICAgICByZXRWYWwgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKCF0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHNEZWZhdWx0VmFsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY2VsbCB2YWx1ZXMgb2YgYSB2ZWN0b3IgaW4gc3RyaW5nIGFycmF5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDZWxsVmFsdWVzKCk6IHN0cmluZ1tdIHtcclxuICAgIGxldCByZXRWYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgY2VsbFZhbHVlczogc3RyaW5nW10gPSBudWxsO1xyXG5cclxuICAgIHRoaXMuaW5pdCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmdldFZlY1NpemUoKSA+IDApXHJcbiAgICB7XHJcbiAgICAgIGNlbGxWYWx1ZXMgPSBuZXcgQXJyYXk8c3RyaW5nPih0aGlzLmdldFZlY1NpemUoKSk7XHJcblxyXG4gICAgICAvLyBHZXQgdGhlIHZlY3RvciB2YWx1ZVxyXG4gICAgICBmb3IgKGxldCBpZHg6IG51bWJlciA9IDA7IGlkeCA8IHRoaXMuZ2V0VmVjU2l6ZSgpOyBpZHgrKylcclxuICAgICAge1xyXG4gICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuYmxvYkZpZWxkUHJlZml4ICsgXCI7XCIgKyByZXRWYWw7XHJcblxyXG4gICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSlcclxuICAgICAgICAgIHJldFZhbCA9ICgocmV0VmFsLmNoYXJBdCgwKSA9PT0gJ1xcMCcpID8gXCIwXCIgOiBcIjFcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxscy5nZXRfSXRlbShpZHgpLmlzTnVsbClcclxuICAgICAgICAgIHJldFZhbCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNlbGxWYWx1ZXNbaWR4XSA9IHJldFZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgIHtcclxuICAgICAgICBjZWxsVmFsdWVzID0gW1xyXG4gICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2VsbFZhbHVlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbnNlcnRzIG9yIGNoYW5nZXMgYSBjZWxscyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgY2VsbCBpbmRleCBpZiB0aGUgaW5kZXggaXMgbm90IHNlcXVlbnRpYWwgY3JlYXRzIGVtcHR5IGNlbGwgdGlsbCB0aGUgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsdWVcIj50aGUgbmV3IHZhbHVlICggaWYgaXQgaXMgYSBibG9iIHR5cGUgb3IgdmVjdG9yIGl0IGNvbnRhaW5zIHRoZSBwcmVmaXggb2YgdGhlIGNvbnRyb2wgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1bnM+ICBmYWxzZSBpZiB0aGUgaW5kZXggaXMgd3Jvbmcgb3IgdGhlIHZlY3RvciBpbGxmb3JtZWQgPC9yZXR1bnM+XHJcbiAgc2V0VmVjQ2VsbChpZHg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoaWR4ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgICBsZXQgbG9jYWxDZWxsU2l6ZTogbnVtYmVyID0gKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IE1hdGguZmxvb3IodGhpcy5fY2VsbFNpemUgLyAyKSA6IHRoaXMuX2NlbGxTaXplO1xyXG4gICAgICAgIC8vIHRyeWluZyB0byBzZXQgbnVsbCB2YWx1ZSB3aGVuIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgaWYgKGlzTnVsbCAmJiAhdGhpcy5fYWxsb3dOdWxsKSB7XHJcbiAgICAgICAgICBpc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5fY2VsbHNEZWZhdWx0VmFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA8PSB0aGlzLl9jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBjdXJyOiBDZWxsRWxlbWVudCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpO1xyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgaWYgKCFpc051bGwpIHtcclxuICAgICAgICAgICAgLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGJsb2JzIGFuZCB2ZWN0b3JzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgdGhlIGRhdGEgaW4gdGhlIGNlbGxcclxuICAgICAgICAgICAgICBsZXQgYmxvYlByZWZpeExlbmd0aDogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgY3Vyci5ibG9iRmllbGRQcmVmaXggPSBuZXdWYWx1ZS5zdWJzdHIoMCwgYmxvYlByZWZpeExlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0cmVhdCBlbXB0eSBibG9iXHJcbiAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA+IGJsb2JQcmVmaXhMZW5ndGgpXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBuZXdWYWx1ZS5zdWJzdHIoYmxvYlByZWZpeExlbmd0aCk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzaW1wbGUgdHlwZVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgNTAzNjkxIHRoZSB2YWx1ZSBvZiB0cnVlIG9yIGZhbHNlIGluIHRoZSBzZXJ2ZXIgYXJlIHRoZSBudW1lcmljIHZhbHVlcyBvZiAxIGFuZCAwXHJcbiAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKHRoaXMuX2NlbGxzQXR0cikpIHtcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihuZXdWYWx1ZSkgPyBuZXcgU3RyaW5nQnVpbGRlcigpLkFwcGVuZCgxKS5Ub1N0cmluZygpIDogbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcMCcpLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBjdXJyLmRhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IG5ld1ZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyBudW1lcmljIHR5cGVzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgZGF0YSBidWYgYXMgbnVtIHR5cGUgc28gd2VcclxuICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgdGhlbSBiZWZvcmUgaW5zZXJ0aW5nIHRoZW0gdG8gdGhlIGJ1ZlxyXG4gICAgICAgICAgICAgIGxldCBkYXRhQnVmVmFsOiBzdHJpbmcgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICAgICAgICBkYXRhQnVmVmFsID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKGRhdGFCdWZWYWwpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhRGF0YUJ1ZjogVWludDhBcnJheSA9IHRoaXMuX2VuY29kaW5nLkdldEJ5dGVzKHRoaXMuX2RhdGFCdWYuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmFEYXRhQnVmVmFsOiBVaW50OEFycmF5ID0gdGhpcy5fZW5jb2RpbmcuR2V0Qnl0ZXMoZGF0YUJ1ZlZhbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRhdGEgYnVmXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYmFEYXRhQnVmVmFsLmxlbmd0aCAmJiA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIGJhRGF0YUJ1Zls8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaV0gPSBiYURhdGFCdWZWYWxbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGtlZXAgdGhlIHdob2xlIHNpemUgb2YgdGhlIGFscGhhXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBiYURhdGFCdWZWYWwubGVuZ3RoOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIGJhRGF0YUJ1Zls8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaV0gPSAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSkgPyAzMiA6IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmFEYXRhQnVmLCAwLCBiYURhdGFCdWYubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSB0aGlzLl9lbmNvZGluZy5HZXRTdHJpbmcoYmFEYXRhQnVmLCA8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpLCA8bnVtYmVyPmxvY2FsQ2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhIGJ1ZlxyXG4gICAgICAgICAgICAgICAgLy8gUUNSIDk4Nzk0MyB0cmltIHRoZSB2YWx1ZSBpZiBpdCBpcyBsb25nZXIgdGhlIHRoZSBjZWxsIGxlbmd0aFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGFCdWZWYWwubGVuZ3RoICYmIDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgZGF0YUJ1ZlZhbC5jaGFyQXQoaSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIGFscGhhIGFuZCBudW0gdHlwZSB3ZSBkbyBub3Qga2VlcCB0aGUgd2hvbGUgc2l6ZSBvZiB0aGUgYWxwaGEvTlVNX1RZUEVcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGRhdGFCdWZWYWwubGVuZ3RoOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuc2V0X0l0ZW0oPG51bWJlcj4oPG51bWJlcj4oaWR4IC0gMSkgKiBsb2NhbENlbGxTaXplKSArIGksICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gJyAnIDogJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUiA5ODc5NDMgdHJpbSB0aGUgdmFsdWUgaWYgaXQgaXMgbG9uZ2VyIHRoZSB0aGUgY2VsbCBsZW5ndGhcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pXHJcbiAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRoaXMuX2RhdGFCdWYuVG9TdHJpbmcoKS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj4oaWR4IC0gMSkgKiBsb2NhbENlbGxTaXplKSwgPG51bWJlcj5sb2NhbENlbGxTaXplKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXDAnKTtcclxuICAgICAgICAgICAgY3Vyci5pc051bGwgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgbnVsbFxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnIuZGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHByZWZpeCBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJsb2IgaXMgdmVjdG9yIG9yIG5vdFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgICAgIGN1cnIuYmxvYkZpZWxkUHJlZml4ID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXHUwMDAxJyk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBjdXJyLmJsb2JGaWVsZFByZWZpeCA9IEJsb2JUeXBlLmdldEVtcHR5QmxvYlByZWZpeCgnXFwwJyk7XHJcbiAgICAgICAgICAgIGN1cnIuaXNOdWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fbnVsbEJ1Zi5zZXRfSXRlbShpZHggLSAxLCAnXFx1MDAwMScpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVsZXZhbnQgb25seSBmb3Igbm9uZSBibG9ic1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyA8bnVtYmVyPmkgPCBsb2NhbENlbGxTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXHUwMDAxJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBuZXcgcmVjb3JkXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaW5zZXJ0VmFsOiBzdHJpbmc7XHJcbiAgICAgICAgICAvLyBjaG9vc2VzIHRoZSB2YWx1ZSBpbnNlcnRlZCB0byB0aGUgc2tpcHBlZCBjZWxsc1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgdGhlIGlzIHZlY3RvciBmbGFnXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICAgICAgaW5zZXJ0VmFsID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXHUwMDAxJyk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcMCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgICAgICAgaW5zZXJ0VmFsID0gaW5zZXJ0VmFsICsgdGhpcy5fY2VsbHNEZWZhdWx0VmFsOyAvLyBjb25jYXQgcmVnb2xhciBibG9iIGNudHJvbCBkYXRhXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IG51bGw7XHJcbiAgICAgICAgICAvLyBzaW1wbGUgbnVsbCB2YWx1ZVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpbnNlcnRWYWwgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7IC8vIGRlZmF1bHQgc2ltcGxlIHZhbHVlXHJcblxyXG4gICAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgICAgaWYgKGluc2VydFZhbCAhPT0gbnVsbCAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgICBpbnNlcnRWYWwgPSAoRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4oaW5zZXJ0VmFsKSA/IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKCdcXHUwMDAxJykuVG9TdHJpbmcoKSA6IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKCdcXDAnKS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAvLyBjcmVhdGUgc2tpcHBlZCByZWNvcmRzXHJcbiAgICAgICAgICAvLyB3aGVuIGEgdmVjdG9yIGNlbGwgaXMgc2V0ICwgaWYgdGhlIGNlbGwgaXMgYmV5b25kIHRoZSBleGlzdGluZyB2ZWN0b3IuXHJcbiAgICAgICAgICAvLyB3ZSB3aWxsIGZpbGwgdGhlIGNlbGxzIGJldHdlZW4gdmVjdG9yIHNpemUgYW5kIHNldCBjZWxsIHdpdGggZGVmYXVsdCB2YWx1ZS5cclxuICAgICAgICAgIC8vIGZvciBleGFtcGxlIDogaWYgdmVjdG9yIHNpemUgaXMgMCwgYW5kIHdlIGRvIHZlY3NldCAodmVjWzVdKS4gY2VsbCA1IG5lZWRzIHRvIGJlIHNldFxyXG4gICAgICAgICAgLy8gd2l0aCB0aGUgdmFsdWUuIGNlbGxzIDEgdG8gNCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHNldCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICAgICAgbGV0IGRhdGFCdWZWYWw6IHN0cmluZyA9IGluc2VydFZhbDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAodGhpcy5fY2VsbHMubGVuZ3RoIDwgaWR4KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxscy5wdXNoKG5ldyBDZWxsRWxlbWVudChpbnNlcnRWYWwuc3Vic3RyKFZlY3RvclR5cGUuRU1QVFlfQkxPQl9QUkVGSVhfTEVOKSwgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0LCBpbnNlcnRWYWwuc3Vic3RyKDAsIFZlY3RvclR5cGUuRU1QVFlfQkxPQl9QUkVGSVhfTEVOKSkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKHRoaXMuZ2V0TnVsbFN0cmluZyhWZWN0b3JUeXBlLkJMT0JfVFlQRV9TVFJVQ1RfU0laRSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGluc2VydFZhbCwgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0KSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBidWZcclxuICAgICAgICAgICAgICBpZiAoaW5zZXJ0VmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBudW1lcmljIHR5cGVzIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgZGF0YSBidWYgYXMgbnVtIHR5cGUgc28gd2VcclxuICAgICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlbSB0byB0aGUgYnVmXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUJ1ZmZlclZhbEZvck51bVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgdmFsdWUgZm9yIG51bSB0eXBlIG9ubHkgb25jZSwgYW5kIHVzZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGFsbCB0aGUgY2VsbHMgdG8gYmUgaW5pdGlhbGl6ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gdGhlIHRyYW5zbGF0aW9uIG9ubHkgb25jZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUJ1ZmZlclZhbEZvck51bVR5cGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhQnVmVmFsID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKGluc2VydFZhbCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkYXRhQnVmVmFsIGVpdGhlciBjb250YWlucyBvcmlnaW5hbCBpbnNlcnRWYWwsIG9yIGEgc3RyaW5nIG9mXHJcbiAgICAgICAgICAgICAgICAvLyBieXRlU3RyZWFtIGZvciBudW0gdHlwZXMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZChkYXRhQnVmVmFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBhbHdheSBrZWVwIHRoZSB3aG9sZSBhbHBoYVxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbExlbjogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTykpXHJcbiAgICAgICAgICAgICAgICAgIHZhbExlbiA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKGRhdGFCdWZWYWwpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB2YWxMZW4gPSBkYXRhQnVmVmFsLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB2YWxMZW47IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAnICcgOiAnXFwwJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKHRoaXMuZ2V0TnVsbFN0cmluZyhsb2NhbENlbGxTaXplKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbnVsbCBidWZcclxuICAgICAgICAgICAgdGhpcy5fbnVsbEJ1Zi5JbnNlcnQodGhpcy5fY2VsbHMubGVuZ3RoIC0gMSxcclxuICAgICAgICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPyAnXFx1MDAwMScgOiAnXFwwJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHZlY3RvciBoYXMgYmVlbiBmaWxsZWQgdGlsbCB0aGUgcmVxdWVzdGVkIGlkeC5cclxuICAgICAgICAgIC8vIG5vdyBpdHMgdGltZSB0byBzZXQgdGhlIHJlcXVlc3RlZCBjZWxsLlxyXG4gICAgICAgICAgcmVzID0gdGhpcy5zZXRWZWNDZWxsKGlkeCwgbmV3VmFsdWUsIGlzTnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgcmVzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoYW5nZSB0aGUgdmVjdG9yIHRvIGZpdCB0aGUgZGVmaW5pdGlvbnMgb2YgYSBkaWZmZXJlbnQgdmVjdG9yIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZFwiPnRoZSBuZXcgZmllbGQ8L3BhcmFtPlxyXG4gIGFkanVzdFRvRml0KGZpZWxkOiBGaWVsZERlZik6IHZvaWQge1xyXG4gICAgaWYgKGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICBsZXQgc3JjQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0Q2VsbHNBdHRyKCk7XHJcbiAgICAgIGxldCBkc3RBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gZmllbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoc3JjQXR0ciwgZHN0QXR0cikpIHtcclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuXHJcbiAgICAgICAgLy8gdHJpbSBkYXRhIGlmIG5lZWRlZCAoIG9ubHkgZm9yIGFscGhhIG9yIG1lbW8pXHJcbiAgICAgICAgaWYgKFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShzcmNBdHRyKSAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suSXNUeXBlQWxwaGFPclVuaWNvZGUoZHN0QXR0cikpIHtcclxuICAgICAgICAgICAgbGV0IGRzdFNpemVJbkNoYXJzOiBudW1iZXIgPSBmaWVsZC5nZXRWZWNDZWxsc1NpemUoKTtcclxuICAgICAgICAgICAgbGV0IHNyY1NpemVJbkNoYXJzOiBudW1iZXIgPSAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IE1hdGguZmxvb3IodGhpcy5fY2VsbFNpemUgLyAyKSA6IHRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgIGxldCBpc0J5dGVNb2RlOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlQWxwaGEoZHN0QXR0cik7XHJcblxyXG4gICAgICAgICAgaWYgKHNyY1NpemVJbkNoYXJzICE9PSBkc3RTaXplSW5DaGFycykge1xyXG4gICAgICAgICAgICBsZXQgYWRqRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBnb2VzIG92ZXIgYWxsIGNlbGxzIGluIHRoZSB2ZWN0b3JcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRzdFNpemVJbkNoYXJzOyBpID0gaSArIDEpIHtcclxuICAgICAgICAgICAgICBsZXQgY3VycjogQ2VsbEVsZW1lbnQgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpKTtcclxuICAgICAgICAgICAgICAvLyB0cmltIGlzIG5lZWRlZFxyXG4gICAgICAgICAgICAgIGlmICghY3Vyci5pc051bGwpIHsgLy8gdW5pY29kZSBjZWxsIHNpemUgYXJlIHNhdmVkIGludGVybmFsbHkgYXMgYnl0ZSBsZW5ndGggd2hpbGUgdGhlIGZpZWxkIHJldHVybnMgY2hhclxyXG4gICAgICAgICAgICAgICAgLy8gbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBpZiAoc3JjU2l6ZUluQ2hhcnMgPiBkc3RTaXplSW5DaGFycykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNCeXRlTW9kZSlcclxuICAgICAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoY3Vyci5kYXRhLCBkc3RTaXplSW5DaGFycyk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBjdXJyLmRhdGEuc3Vic3RyKDAsIGRzdFNpemVJbkNoYXJzKTtcclxuICAgICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQoY3Vyci5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgaXMgbmVlZGVkXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRtcERhdGE6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgICAgICAgICB0bXBEYXRhLkFwcGVuZChjdXJyLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZGF0YUxlbjogbnVtYmVyID0gaXNCeXRlTW9kZSA/IFV0aWxTdHJCeXRlTW9kZS5sZW5CKGN1cnIuZGF0YSkgOiBjdXJyLmRhdGEubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gcGFkIHdpdGggYmxhbmtzXHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IGRhdGFMZW47IGogPCBkc3RTaXplSW5DaGFyczsgaiA9IGogKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHRtcERhdGEuQXBwZW5kKCcgJyk7XHJcbiAgICAgICAgICAgICAgICAgIGFkakRhdGEuQXBwZW5kKHRtcERhdGEuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4gdGhlIHZlY3RvciBjZWxsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRtcERhdGEuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgZHN0U2l6ZUluQ2hhcnM7IGogPSBqICsgMSlcclxuICAgICAgICAgICAgICAgICAgdG1wRGF0YS5BcHBlbmQoJ1xcMCcpO1xyXG4gICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQodG1wRGF0YS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4gdGhlIHZlY3RvciBjZWxsXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSB0bXBEYXRhLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Ly8gZW5kIGxvb3BcclxuICAgICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IGFkakRhdGE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBRQ1IgNzQ3ODAxIGluIHRoZSBmaWxlZCB0aGUgc2l6ZSBvZiBudW1lcmljL2RhdGUvdGltZSBpcyB0aGllciBoZXggc2l6ZVxyXG4gICAgICAgIC8vIHdoZXJlYXMgaGVyZSBpdCBpcyB0aGVpciBOVU1fVFlQRSBzaXplXHJcbiAgICAgICAgbGV0IG5ld1NpemU6IG51bWJlciA9IGZpZWxkLmdldFZlY0NlbGxzU2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGhlYWRlcnMgZGF0YSBzdWNoIGFzIGNlbGwgdHlwZSBhbmQgY2VsbHMgc2l6ZVxyXG4gICAgICAgIHRoaXMuX2NlbGxzQXR0ciA9IGZpZWxkLmdldENlbGxzVHlwZSgpO1xyXG4gICAgICAgIHRoaXMuX2NlbGxTaXplID0gPG51bWJlcj4oKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/IChuZXdTaXplICogMikgOiBuZXdTaXplKTtcclxuICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSBmaWVsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0ID0gZmllbGQuaXNOdWxsRGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuX2FsbG93TnVsbCA9IGZpZWxkLk51bGxBbGxvd2VkO1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsZmxhdERhdGEgPSB0aGlzLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBWZWN0b3JUeXBlLmFkanVzdFRvRml0IHZlY3RvciBiYXNpYyB0eXBlcyBkb2VzIG5vdCBhZ3JlZVwiKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gIFZlY3RvclR5cGUuYWRqdXN0VG9GaXQgXCIgKyBmaWVsZC5nZXROYW1lKCkgKyBcIiBpcyBub3Qgb2YgdHlwZSB2ZWN0b3JcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRoZSB2ZWMgc2l6ZSBpbiB0aGUgaGVhZGVycyBidWZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+dGhlIG5ldyBzaXplPC9wYXJhbT5cclxuICBwcml2YXRlIGJ1aWxkSGVhZGVyc1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogc3RyaW5nID0gVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUiArIFZlY3RvclR5cGUuVkVDVE9SX1NUUiArIFwiLFwiICsgVmVjdG9yVHlwZS5WRVJTSU9OICsgXCIsXCIgKyAxICsgXCIsXCIgKyA8c3RyaW5nPnRoaXMuX2NlbGxzQXR0ciArIFwiLFwiO1xyXG4gICAgcmVzID0gcmVzICsgdGhpcy5fY2VsbFNpemUgKyBcIixcIjtcclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgIGxldCBkZWY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5fY2VsbHNEZWZhdWx0VmFsICE9PSBudWxsKVxyXG4gICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgZGVmID0gUmVjb3JkVXRpbHMuYnl0ZVN0cmVhbVRvU3RyaW5nKHRoaXMuX2NlbGxzRGVmYXVsdFZhbCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBkZWYgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcblxyXG4gICAgLy8gaW4gc3RyaW5nIHdlIGRvIG5vdCBrZWVwIHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJyd29zZXIgY2xpZW50XHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSlcclxuICAgICAgZGVmID0gZGVmICsgdGhpcy5nZXRFbXB0eVN0cmluZyh0aGlzLl9jZWxsU2l6ZSAtIDxudW1iZXI+VXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGVmKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGRlZiA9IGRlZiArIHRoaXMuZ2V0RW1wdHlTdHJpbmcodGhpcy5fY2VsbFNpemUgLSA8bnVtYmVyPmRlZi5sZW5ndGgpO1xyXG5cclxuICAgIC8vIGNvbnRpbnVlIGJ1aWxkaW5nIHRoZSBoZWFkZXJzXHJcbiAgICByZXMgPSByZXMgKyBkZWYgKyBcIixcIiArICh0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPyBcIjFcIiA6IFwiMFwiKSArIFwiLFwiO1xyXG4gICAgcmVzID0gcmVzICsgKHRoaXMuX2FsbG93TnVsbCA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCIgKyB0aGlzLl9jZWxsU2l6ZSArIFwiLFwiICsgdGhpcy5fY2VsbHMubGVuZ3RoICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyAoKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBcIjFcIiA6IFwiMFwiKSArIFwiLFwiO1xyXG5cclxuICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgIHJlcyA9IHJlcyArIFwiMCxcIjtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHNpemUgbnVsbCBjaGFyZWN0ZXJzXHJcbiAgcHJpdmF0ZSBnZXROdWxsU3RyaW5nKHNpemU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaXplOyBpID0gaSArIDEpXHJcbiAgICAgIHJlcy5BcHBlbmQoJ1xcMCcpO1xyXG4gICAgcmV0dXJuIHJlcy5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyBhIHN0cmluZyB3aXRoIHNpemUgYmxhbmsgY2hhcmVjdGVyc1xyXG4gIHByaXZhdGUgZ2V0RW1wdHlTdHJpbmcoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSlcclxuICAgICAgcmVzLkFwcGVuZCgnICcpO1xyXG4gICAgcmV0dXJuIHJlcy5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdvZXMgb3ZlciB0aGUgY2VsbHMgb2YgdGhlIHZlY3RvcnMgYW5kIGJ1aWxkcyB0aGUgZGF0YSBidWYgb2YgYmxvYnMgc2luY2UgaXQgaXMgdGhlIG9ubHkgdGhpbmcgbm90XHJcbiAgLy8vICAgdXBkYXRlZCBkeW5hbWljYWxseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRCbG9ic0J1ZigpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fY2VsbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGRhdGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGxldCBibG9iU2l6ZTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGN1cnI6IENlbGxFbGVtZW50ID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICBpZiAoY3Vyci5kYXRhICE9PSBudWxsKSB7XHJcbiAgICAgICAgZGF0YSA9IGN1cnIuZGF0YTtcclxuICAgICAgICBibG9iU2l6ZSA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXMuQXBwZW5kKGJsb2JTaXplKTtcclxuICAgICAgcmVzLkFwcGVuZChcIixcIiArIGN1cnIuYmxvYkZpZWxkUHJlZml4ICsgXCIsXCIgKyBkYXRhICsgXCI7XCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChyZXMgKyBcIixcIik7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgLyogc3RhdGljIHV0aWxpdHkgbWV0aG9kcyAqL1xyXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZXMgdGhlIGNlbGwgYXR0cmlidXRlIG9mIHRoZSB2ZWN0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlwiPmEgdmVjdG9yIGluIGEgZmxhdHRlbmVkIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhdHQgdGhlIHRoZSB2ZWN0b3IncyBjZWxscyBhdHRyaWJ1dGU8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldENlbGxzQXR0cihibG9iOiBzdHJpbmcpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKGJsb2IpKSB7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKGJsb2IpKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgTUdCVE1HVkVDXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSB2ZXJzaW9uXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfXHJcblxyXG4gICAgICAvLyB0aGUgbmV4dCB0b2tlbiBpcyB0aGUgY2VsbHMgYXR0cmlidXRlXHJcbiAgICAgIHJldHVybiA8U3RvcmFnZUF0dHJpYnV0ZT50b2tlbnNbM10uY2hhckF0KDApO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBzdGF0aWMgZ2V0Q2VsbHNBdHRyIHRoZSBibG9iIGlzIGluIHRoZSB3cm9uZyBmb3JtYXRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2VzIHRoZSBzaXplIG9mIGVhY2ggY2VsbCBpbiB0aGUgdmVjdG9yIGFsbCBjZWxsIGhhcyB0aGUgc2FtZSBzaXplIGV4Y2VwdCB3aGVuIHRoZSB2ZWN0b3IgY2VsbHMgYXJlXHJcbiAgLy8vICAgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iXCI+YSB2ZWN0b3IgaW4gYSBmbGF0dGVuZWQgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjZWxscyBzaXplIG9yIC0xIGlmIHRoZXJlIGlzIGVuY29kaW5nIHByb2JsZW08L3JldHVybnM+XHJcbiAgc3RhdGljIGdldENlbGxTaXplKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gVmVjdG9yVHlwZS5nZXRDZWxsc0F0dHIoYmxvYik7XHJcbiAgICBpZiAoY2VsbHNUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgY2VsbHNUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKGJsb2IpKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgTUdCVE1HVkVDXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSB2ZXJzaW9uXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfXHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBjZWxscyB0eXBlXHJcblxyXG4gICAgICAvLyB0aGUgbmV4dCBlbGVtZW50IGlzIHRoZSBjZWxscyBzaXplXHJcbiAgICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHRva2Vuc1s0XSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XHJcbiAgICAgIHJldHVybiAyMTQ3NDgzNjQ3O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlcyB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JcIj5hIHZlY3RvciBpbiBhIGZsYXR0ZW5lZCBmb3JtYXQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHNpemUgb2YgdGhlIHZlY3RvcjwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0VmVjU2l6ZShibG9iOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKGJsb2IpKSB7XHJcbiAgICAgIGxldCBwb3M6IG51bWJlciA9IEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYik7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihwb3MpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1swXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1sxXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1syXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHR5cGVcclxuICAgICAgcG9zID0gcG9zICsgKHRva2Vuc1szXS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHNpemVcclxuICAgICAgbGV0IGNlbGxzU2l6ZTogc3RyaW5nID0gdG9rZW5zWzRdO1xyXG4gICAgICBwb3MgPSBwb3MgKyAoY2VsbHNTaXplLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbCBkZWZhdWx0IHZhbHVlIGFuZCByZS1pbml0IHRoZSB0b2tlbml6ZXJcclxuICAgICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgbWF5IGNvbnRhaW4gdGhlIGRlbGltZXRlciBjaGFyZWN0ZXIgYXMgZGF0YVxyXG4gICAgICBwb3MgPSBwb3MgKyAoTk51bWJlci5QYXJzZShjZWxsc1NpemUpICsgMSk7XHJcbiAgICAgIHRva2VucyA9IFN0clV0aWwudG9rZW5pemUoYmxvYi5zdWJzdHIocG9zKSwgXCIsXCIpO1xyXG5cclxuICAgICAgLy8gc2tpcCBpcyBjZWxsIG51bGwgZGVmYXVsdFxyXG5cclxuICAgICAgLy8gc2tpcCBpcyBudWxsIGFsbG93ZWRcclxuXHJcbiAgICAgIC8vIHNraXAgY29sdW1ucyB0b3RhbCBsZW5ndGhcclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIHZlY3RvciBzaXplXHJcbiAgICAgIHJldHVybiBOTnVtYmVyLlBhcnNlKHRva2Vuc1szXSk7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBzdGF0aWMgZ2V0VmVjU2l6ZSB0aGUgYmxvYiBpcyBpbiB0aGUgd3JvbmcgZm9ybWF0XCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGZsYXREYXRhIGNvbnRlbnQgd2FzIHRyYW5zbGF0ZWQgdG8gdW5pY29kZSBvciBub3QuIGZsYXREYXRhIGNvbnRhaW5zIHRoZSB2ZWN0b3IncyBjZWxscyBpbiBmbGF0XHJcbiAgLy8vICAgKG5vbi1hcnJheSkgZm9ybWF0LiBUaGlzIGlzIGhvdyB0aGUgc2VydmVyIHNlbmRzIHVzIHRoZSBkYXRhLiBIb3dldmVyIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBpdCB0byB1c1xyXG4gIC8vLyAgIGluIGEgVU5JQ09ERSBmb3JtYXQuIFRodXMgd2UgdHJhbnNsYXRlIGl0IHRvIHVuaWNvZGUgZHVyaW5nIHRoZSBmaXJzdCB0aW1lIHdlIFwiZGUtc2VyaWFsaXplXCIgdGhlXHJcbiAgLy8vICAgZmxhdC1kYXRhIGludG8gYSB2ZWN0b3IuIER1cmluZyB0aGUgZGUtc2VyaWFsaXphdGlvbiBvcGVyYXRpb24gZHVyaW5nIHRoZSBmaXJzdCB0aW1lIHdlIFwiZGUtc2VyaWFsaXplXCJcclxuICAvLy8gICB0aGUgZmxhdC1kYXRhIGludG8gYSB2ZWN0b3IuIER1cmluZyB0aGUgZGUtc2VyaWFsaXphdGlvbiBvcGVyYXRpb24gd2UgbW9kaWZ5IHRoZSBCTE9CLVRBQkxlIGV5ZSBjYXRjaGVyXHJcbiAgLy8vICAgZnJvbSB1cHBlciBjYXNlIHRvIGxvd2VyIGNhc2UsIHRoaXMgd2F5IHdlIGtub3cgaWYgYSB0cmFuc2xhdGlvbiB3YXMgZG9uZSBvciBpcyBuZWVkZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5hbWVcIj5mbGF0RGF0YSBUaGUgdmVjdG9yJ3MgZmxhdCBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFRSVUUgaWYgdGhlIGZsYXQgZGF0YSBpcyBhbHJlYWR5IGluIHVuaWNvZGUgZm9ybWF0PC9yZXR1cm5zPlxyXG4gIGlzVW5pY29kZShmbGF0RGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoZmxhdERhdGEpO1xyXG4gICAgbGV0IGNhdGNoZXI6IHN0cmluZyA9IGZsYXREYXRhLnN1YnN0cihzdGFydCwgVmVjdG9yVHlwZS5CTE9CX1RBQkxFX1NUUl9MRU4pO1xyXG4gICAgcmV0dXJuIChjYXRjaGVyID09PSBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBpbm5lciBjbGFzcyByZXByZXNlbnRzIGEgY2VsbCBpbiB0aGUgbWFnaWMgdmVjdG9yIGVhY2ggZGF0YSB0aGF0IHRoZSBtYWdpYyB2ZWN0b3Iga2VlcHMgcGVyIGNlbGxcclxuLy8vICAgd2lsbCBiZSBrZXB0IGluIHRoZSBDZWxsRWxlbWVudFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgQ2VsbEVsZW1lbnQge1xyXG4gIGJsb2JGaWVsZFByZWZpeDogc3RyaW5nID0gbnVsbDtcclxuICBkYXRhOiBzdHJpbmcgPSBudWxsO1xyXG4gIGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBhbGwgdGhpcyB2YXJpYWJsZXMgYXJlIHVzZWQgb25seSBpZiB0aGUgdmVjdG9yIGNlbGwgaXMgb2YgdHlwZSB2ZWN0b3Igb3IgYmxvYlxyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKHZhbDogc3RyaW5nLCBpc19udWxsOiBib29sZWFuLCBjdHJsRGF0YT86IHN0cmluZykge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCh2YWwsIGlzX251bGwpO1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHZhbCwgaXNfbnVsbCwgY3RybERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc3RydWN0cyBhIG5ldyBjZWxsIGVsZW1lbnQgZm9yIHZlY3RvcnMgd2hvcyBjZWxscyBhcmUgbm90IG9mIHR5cGUgYmxvYiBvciB2ZWN0b3JcclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIHRoaXMuaXNOdWxsID0gaXNfbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIGNvbnN0cnVjdHMgYSBuZXcgY2VsbCBlbGVtZW50IGZvciB2ZWN0b3JzIHdob3MgY2VsbHMgYXJlIG9mIHR5cGUgYmxvYiBvciB2ZWN0b3JcclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9IHZhbDtcclxuICAgIHRoaXMuaXNOdWxsID0gaXNfbnVsbDtcclxuICAgIHRoaXMuYmxvYkZpZWxkUHJlZml4ID0gY3RybERhdGE7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|