@magic-xpa/gui 4.1100.0-dev4110.24 → 4.1100.0-dev4110.240
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,42 @@
|
|
|
1
|
+
import { XmlParser } from "@magic-xpa/utils";
|
|
2
|
+
import { Manager } from "../Manager";
|
|
3
|
+
import { NString } from "@magic-xpa/mscorelib";
|
|
4
|
+
export class RuntimeContextBase {
|
|
5
|
+
_insertMode = false;
|
|
6
|
+
_lastCoordinates = new Array(4);
|
|
7
|
+
ContextID = '\0';
|
|
8
|
+
Parser = null;
|
|
9
|
+
FrameForm = null;
|
|
10
|
+
LastClickedCtrlName = null;
|
|
11
|
+
static noContextId = null;
|
|
12
|
+
RemovedContextFromServer = false;
|
|
13
|
+
RemovingContextFromServer = false;
|
|
14
|
+
CurrentClickedCtrl = null;
|
|
15
|
+
CurrentClickedRadio = null;
|
|
16
|
+
DefaultStatusMsg = null;
|
|
17
|
+
LastClickCoordinatesAreInPixels = false;
|
|
18
|
+
static Instance = new RuntimeContextBase();
|
|
19
|
+
constructor() { }
|
|
20
|
+
Init(contextID) {
|
|
21
|
+
this.ContextID = contextID;
|
|
22
|
+
this.LastClickedCtrlName = "";
|
|
23
|
+
this._insertMode = true;
|
|
24
|
+
Manager.SetCurrentContextID(contextID);
|
|
25
|
+
this.Parser = new XmlParser();
|
|
26
|
+
}
|
|
27
|
+
SaveLastClickInfo(controlName, clientX, clientY, offsetX, offsetY, isInPixels) {
|
|
28
|
+
this._lastCoordinates[0] = offsetX;
|
|
29
|
+
this._lastCoordinates[1] = offsetY;
|
|
30
|
+
this._lastCoordinates[2] = clientX;
|
|
31
|
+
this._lastCoordinates[3] = clientY;
|
|
32
|
+
this.LastClickCoordinatesAreInPixels = isInPixels;
|
|
33
|
+
this.LastClickedCtrlName = "";
|
|
34
|
+
if (!NString.IsNullOrEmpty(controlName)) {
|
|
35
|
+
this.LastClickedCtrlName = controlName;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
ToggleInsertMode() {
|
|
39
|
+
this._insertMode = !this._insertMode;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnVudGltZUNvbnRleHRCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L1J1bnRpbWVDb250ZXh0QmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHM0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFN0MsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLGdCQUFnQixHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFELFNBQVMsR0FBVyxJQUFJLENBQUM7SUFDekIsTUFBTSxHQUFjLElBQUksQ0FBQztJQUN6QixTQUFTLEdBQWUsSUFBSSxDQUFDO0lBQzdCLG1CQUFtQixHQUFXLElBQUksQ0FBQztJQUVuQyxNQUFNLENBQUMsV0FBVyxHQUFXLElBQUksQ0FBQztJQUNsQyx3QkFBd0IsR0FBWSxLQUFLLENBQUM7SUFDMUMseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBSTNDLGtCQUFrQixHQUFrQixJQUFJLENBQUM7SUFFekMsbUJBQW1CLEdBQWtCLElBQUksQ0FBQztJQUMxQyxnQkFBZ0IsR0FBVyxJQUFJLENBQUM7SUFDaEMsK0JBQStCLEdBQVksS0FBSyxDQUFDO0lBRWpELE1BQU0sQ0FBQyxRQUFRLEdBQXVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUUvRCxnQkFBd0IsQ0FBQztJQUN6QixJQUFJLENBQUMsU0FBaUI7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxXQUFtQixFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQUUsT0FBZSxFQUFFLE9BQWUsRUFBRSxVQUFtQjtRQUM1SCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRW5DLElBQUksQ0FBQywrQkFBK0IsR0FBRyxVQUFVLENBQUM7UUFFbEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFHRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtYbWxQYXJzZXJ9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7TWdGb3JtQmFzZX0gZnJvbSBcIi4vZ3VpL01nRm9ybUJhc2VcIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2xCYXNlfSBmcm9tIFwiLi9ndWkvTWdDb250cm9sQmFzZVwiO1xyXG5pbXBvcnQge01hbmFnZXJ9IGZyb20gXCIuLi9NYW5hZ2VyXCI7XHJcbmltcG9ydCB7TlN0cmluZ30gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbnRleHRCYXNlIHtcclxuICBwcml2YXRlIF9pbnNlcnRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbGFzdENvb3JkaW5hdGVzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDQpO1xyXG4gIENvbnRleHRJRDogc3RyaW5nID0gJ1xcMCc7XHJcbiAgUGFyc2VyOiBYbWxQYXJzZXIgPSBudWxsOyAvLyB4bWwgcGFyc2VyXHJcbiAgRnJhbWVGb3JtOiBNZ0Zvcm1CYXNlID0gbnVsbDsgLy8gZm9ybSBvZiB0aGUgTURJL1NESSBmcmFtZVxyXG4gIExhc3RDbGlja2VkQ3RybE5hbWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBub0NvbnRleHRJZDogc3RyaW5nID0gbnVsbDtcclxuICBSZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTsgLy9zZXQgd2hlbiByZXEuICdDb250ZXh0IFJlbW92ZScgc2VudCB0byBzZXJ2ZXIuXHJcbiAgUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlOyAvL3NldCB3aGVuIGV2ZW50ICdDb250ZXh0IFJlbW92ZSdyYWlzZWRcclxuICAvLyBDdXJyZW50Q2xpY2tlZEN0cmwgLSBhbHdheXMgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGNsaWNrZWRDdHJsLiBJbml0aWFsbHkgbnVsbCwgYnV0IG9uY2UgY2xpY2tlZCBvbiBhbnlcclxuICAvLyBjb250cm9sLCBpdCBhbHdheXMgcG9pbnRzIHRvIHRoaXMgY2xpY2tlZCBjdHJsLiBBbmQsIGlzIHJlc2V0IGJhY2sgdG8gbnVsbCBvbmNlIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5XHJcbiAgLy8gcGFya2VkIG9uIHRoZSBwYXJrYWJsZSBjb250cm9sLlxyXG4gIEN1cnJlbnRDbGlja2VkQ3RybDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIEN1cnJlbnRDbGlja2VkUmFkaW86IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIERlZmF1bHRTdGF0dXNNc2c6IHN0cmluZyA9IG51bGw7XHJcbiAgTGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGF0aWMgSW5zdGFuY2U6IFJ1bnRpbWVDb250ZXh0QmFzZSA9IG5ldyBSdW50aW1lQ29udGV4dEJhc2UoKTtcclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gIEluaXQoY29udGV4dElEOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuQ29udGV4dElEID0gY29udGV4dElEO1xyXG4gICAgdGhpcy5MYXN0Q2xpY2tlZEN0cmxOYW1lID0gXCJcIjtcclxuICAgIHRoaXMuX2luc2VydE1vZGUgPSB0cnVlO1xyXG4gICAgTWFuYWdlci5TZXRDdXJyZW50Q29udGV4dElEKGNvbnRleHRJRCk7XHJcbiAgICB0aGlzLlBhcnNlciA9IG5ldyBYbWxQYXJzZXIoKTtcclxuICB9XHJcblxyXG4gIFNhdmVMYXN0Q2xpY2tJbmZvKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciwgaXNJblBpeGVsczogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fbGFzdENvb3JkaW5hdGVzWzBdID0gb2Zmc2V0WDsgLy8gR2l2ZXMgdGhlIFggbG9jYXRpb24gb2YgdGhlIGxhc3QgY2xpY2ssIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3dcclxuICAgIHRoaXMuX2xhc3RDb29yZGluYXRlc1sxXSA9IG9mZnNldFk7IC8vIEdpdmVzIHRoZSBZIGxvY2F0aW9uIG9mIHRoZSBsYXN0IGNsaWNrLCByZWxhdGl2ZSB0byB0aGUgd2luZG93XHJcbiAgICB0aGlzLl9sYXN0Q29vcmRpbmF0ZXNbMl0gPSBjbGllbnRYOyAvLyBHaXZlcyB0aGUgWCBsb2NhdGlvbiBvZiB0aGUgbGFzdCBjbGljaywgcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2wgd2l0aGluIHdoaWNoIHRoZSBjbGljayBvY2N1cnJlZFxyXG4gICAgdGhpcy5fbGFzdENvb3JkaW5hdGVzWzNdID0gY2xpZW50WTsgLy8gR2l2ZXMgdGhlIFkgbG9jYXRpb24gb2YgdGhlIGxhc3QgY2xpY2ssIHJlbGF0aXZlIHRvIHRoZSBjb250cm9sIHdpdGhpbiB3aGljaCB0aGUgY2xpY2sgb2NjdXJyZWRcclxuXHJcbiAgICB0aGlzLkxhc3RDbGlja0Nvb3JkaW5hdGVzQXJlSW5QaXhlbHMgPSBpc0luUGl4ZWxzO1xyXG5cclxuICAgIHRoaXMuTGFzdENsaWNrZWRDdHJsTmFtZSA9IFwiXCI7IC8vIGlzIGVtcHR5IHN0cmluZ1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoY29udHJvbE5hbWUpKSB7XHJcbiAgICAgIHRoaXMuTGFzdENsaWNrZWRDdHJsTmFtZSA9IGNvbnRyb2xOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiB0b2dnbGUgdGhlIF9pbnNlcnRNb2RlIChiZXR3ZWVuIGluc2VydCBhbmQgb3ZlcndyaXRlKS4gPC9zdW1tYXJ5PlxyXG4gIFRvZ2dsZUluc2VydE1vZGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnNlcnRNb2RlID0gIXRoaXMuX2luc2VydE1vZGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { Logger, StrUtil } from '@magic-xpa/utils';
|
|
2
|
+
import { ApplicationException, Debug, Encoding, ISO_8859_1_Encoding, NNumber, NString } from '@magic-xpa/mscorelib';
|
|
3
|
+
import { GuiConstants } from '../../GuiConstants';
|
|
4
|
+
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
5
|
+
export class BlobType {
|
|
6
|
+
static CONTENT_TYPE_UNKNOWN = '0';
|
|
7
|
+
static CONTENT_TYPE_ANSI = '1';
|
|
8
|
+
static CONTENT_TYPE_UNICODE = '2';
|
|
9
|
+
static CONTENT_TYPE_BINARY = '3';
|
|
10
|
+
static getContentType(blob) {
|
|
11
|
+
try {
|
|
12
|
+
let tokens = StrUtil.tokenize(blob, /,|;/);
|
|
13
|
+
return tokens[4].charAt(0);
|
|
14
|
+
}
|
|
15
|
+
catch (Exception) {
|
|
16
|
+
throw new ApplicationException(" in BlobType.getContentType blob is in invalid format");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
static getEmptyBlobPrefix(vecCellAttr) {
|
|
20
|
+
return NString.Format("0,0,{0},{1},0", '\0', vecCellAttr);
|
|
21
|
+
}
|
|
22
|
+
static getBlobPrefixForContentType(contentType) {
|
|
23
|
+
return NString.Format("0,0,{0},{0},{1};", '\0', contentType);
|
|
24
|
+
}
|
|
25
|
+
static getPrefix(str) {
|
|
26
|
+
let idx = str.indexOf(';');
|
|
27
|
+
return str.substr(0, idx + 1);
|
|
28
|
+
}
|
|
29
|
+
static getEncodingFromContentType(ContentType) {
|
|
30
|
+
let encoding;
|
|
31
|
+
if (ContentType === BlobType.CONTENT_TYPE_UNICODE)
|
|
32
|
+
encoding = Encoding.Unicode;
|
|
33
|
+
else if (ContentType === BlobType.CONTENT_TYPE_ANSI)
|
|
34
|
+
encoding = GuiEnvironment.Environment.GetEncoding();
|
|
35
|
+
else
|
|
36
|
+
encoding = ISO_8859_1_Encoding.ISO_8859_1;
|
|
37
|
+
return encoding;
|
|
38
|
+
}
|
|
39
|
+
static MbToUnicode(BytesInMb) {
|
|
40
|
+
let result = null;
|
|
41
|
+
try {
|
|
42
|
+
let UnicodeString = GuiEnvironment.Environment.GetEncoding().GetString(BytesInMb, 0, BytesInMb.length);
|
|
43
|
+
result = Encoding.Unicode.GetBytes(UnicodeString);
|
|
44
|
+
}
|
|
45
|
+
catch (Exception) {
|
|
46
|
+
result = null;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
static UnicodeToMb(BytesInUnicode) {
|
|
51
|
+
let result = null;
|
|
52
|
+
try {
|
|
53
|
+
let UnicodeString = Encoding.Unicode.GetString(BytesInUnicode, 0, BytesInUnicode.length);
|
|
54
|
+
result = GuiEnvironment.Environment.GetEncoding().GetBytes(UnicodeString);
|
|
55
|
+
}
|
|
56
|
+
catch (Exception) {
|
|
57
|
+
result = null;
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
static getString(blob) {
|
|
62
|
+
let result = null;
|
|
63
|
+
let bytes = null;
|
|
64
|
+
if (BlobType.isValidBlob(blob)) {
|
|
65
|
+
let contentType = BlobType.getContentType(blob);
|
|
66
|
+
if (contentType !== BlobType.CONTENT_TYPE_UNICODE)
|
|
67
|
+
contentType = BlobType.CONTENT_TYPE_ANSI;
|
|
68
|
+
try {
|
|
69
|
+
bytes = BlobType.getBytes(blob);
|
|
70
|
+
let encoding = BlobType.getEncodingFromContentType(contentType);
|
|
71
|
+
result = encoding.GetString(bytes, 0, bytes.length);
|
|
72
|
+
let index = result.indexOf('\0');
|
|
73
|
+
if (index !== -1)
|
|
74
|
+
result = result.substr(0, index);
|
|
75
|
+
}
|
|
76
|
+
catch (Exception) {
|
|
77
|
+
result = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
Debug.Assert(false);
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
static createFromString(blobStr, contentType) {
|
|
85
|
+
let blob = null;
|
|
86
|
+
let srcContentType = contentType;
|
|
87
|
+
let bytes = null;
|
|
88
|
+
if (contentType !== BlobType.CONTENT_TYPE_UNICODE)
|
|
89
|
+
srcContentType = BlobType.CONTENT_TYPE_ANSI;
|
|
90
|
+
try {
|
|
91
|
+
if (blobStr.constructor === ArrayBuffer) {
|
|
92
|
+
bytes = new Uint8Array(blobStr);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
let encoding = BlobType.getEncodingFromContentType(srcContentType);
|
|
96
|
+
bytes = encoding.GetBytes(blobStr);
|
|
97
|
+
}
|
|
98
|
+
blob = BlobType.createFromBytes(bytes, contentType);
|
|
99
|
+
}
|
|
100
|
+
catch (Exception) {
|
|
101
|
+
blob = null;
|
|
102
|
+
}
|
|
103
|
+
return blob;
|
|
104
|
+
}
|
|
105
|
+
static getBytes(str) {
|
|
106
|
+
let bytes = null;
|
|
107
|
+
let data = BlobType.removeBlobPrefix(str);
|
|
108
|
+
try {
|
|
109
|
+
let encoding = ISO_8859_1_Encoding.ISO_8859_1;
|
|
110
|
+
bytes = encoding.GetBytes(data);
|
|
111
|
+
}
|
|
112
|
+
catch (Exception) {
|
|
113
|
+
bytes = null;
|
|
114
|
+
}
|
|
115
|
+
return bytes;
|
|
116
|
+
}
|
|
117
|
+
static createFromBytes(bytes, contentType) {
|
|
118
|
+
let blobStr = '';
|
|
119
|
+
let blobPrefix;
|
|
120
|
+
let blobData;
|
|
121
|
+
blobPrefix = BlobType.getBlobPrefixForContentType(contentType);
|
|
122
|
+
try {
|
|
123
|
+
let encoding = ISO_8859_1_Encoding.ISO_8859_1;
|
|
124
|
+
blobData = encoding.GetString(bytes, 0, bytes.length);
|
|
125
|
+
}
|
|
126
|
+
catch (Exception) {
|
|
127
|
+
blobData = null;
|
|
128
|
+
}
|
|
129
|
+
blobStr = blobPrefix + blobData;
|
|
130
|
+
return blobStr;
|
|
131
|
+
}
|
|
132
|
+
static copyBlob(dest, src) {
|
|
133
|
+
let srcBytes;
|
|
134
|
+
let destBytes;
|
|
135
|
+
if (src === null)
|
|
136
|
+
return null;
|
|
137
|
+
else if (dest === null)
|
|
138
|
+
return src;
|
|
139
|
+
srcBytes = BlobType.getBytes(src);
|
|
140
|
+
let destContentType = BlobType.getContentType(dest);
|
|
141
|
+
let srcContentType = BlobType.getContentType(src);
|
|
142
|
+
if (srcContentType === BlobType.CONTENT_TYPE_ANSI && destContentType === BlobType.CONTENT_TYPE_UNICODE)
|
|
143
|
+
destBytes = BlobType.MbToUnicode(srcBytes);
|
|
144
|
+
else if (srcContentType === BlobType.CONTENT_TYPE_UNICODE && destContentType === BlobType.CONTENT_TYPE_ANSI)
|
|
145
|
+
destBytes = BlobType.UnicodeToMb(srcBytes);
|
|
146
|
+
else
|
|
147
|
+
destBytes = srcBytes;
|
|
148
|
+
dest = BlobType.createFromBytes(destBytes, destContentType);
|
|
149
|
+
return dest;
|
|
150
|
+
}
|
|
151
|
+
static removeBlobPrefix(source) {
|
|
152
|
+
let idx;
|
|
153
|
+
if (source !== null) {
|
|
154
|
+
idx = source.indexOf(';');
|
|
155
|
+
if (idx < 0)
|
|
156
|
+
Logger.Instance.WriteToLog("Error: invalid blob prefix", true);
|
|
157
|
+
return source.substr(idx + 1);
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
static isValidBlob(blob) {
|
|
163
|
+
let isValid = true;
|
|
164
|
+
if (blob === null || blob.indexOf(';') < 0)
|
|
165
|
+
isValid = false;
|
|
166
|
+
if (isValid) {
|
|
167
|
+
let contentType = BlobType.getContentType(blob);
|
|
168
|
+
if (contentType !== BlobType.CONTENT_TYPE_ANSI && contentType !== BlobType.CONTENT_TYPE_BINARY && contentType !== BlobType.CONTENT_TYPE_UNICODE && contentType !== BlobType.CONTENT_TYPE_UNKNOWN)
|
|
169
|
+
isValid = false;
|
|
170
|
+
}
|
|
171
|
+
return isValid;
|
|
172
|
+
}
|
|
173
|
+
static setContentType(str, contentType) {
|
|
174
|
+
let result = "";
|
|
175
|
+
try {
|
|
176
|
+
let prefixLastIndex = str.indexOf(";");
|
|
177
|
+
let prefix = str.substr(0, prefixLastIndex);
|
|
178
|
+
let dataLength = str.length - (prefix.length + 1);
|
|
179
|
+
let data = str.substr(prefixLastIndex + 1, dataLength);
|
|
180
|
+
let prefixTokens = StrUtil.tokenize(prefix, /,|;/);
|
|
181
|
+
for (let i = 0; i < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; i = i + 1) {
|
|
182
|
+
if (i === 4)
|
|
183
|
+
result = result + contentType + ",";
|
|
184
|
+
else
|
|
185
|
+
result = result + prefixTokens[i] + ",";
|
|
186
|
+
}
|
|
187
|
+
return result.substr(0, result.length - 1) + ";" + data;
|
|
188
|
+
}
|
|
189
|
+
catch (Exception) {
|
|
190
|
+
throw new ApplicationException(" in BlobType.setContentType : invalid format");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
static SetVecCellAttr(str, vecCellAttr) {
|
|
194
|
+
let result = "";
|
|
195
|
+
try {
|
|
196
|
+
let prefixLastIndex = str.indexOf(";");
|
|
197
|
+
let prefix = str.substr(0, prefixLastIndex);
|
|
198
|
+
let data = str.substr(prefixLastIndex + 1);
|
|
199
|
+
let tokens = StrUtil.tokenize(prefix, /,|;/);
|
|
200
|
+
for (let i = 0; i < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; i = i + 1) {
|
|
201
|
+
if (i === 3)
|
|
202
|
+
result = result + vecCellAttr + ",";
|
|
203
|
+
else
|
|
204
|
+
result = result + tokens[i] + ",";
|
|
205
|
+
}
|
|
206
|
+
return result.substr(0, result.length - 1) + ";" + data;
|
|
207
|
+
}
|
|
208
|
+
catch (Exception) {
|
|
209
|
+
throw new ApplicationException(" in XMLparser.blobPrefixLength invalid format");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
static GetVecCellAttr(blobStr) {
|
|
213
|
+
try {
|
|
214
|
+
let tokens = StrUtil.tokenize(blobStr, /,|;/);
|
|
215
|
+
return tokens[3].charAt(0);
|
|
216
|
+
}
|
|
217
|
+
catch (Exception) {
|
|
218
|
+
throw new ApplicationException(" in BlobType.GetVecCellAttr(): blob is in invalid format");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
static blobPrefixLength(blob) {
|
|
222
|
+
try {
|
|
223
|
+
let prefixLength = blob.indexOf(';') + 1;
|
|
224
|
+
let prefix = blob.substr(0, prefixLength);
|
|
225
|
+
if (prefixLength > 0) {
|
|
226
|
+
let tokens = StrUtil.tokenize(prefix, ",");
|
|
227
|
+
if (tokens.length === GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT)
|
|
228
|
+
return prefixLength;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (Exception) {
|
|
232
|
+
}
|
|
233
|
+
throw new ApplicationException(" in XMLparser.blobPrefixLength invalid format");
|
|
234
|
+
}
|
|
235
|
+
static getKey(blobStr) {
|
|
236
|
+
let tokens = StrUtil.tokenize(blobStr, /,|;/);
|
|
237
|
+
let key = 0;
|
|
238
|
+
if (tokens.length > 5) {
|
|
239
|
+
try {
|
|
240
|
+
key = NNumber.Parse(tokens[0]);
|
|
241
|
+
}
|
|
242
|
+
catch (Exception) {
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return key;
|
|
246
|
+
}
|
|
247
|
+
static getBlobSize(blob) {
|
|
248
|
+
let size = 0;
|
|
249
|
+
try {
|
|
250
|
+
let tokens = StrUtil.tokenize(blob, /,|;/);
|
|
251
|
+
if (tokens.length > 5) {
|
|
252
|
+
size = blob.length;
|
|
253
|
+
for (let i = 0; i < 5; i = i + 1) {
|
|
254
|
+
size = size - tokens[i].length;
|
|
255
|
+
size = size - 1;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (Exception) {
|
|
260
|
+
}
|
|
261
|
+
return size;
|
|
262
|
+
}
|
|
263
|
+
static ParseContentType(contentType) {
|
|
264
|
+
let newContentType = ' ';
|
|
265
|
+
switch (contentType) {
|
|
266
|
+
case 0:
|
|
267
|
+
newContentType = BlobType.CONTENT_TYPE_UNKNOWN;
|
|
268
|
+
break;
|
|
269
|
+
case 1:
|
|
270
|
+
newContentType = BlobType.CONTENT_TYPE_ANSI;
|
|
271
|
+
break;
|
|
272
|
+
case 2:
|
|
273
|
+
newContentType = BlobType.CONTENT_TYPE_UNICODE;
|
|
274
|
+
break;
|
|
275
|
+
case 3:
|
|
276
|
+
newContentType = BlobType.CONTENT_TYPE_BINARY;
|
|
277
|
+
}
|
|
278
|
+
return newContentType;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvYlR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9CbG9iVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFvQixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sUUFBUTtJQUNuQixNQUFNLENBQUMsb0JBQW9CLEdBQVcsR0FBRyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBVyxHQUFHLENBQUM7SUFDdkMsTUFBTSxDQUFDLG9CQUFvQixHQUFXLEdBQUcsQ0FBQztJQUMxQyxNQUFNLENBQUMsbUJBQW1CLEdBQVcsR0FBRyxDQUFDO0lBT3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWTtRQUNoQyxJQUFJLENBQUM7WUFDSCxJQUFJLE1BQU0sR0FBYSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sU0FBUyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDMUYsQ0FBQztJQUNILENBQUM7SUFPRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsV0FBbUI7UUFDM0MsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFD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TUFBTSxDQUFDO29CQUMvQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQW1CO1FBQ3pDLElBQUksY0FBYyxHQUFXLEdBQUcsQ0FBQztRQUNqQyxRQUFRLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQztnQkFDSixjQUFjLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2dCQUMvQyxNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLGNBQWMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzVDLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osY0FBYyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixjQUFjLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2VyLCBTdG9yYWdlQXR0cmlidXRlLCBTdHJVdGlsIH0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBEZWJ1ZywgRW5jb2RpbmcsIElTT184ODU5XzFfRW5jb2RpbmcsIE5OdW1iZXIsIE5TdHJpbmcgfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7IEd1aUNvbnN0YW50cyB9IGZyb20gJy4uLy4uL0d1aUNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJsb2JUeXBlIHtcclxuICBzdGF0aWMgQ09OVEVOVF9UWVBFX1VOS05PV046IHN0cmluZyA9ICcwJztcclxuICBzdGF0aWMgQ09OVEVOVF9UWVBFX0FOU0k6IHN0cmluZyA9ICcxJztcclxuICBzdGF0aWMgQ09OVEVOVF9UWVBFX1VOSUNPREU6IHN0cmluZyA9ICcyJztcclxuICBzdGF0aWMgQ09OVEVOVF9UWVBFX0JJTkFSWTogc3RyaW5nID0gJzMnO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgYmxvYjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldENvbnRlbnRUeXBlKGJsb2I6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoYmxvYiwgLyx8Oy8pO1xyXG4gICAgICByZXR1cm4gdG9rZW5zWzRdLmNoYXJBdCgwKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiIGluIEJsb2JUeXBlLmdldENvbnRlbnRUeXBlIGJsb2IgaXMgaW4gaW52YWxpZCBmb3JtYXRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENyZWF0ZXMgYW4gZW1wdHkgYmxvYiBwcmVmaXggd2l0aCBhIGdpdmVuIGNlbGwgYXR0cmlidXRlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZlY0NlbGxBdHRyXCI+aW4gY2FzZSB0aGlzIGJsb2IgaXMgdmVjdG9yIHRoZSBjZWxscyB0eXBlIGVsc2UgMFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYW4gZW1wdHkgYmxvYiBwcmVmaXggd2l0aG91dCB0aGUgJztcIiBhdCB0aGUgZW5kXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0RW1wdHlCbG9iUHJlZml4KHZlY0NlbGxBdHRyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiMCwwLHswfSx7MX0sMFwiLCAnXFwwJywgdmVjQ2VsbEF0dHIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0QmxvYlByZWZpeEZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiMCwwLHswfSx7MH0sezF9O1wiLCAnXFwwJywgY29udGVudFR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIHRoZSBoZWFkZXIgb25seTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0UHJlZml4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBpZHg6IG51bWJlciA9IHN0ci5pbmRleE9mKCc7JykvKic7JyovO1xyXG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgaWR4ICsgMSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJDb250ZW50VHlwZVwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRFbmNvZGluZ0Zyb21Db250ZW50VHlwZShDb250ZW50VHlwZTogc3RyaW5nKTogRW5jb2Rpbmcge1xyXG4gICAgbGV0IGVuY29kaW5nOiBFbmNvZGluZztcclxuXHJcbiAgICBpZiAoQ29udGVudFR5cGUgPT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFKVxyXG4gICAgICBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7XHJcbiAgICBlbHNlIGlmIChDb250ZW50VHlwZSA9PT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0kpXHJcbiAgICAgIGVuY29kaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKTtcclxuICAgIGVsc2VcclxuICAgICAgZW5jb2RpbmcgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzE7XHJcblxyXG4gICAgcmV0dXJuIGVuY29kaW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuc2kgYnl0ZXMgdG8gdW5pY29kZSBieXRlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkJ5dGVzSW5NYlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBNYlRvVW5pY29kZShCeXRlc0luTWI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICAgIGxldCByZXN1bHQ6IFVpbnQ4QXJyYXkgPSBudWxsO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBVbmljb2RlU3RyaW5nOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldFN0cmluZyhCeXRlc0luTWIsIDAsIEJ5dGVzSW5NYi5sZW5ndGgpO1xyXG4gICAgICByZXN1bHQgPSBFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKFVuaWNvZGVTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IFRoaXMgZnVuY3Rpb24gY29udmVydHMgdW5pY29kZSBieXRlcyB0byBhbnNpIGJ5dGVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQnl0ZXNJblVuaWNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVW5pY29kZVRvTWIoQnl0ZXNJblVuaWNvZGU6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcclxuICAgIGxldCByZXN1bHQ6IFVpbnQ4QXJyYXkgPSBudWxsO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBVbmljb2RlU3RyaW5nOiBzdHJpbmcgPSBFbmNvZGluZy5Vbmljb2RlLkdldFN0cmluZyhCeXRlc0luVW5pY29kZSwgMCwgQnl0ZXNJblVuaWNvZGUubGVuZ3RoKTtcclxuXHJcbiAgICAgIHJlc3VsdCA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCkuR2V0Qnl0ZXMoVW5pY29kZVN0cmluZyk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBc3N1bWVzIHRoZSBnaXZlbiBibG9iIGNvbnRhaW5zIGEgc3RyaW5nIGFuZCByZXR1cm5zIGl0LiBJZiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBibG9iIGlzIG5vdCBVbmljb2RlXHJcbiAgLy8vIHRoZW4gYXNzdW1lIGl0IGlzIEFOU0kuXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iXCI+YSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIGJsb2JcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgY29udGFpbmVkIGJ5IHRoZSBibG9iXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0U3RyaW5nKGJsb2I6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGJ5dGVzOiBVaW50OEFycmF5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAoQmxvYlR5cGUuaXNWYWxpZEJsb2IoYmxvYikpIHtcclxuICAgICAgbGV0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZShibG9iKTtcclxuICAgICAgaWYgKGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSlcclxuICAgICAgICBjb250ZW50VHlwZSA9IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBieXRlcyA9IEJsb2JUeXBlLmdldEJ5dGVzKGJsb2IpO1xyXG5cclxuICAgICAgICBsZXQgZW5jb2Rpbmc6IEVuY29kaW5nID0gQmxvYlR5cGUuZ2V0RW5jb2RpbmdGcm9tQ29udGVudFR5cGUoY29udGVudFR5cGUpO1xyXG4gICAgICAgIHJlc3VsdCA9IGVuY29kaW5nLkdldFN0cmluZyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXIgPSByZXN1bHQuaW5kZXhPZignXFwwJykvKidcdTAwMDAnKi87XHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHIoMCwgaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ3JlYXRlIGEgYmxvYiBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBkaXNwbGF5IHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcoYmxvYlN0cjogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBibG9iOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHNyY0NvbnRlbnRUeXBlOiBzdHJpbmcgPSBjb250ZW50VHlwZTtcclxuICAgIGxldCBieXRlczogVWludDhBcnJheSA9IG51bGw7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSlcclxuICAgICAgc3JjQ29udGVudFR5cGUgPSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZihibG9iU3RyLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcikge1xyXG4gICAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoPEFycmF5QnVmZmVyPjxhbnk+YmxvYlN0cik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGVuY29kaW5nOiBFbmNvZGluZyA9IEJsb2JUeXBlLmdldEVuY29kaW5nRnJvbUNvbnRlbnRUeXBlKHNyY0NvbnRlbnRUeXBlKTtcclxuXHJcbiAgICAgICAgYnl0ZXMgPSBlbmNvZGluZy5HZXRCeXRlcyhibG9iU3RyKTtcclxuICAgICAgfVxyXG4gICAgICBibG9iID0gQmxvYlR5cGUuY3JlYXRlRnJvbUJ5dGVzKGJ5dGVzLCBjb250ZW50VHlwZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIGJsb2IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBibG9iO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBHZXQgYmxvYiBjb250ZW50cyBhcyBieXRlIGFycmF5XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iXCI+Y29udGVudHMgaW5jbHVkaW5nIGJsb2IgcHJlZml4XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBieXRlIGFycmF5IGFjY29yZGluZyB0byBjb250ZW50IHR5cGUgaW4gYmxvYiBwcmVmaXhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRCeXRlcyhzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xyXG4gICAgbGV0IGJ5dGVzOiBVaW50OEFycmF5ID0gbnVsbDtcclxuICAgIGxldCBkYXRhOiBzdHJpbmcgPSBCbG9iVHlwZS5yZW1vdmVCbG9iUHJlZml4KHN0cik7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGVuY29kaW5nOiBFbmNvZGluZyA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMTtcclxuICAgICAgYnl0ZXMgPSBlbmNvZGluZy5HZXRCeXRlcyhkYXRhKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgYnl0ZXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBieXRlcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ3JlYXRlIGEgYmxvYiBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBieXRlIGFycmF5XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJCeXRlc1wiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBjcmVhdGVGcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXksIGNvbnRlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJsb2JTdHIgPSAnJztcclxuICAgIGxldCBibG9iUHJlZml4OiBzdHJpbmc7XHJcbiAgICBsZXQgYmxvYkRhdGE6IHN0cmluZztcclxuXHJcbiAgICBibG9iUHJlZml4ID0gQmxvYlR5cGUuZ2V0QmxvYlByZWZpeEZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZW5jb2Rpbmc6IElTT184ODU5XzFfRW5jb2RpbmcgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzE7XHJcbiAgICAgIGJsb2JEYXRhID0gZW5jb2RpbmcuR2V0U3RyaW5nKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICBibG9iRGF0YSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYmxvYlN0ciA9IGJsb2JQcmVmaXggKyBibG9iRGF0YTtcclxuXHJcbiAgICByZXR1cm4gYmxvYlN0cjtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRlc3RcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzcmNcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgY29weUJsb2IoZGVzdDogc3RyaW5nLCBzcmM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3JjQnl0ZXM6IFVpbnQ4QXJyYXk7XHJcbiAgICBsZXQgZGVzdEJ5dGVzOiBVaW50OEFycmF5O1xyXG5cclxuICAgIGlmIChzcmMgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgZWxzZSBpZiAoZGVzdCA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIHNyYztcclxuXHJcbiAgICBzcmNCeXRlcyA9IEJsb2JUeXBlLmdldEJ5dGVzKHNyYyk7XHJcblxyXG4gICAgbGV0IGRlc3RDb250ZW50VHlwZTogc3RyaW5nID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoZGVzdCk7XHJcbiAgICBsZXQgc3JjQ29udGVudFR5cGU6IHN0cmluZyA9IEJsb2JUeXBlLmdldENvbnRlbnRUeXBlKHNyYyk7XHJcblxyXG4gICAgaWYgKHNyY0NvbnRlbnRUeXBlID09PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSSAmJiBkZXN0Q29udGVudFR5cGUgPT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFKVxyXG4gICAgICBkZXN0Qnl0ZXMgPSBCbG9iVHlwZS5NYlRvVW5pY29kZShzcmNCeXRlcyk7XHJcbiAgICBlbHNlIGlmIChzcmNDb250ZW50VHlwZSA9PT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREUgJiYgZGVzdENvbnRlbnRUeXBlID09PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSSlcclxuICAgICAgZGVzdEJ5dGVzID0gQmxvYlR5cGUuVW5pY29kZVRvTWIoc3JjQnl0ZXMpO1xyXG4gICAgZWxzZVxyXG4gICAgICBkZXN0Qnl0ZXMgPSBzcmNCeXRlcztcclxuXHJcbiAgICBkZXN0ID0gQmxvYlR5cGUuY3JlYXRlRnJvbUJ5dGVzKGRlc3RCeXRlcywgZGVzdENvbnRlbnRUeXBlKTtcclxuXHJcbiAgICByZXR1cm4gZGVzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmVtb3ZlcyBibG9iIHByZWZpeCBmcm9tIHNvdXJjZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzb3VyY2VcIj4tIGJsb2IgdmFsdWVcclxuICAvLy9cclxuICAvLy9cclxuICAvLy8gPC9wYXJhbT5cclxuICBzdGF0aWMgcmVtb3ZlQmxvYlByZWZpeChzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgaWR4OiBudW1iZXI7XHJcbiAgICBpZiAoc291cmNlICE9PSBudWxsKSB7XHJcbiAgICAgIGlkeCA9IHNvdXJjZS5pbmRleE9mKCc7Jyk7XHJcbiAgICAgIGlmIChpZHggPCAwKVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCJFcnJvcjogaW52YWxpZCBibG9iIHByZWZpeFwiLCB0cnVlKTtcclxuICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzdHIoaWR4ICsgMSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBjaGVja3MgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGJsb2I8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGUgYmxvYiBpcyB2YWxpZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGlzVmFsaWRCbG9iKGJsb2I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmIChibG9iID09PSBudWxsIHx8IGJsb2IuaW5kZXhPZignOycpIDwgMClcclxuICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoYmxvYik7XHJcbiAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0kgJiYgY29udGVudFR5cGUgIT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9CSU5BUlkgJiYgY29udGVudFR5cGUgIT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFICYmIGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTilcclxuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNWYWxpZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRDb250ZW50VHlwZShzdHI6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBwcmVmaXhMYXN0SW5kZXg6IG51bWJlciA9IHN0ci5pbmRleE9mKFwiO1wiKTtcclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gc3RyLnN1YnN0cigwLCBwcmVmaXhMYXN0SW5kZXgpO1xyXG5cclxuICAgICAgbGV0IGRhdGFMZW5ndGg6IG51bWJlciA9IHN0ci5sZW5ndGggLSAocHJlZml4Lmxlbmd0aCArIDEpO1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nID0gc3RyLnN1YnN0cihwcmVmaXhMYXN0SW5kZXggKyAxLCBkYXRhTGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCBwcmVmaXhUb2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShwcmVmaXgsIC8sfDsvKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBHdWlDb25zdGFudHMuQkxPQl9QUkVGSVhfRUxFTUVOVFNfQ09VTlQ7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmIChpID09PSA0KVxyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgY29udGVudFR5cGUgKyBcIixcIjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwcmVmaXhUb2tlbnNbaV0gKyBcIixcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSkgKyBcIjtcIiArIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIiBpbiBCbG9iVHlwZS5zZXRDb250ZW50VHlwZSA6IGludmFsaWQgZm9ybWF0XCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZXBsYWNlIHRoZSB2ZWN0b3IncyBjZWxsIGF0dHJpYnV0ZSBpbiB0aGUgYmxvYiBwcmVmaXggYnkgdGhlIHNwZWNpZmllZCBvbmU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyXCI+YSB2YWxpZCBibG9iIHN0cmluZyAoaS5lLiBwcmVmaXg7ZGF0YSkgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2ZWNDZWxsQXR0clwiPmF0dHJpYnV0ZSB0byBpbnNlcnQgaW50byB0aGUgcHJlZml4IDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBtb2RpZmllZCBibG9iIHN0cmluZyA8L3JldHVybnM+XHJcbiAgc3RhdGljIFNldFZlY0NlbGxBdHRyKHN0cjogc3RyaW5nLCB2ZWNDZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHByZWZpeExhc3RJbmRleDogbnVtYmVyID0gc3RyLmluZGV4T2YoXCI7XCIpO1xyXG4gICAgICBsZXQgcHJlZml4OiBzdHJpbmcgPSBzdHIuc3Vic3RyKDAsIHByZWZpeExhc3RJbmRleCk7XHJcblxyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nID0gc3RyLnN1YnN0cihwcmVmaXhMYXN0SW5kZXggKyAxKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShwcmVmaXgsIC8sfDsvKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBHdWlDb25zdGFudHMuQkxPQl9QUkVGSVhfRUxFTUVOVFNfQ09VTlQ7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmIChpID09PSAzKVxyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgPHN0cmluZz52ZWNDZWxsQXR0ciArIFwiLFwiO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHRva2Vuc1tpXSArIFwiLFwiO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyKDAsIHJlc3VsdC5sZW5ndGggLSAxKSArIFwiO1wiICsgZGF0YTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiIGluIFhNTHBhcnNlci5ibG9iUHJlZml4TGVuZ3RoIGludmFsaWQgZm9ybWF0XCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBSZXR1cm5zIHRoZSBWZWN0b3InIGNlbGwgYXR0cmlidXRlIGZyb20gdGhlIHByZWZpeC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJsb2JTdHJcIj5BIHZhbGlkIGJsb2Igc3RyaW5nICAoaS5lLiBwcmVmaXg7ZGF0YSkgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRWZWNDZWxsQXR0cihibG9iU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2JTdHIsIC8sfDsvKTtcclxuXHJcbiAgICAgIHJldHVybiB0b2tlbnNbM10uY2hhckF0KDApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCIgaW4gQmxvYlR5cGUuR2V0VmVjQ2VsbEF0dHIoKTogYmxvYiBpcyBpbiBpbnZhbGlkIGZvcm1hdFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGJsb2IgcHJlZml4LiBUaGUgcHJlZml4IGlzIGluIHRoZSBmb3JtYXQ6XHJcbiAgLy8vIDx0dD5cIk9iakhhbmRsZSxWYXJpYW50SWR4LENvbnRlbnRUeXBlLFZlY0NlbGxBdHRyO1wiPC90dD4uIFRoZSBsZW5ndGggaW5jbHVkZXMgdGhlIGNvbW1hcyBhbmQgdGhlXHJcbiAgLy8vIHNlbWljb2xvbi5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJsb2JcIj5hIHZhbGlkIGJsb2JcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBibG9iIHByZWZpeCBsZW5ndGhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBibG9iUHJlZml4TGVuZ3RoKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgcHJlZml4TGVuZ3RoOiBudW1iZXIgPSBibG9iLmluZGV4T2YoJzsnKSArIDE7XHJcbiAgICAgIGxldCBwcmVmaXg6IHN0cmluZyA9IGJsb2Iuc3Vic3RyKDAsIHByZWZpeExlbmd0aCk7XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgcHJlZml4IGlzIHZhbGlkXHJcbiAgICAgIGlmIChwcmVmaXhMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHByZWZpeCwgXCIsXCIpO1xyXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBHdWlDb25zdGFudHMuQkxPQl9QUkVGSVhfRUxFTUVOVFNfQ09VTlQpXHJcbiAgICAgICAgICByZXR1cm4gcHJlZml4TGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIC8vIGludmFsaWQgcHJlZml4XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiIGluIFhNTHBhcnNlci5ibG9iUHJlZml4TGVuZ3RoIGludmFsaWQgZm9ybWF0XCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXRzIHRoZSBrZXkgZnJvbSBhIGJsb2Igc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRLZXkoYmxvYlN0cjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iU3RyLCAvLHw7Lyk7XHJcbiAgICBsZXQga2V5OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gNSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGtleSA9IE5OdW1iZXIuUGFyc2UodG9rZW5zWzBdKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ga2V5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBjYWxjdWxhdGVzIHRoZSBibG9iIHNpemUgaGVsZCBpbiB0aGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iXCI+IFRoZSBzdHJpbmcgaG9sZGluZyB0aGUgYmxvYiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGdldEJsb2JTaXplKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoYmxvYiwgLyx8Oy8pO1xyXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDUpIHtcclxuICAgICAgICBzaXplID0gYmxvYi5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IDU7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgc2l6ZSA9IHNpemUgLSB0b2tlbnNbaV0ubGVuZ3RoO1xyXG4gICAgICAgICAgc2l6ZSA9IHNpemUgLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzaXplO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBQYXJzZSBjb250ZW50IHR5cGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQYXJzZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IG5ld0NvbnRlbnRUeXBlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBuZXdDb250ZW50VHlwZSA9IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgbmV3Q29udGVudFR5cGUgPSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIG5ld0NvbnRlbnRUeXBlID0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICBuZXdDb250ZW50VHlwZSA9IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9CSU5BUlk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3Q29udGVudFR5cGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|