@sapui5/sap.fe.base 1.126.1 → 1.127.0
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/package.json +1 -1
- package/src/sap/fe/base/.library +1 -1
- package/src/sap/fe/base/BindingToolkit.js +11 -4
- package/src/sap/fe/base/BindingToolkit.ts +8 -3
- package/src/sap/fe/base/ClassSupport.js +14 -16
- package/src/sap/fe/base/ClassSupport.ts +16 -24
- package/src/sap/fe/base/HookSupport.js +154 -0
- package/src/sap/fe/base/HookSupport.ts +186 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +14 -6
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +11 -7
- package/src/sap/fe/base/library.js +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define([], function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
// Use two arrays as we cannot index a map through an arbitrary object instance
|
|
10
|
+
const registeredInstances = [];
|
|
11
|
+
const registeredHandlers = [];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
|
|
15
|
+
*
|
|
16
|
+
* @param execution
|
|
17
|
+
* @returns A method decorator
|
|
18
|
+
*/
|
|
19
|
+
function hookable(execution) {
|
|
20
|
+
return function (target, propertyKey, descriptor) {
|
|
21
|
+
const indexableTarget = target;
|
|
22
|
+
indexableTarget[`attach${propertyKey.toString()}`] = function (fn) {
|
|
23
|
+
const cExTInstanceHookMap = this;
|
|
24
|
+
if (!cExTInstanceHookMap.hookedHandlers) {
|
|
25
|
+
cExTInstanceHookMap.hookedHandlers = {};
|
|
26
|
+
}
|
|
27
|
+
if (!cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) {
|
|
28
|
+
cExTInstanceHookMap.hookedHandlers[propertyKey.toString()] = [];
|
|
29
|
+
}
|
|
30
|
+
cExTInstanceHookMap.hookedHandlers[propertyKey.toString()].push(fn);
|
|
31
|
+
};
|
|
32
|
+
indexableTarget[`detach${propertyKey.toString()}`] = function (fn) {
|
|
33
|
+
const cExTInstanceHookMap = this;
|
|
34
|
+
const handlers = cExTInstanceHookMap.hookedHandlers[propertyKey.toString()];
|
|
35
|
+
const index = handlers.indexOf(fn);
|
|
36
|
+
if (index !== -1) {
|
|
37
|
+
handlers.splice(index, 1);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const oldValue = descriptor.value;
|
|
41
|
+
if (execution === "BeforeAsync" || execution === "AfterAsync") {
|
|
42
|
+
descriptor.value = async function () {
|
|
43
|
+
const cExTInstanceHookMap = this;
|
|
44
|
+
const handlers = (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers) && (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) || [];
|
|
45
|
+
let returnValue;
|
|
46
|
+
if (execution === "AfterAsync") {
|
|
47
|
+
returnValue = await oldValue.bind(this)(...arguments);
|
|
48
|
+
}
|
|
49
|
+
for (const handler of handlers) {
|
|
50
|
+
await handler.bind(this)(...arguments);
|
|
51
|
+
}
|
|
52
|
+
if (execution === "BeforeAsync") {
|
|
53
|
+
returnValue = await oldValue.bind(this)(...arguments);
|
|
54
|
+
}
|
|
55
|
+
return returnValue;
|
|
56
|
+
};
|
|
57
|
+
} else {
|
|
58
|
+
descriptor.value = function () {
|
|
59
|
+
const cExTInstanceHookMap = this;
|
|
60
|
+
const handlers = (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers) && (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) || [];
|
|
61
|
+
let returnValue;
|
|
62
|
+
if (execution === "After") {
|
|
63
|
+
returnValue = oldValue.bind(this)(...arguments);
|
|
64
|
+
}
|
|
65
|
+
for (const handler of handlers) {
|
|
66
|
+
handler.bind(this)(...arguments);
|
|
67
|
+
}
|
|
68
|
+
if (execution === "Before") {
|
|
69
|
+
returnValue = oldValue.bind(this)(...arguments);
|
|
70
|
+
}
|
|
71
|
+
return returnValue;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Checks whether a newRegistration is already included in some existingRegistrations by comparing all relevant attributes.
|
|
79
|
+
*
|
|
80
|
+
* @param existingRegistrations
|
|
81
|
+
* @param newRegistration
|
|
82
|
+
* @returns Result of the check
|
|
83
|
+
*/
|
|
84
|
+
_exports.hookable = hookable;
|
|
85
|
+
function isAlreadyRegistered(existingRegistrations, newRegistration) {
|
|
86
|
+
return !!existingRegistrations.find(r => r.name === newRegistration.name && r.method === newRegistration.method && r.targetMethod === newRegistration.targetMethod);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Registers a method as controller extension hook handler.
|
|
91
|
+
*
|
|
92
|
+
* Currently, only methods of runtime building blocks are supported.
|
|
93
|
+
*
|
|
94
|
+
* @param name Controller extension to hook into
|
|
95
|
+
* @param method Method to hook into
|
|
96
|
+
* @returns A method decorator
|
|
97
|
+
*/
|
|
98
|
+
function controllerExtensionHandler(name, method) {
|
|
99
|
+
return function (target, propertyKey) {
|
|
100
|
+
const newRegistration = {
|
|
101
|
+
name,
|
|
102
|
+
method: String(method),
|
|
103
|
+
targetMethod: propertyKey
|
|
104
|
+
};
|
|
105
|
+
const index = registeredInstances.indexOf(target.constructor);
|
|
106
|
+
|
|
107
|
+
// We need to check if this exact handler is already registered as handlers are registered statically (on the constructor)
|
|
108
|
+
if (index !== -1 && !isAlreadyRegistered(registeredHandlers[index], newRegistration)) {
|
|
109
|
+
registeredHandlers[index].push(newRegistration);
|
|
110
|
+
} else {
|
|
111
|
+
registeredInstances.push(target.constructor);
|
|
112
|
+
registeredHandlers.push([newRegistration]);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Initializes all controller extension handlers registered for a given target.
|
|
119
|
+
*
|
|
120
|
+
* @param target Target class to initialize the handlers for
|
|
121
|
+
* @param target.constructor
|
|
122
|
+
* @param controller PageController instance to get the controller extensions instances from
|
|
123
|
+
*/
|
|
124
|
+
_exports.controllerExtensionHandler = controllerExtensionHandler;
|
|
125
|
+
function initControllerExtensionHookHandlers(target, controller) {
|
|
126
|
+
const index = registeredInstances.indexOf(target.constructor);
|
|
127
|
+
if (index !== -1) {
|
|
128
|
+
const indexableController = controller;
|
|
129
|
+
const indexableTarget = target;
|
|
130
|
+
for (const registeredHandler of registeredHandlers[index]) {
|
|
131
|
+
var _controller$getView;
|
|
132
|
+
const handlerFunction = indexableTarget[registeredHandler.targetMethod].bind(target);
|
|
133
|
+
indexableController[registeredHandler.name][`attach${String(registeredHandler.method)}`](handlerFunction);
|
|
134
|
+
(_controller$getView = controller.getView()) === null || _controller$getView === void 0 ? void 0 : _controller$getView.attachBeforeExit(() => {
|
|
135
|
+
indexableController[registeredHandler.name][`detach${String(registeredHandler.method)}`](handlerFunction);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
_exports.initControllerExtensionHookHandlers = initControllerExtensionHookHandlers;
|
|
141
|
+
function xmlViewPreprocessor(source, _caller, _settings) {
|
|
142
|
+
const sourceView = source;
|
|
143
|
+
const controller = sourceView.getController();
|
|
144
|
+
if (controller) {
|
|
145
|
+
const macroAPIChild = sourceView.findAggregatedObjects(true, s => s.isA("sap.fe.macros.MacroAPI"));
|
|
146
|
+
for (const managedObject of macroAPIChild) {
|
|
147
|
+
initControllerExtensionHookHandlers(managedObject, controller);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
_exports.xmlViewPreprocessor = xmlViewPreprocessor;
|
|
152
|
+
return _exports;
|
|
153
|
+
}, false);
|
|
154
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJ0b1N0cmluZyIsImZuIiwiY0V4VEluc3RhbmNlSG9va01hcCIsImhvb2tlZEhhbmRsZXJzIiwicHVzaCIsImhhbmRsZXJzIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiYmluZCIsImhhbmRsZXIiLCJpc0FscmVhZHlSZWdpc3RlcmVkIiwiZXhpc3RpbmdSZWdpc3RyYXRpb25zIiwibmV3UmVnaXN0cmF0aW9uIiwiZmluZCIsInIiLCJuYW1lIiwibWV0aG9kIiwidGFyZ2V0TWV0aG9kIiwiY29udHJvbGxlckV4dGVuc2lvbkhhbmRsZXIiLCJTdHJpbmciLCJjb25zdHJ1Y3RvciIsImluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzIiwiY29udHJvbGxlciIsImluZGV4YWJsZUNvbnRyb2xsZXIiLCJyZWdpc3RlcmVkSGFuZGxlciIsImhhbmRsZXJGdW5jdGlvbiIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwieG1sVmlld1ByZXByb2Nlc3NvciIsInNvdXJjZSIsIl9jYWxsZXIiLCJfc2V0dGluZ3MiLCJzb3VyY2VWaWV3IiwiZ2V0Q29udHJvbGxlciIsIm1hY3JvQVBJQ2hpbGQiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJzIiwiaXNBIiwibWFuYWdlZE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSG9va1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuXG4vKipcbiAqIFRoaXMgdHlwZSBpcyB0byBiZSBleHRlbmRlZCB3aXRoIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbnMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgaG9va2FibGUuXG4gKi9cbnR5cGUgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucyA9IHtcblx0ZWRpdEZsb3c6IHtcblx0XHRvbkFmdGVyU2F2ZTogdHJ1ZTtcblx0XHRvbkJlZm9yZVNhdmU6IHRydWU7XG5cdH07XG5cdGNvbGxhYm9yYXRpb25NYW5hZ2VyOiB7XG5cdFx0Y29sbGVjdEF2YWlsYWJsZUNhcmRzOiB0cnVlO1xuXHR9O1xuXHRwYWdpbmF0b3I6IHtcblx0XHRpbml0aWFsaXplOiB0cnVlO1xuXHR9O1xuXHRyb3V0aW5nOiB7XG5cdFx0b25BZnRlckJpbmRpbmc6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xudHlwZSBIb29rTWFwID0ge1xuXHRob29rZWRIYW5kbGVyczoge1xuXHRcdFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uW107XG5cdH07XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICpcbiAqIEBwYXJhbSBleGVjdXRpb25cbiAqIEByZXR1cm5zIEEgbWV0aG9kIGRlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va2FibGUoZXhlY3V0aW9uOiBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbik6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiB1bmtub3duLCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBpbmRleGFibGVUYXJnZXQgPSB0YXJnZXQgYXMgRnVuY3Rpb25NYXA7XG5cblx0XHRpbmRleGFibGVUYXJnZXRbYGF0dGFjaCR7cHJvcGVydHlLZXkudG9TdHJpbmcoKX1gXSA9IGZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdGlmICghY0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVycykge1xuXHRcdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdFx0Y0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0Y0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdXNoKGZuKTtcblx0XHR9O1xuXHRcdGluZGV4YWJsZVRhcmdldFtgZGV0YWNoJHtwcm9wZXJ0eUtleS50b1N0cmluZygpfWBdID0gZnVuY3Rpb24gKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0Y29uc3QgaGFuZGxlcnMgPSBjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldO1xuXHRcdFx0Y29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKGZuKTtcblx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3Qgb2xkVmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXHRcdGlmIChleGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIiB8fCBleGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiKSB7XG5cdFx0XHRkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXJzID0gKGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzICYmIGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB8fCBbXTtcblx0XHRcdFx0bGV0IHJldHVyblZhbHVlOiB1bmtub3duO1xuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkFmdGVyQXN5bmNcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gYXdhaXQgb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBhd2FpdCBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XG5cdFx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdFx0Y29uc3QgaGFuZGxlcnMgPSAoY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnMgJiYgY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHx8IFtdO1xuXHRcdFx0XHRsZXQgcmV0dXJuVmFsdWU6IHVua25vd247XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQWZ0ZXJcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcblx0XHRcdFx0XHRoYW5kbGVyLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5ld1JlZ2lzdHJhdGlvbiBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHNvbWUgZXhpc3RpbmdSZWdpc3RyYXRpb25zIGJ5IGNvbXBhcmluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmdSZWdpc3RyYXRpb25zXG4gKiBAcGFyYW0gbmV3UmVnaXN0cmF0aW9uXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNoZWNrXG4gKi9cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlZ2lzdGVyZWQoZXhpc3RpbmdSZWdpc3RyYXRpb25zOiBIYW5kbGVyUmVnaXN0cmF0aW9uW10sIG5ld1JlZ2lzdHJhdGlvbjogSGFuZGxlclJlZ2lzdHJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFleGlzdGluZ1JlZ2lzdHJhdGlvbnMuZmluZChcblx0XHQocikgPT4gci5uYW1lID09PSBuZXdSZWdpc3RyYXRpb24ubmFtZSAmJiByLm1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLm1ldGhvZCAmJiByLnRhcmdldE1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLnRhcmdldE1ldGhvZFxuXHQpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG1ldGhvZCBhcyBjb250cm9sbGVyIGV4dGVuc2lvbiBob29rIGhhbmRsZXIuXG4gKlxuICogQ3VycmVudGx5LCBvbmx5IG1ldGhvZHMgb2YgcnVudGltZSBidWlsZGluZyBibG9ja3MgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBuZXdSZWdpc3RyYXRpb24gPSB7IG5hbWUsIG1ldGhvZDogU3RyaW5nKG1ldGhvZCksIHRhcmdldE1ldGhvZDogcHJvcGVydHlLZXkgfTtcblx0XHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBjbGFzcyB0byBpbml0aWFsaXplIHRoZSBoYW5kbGVycyBmb3JcbiAqIEBwYXJhbSB0YXJnZXQuY29uc3RydWN0b3JcbiAqIEBwYXJhbSBjb250cm9sbGVyIFBhZ2VDb250cm9sbGVyIGluc3RhbmNlIHRvIGdldCB0aGUgY29udHJvbGxlciBleHRlbnNpb25zIGluc3RhbmNlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpOiB2b2lkIHtcblx0Y29uc3QgaW5kZXggPSByZWdpc3RlcmVkSW5zdGFuY2VzLmluZGV4T2YodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdGNvbnN0IGluZGV4YWJsZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIHVua25vd24gYXMgRGVlcEZ1bmN0aW9uTWFwO1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyB1bmtub3duIGFzIEZ1bmN0aW9uTWFwO1xuXG5cdFx0Zm9yIChjb25zdCByZWdpc3RlcmVkSGFuZGxlciBvZiByZWdpc3RlcmVkSGFuZGxlcnNbaW5kZXhdKSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyRnVuY3Rpb24gPSBpbmRleGFibGVUYXJnZXRbcmVnaXN0ZXJlZEhhbmRsZXIudGFyZ2V0TWV0aG9kXS5iaW5kKHRhcmdldCk7XG5cblx0XHRcdGluZGV4YWJsZUNvbnRyb2xsZXJbcmVnaXN0ZXJlZEhhbmRsZXIubmFtZV1bYGF0dGFjaCR7U3RyaW5nKHJlZ2lzdGVyZWRIYW5kbGVyLm1ldGhvZCl9YF0oaGFuZGxlckZ1bmN0aW9uKTtcblx0XHRcdGNvbnRyb2xsZXIuZ2V0VmlldygpPy5hdHRhY2hCZWZvcmVFeGl0KCgpID0+IHtcblx0XHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSGFuZGxlci5uYW1lXVtgZGV0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhhbmRsZXIubWV0aG9kKX1gXShoYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB4bWxWaWV3UHJlcHJvY2Vzc29yKHNvdXJjZTogb2JqZWN0LCBfY2FsbGVyPzogdW5rbm93biwgX3NldHRpbmdzPzogb2JqZWN0KTogdm9pZCB7XG5cdGNvbnN0IHNvdXJjZVZpZXcgPSBzb3VyY2UgYXMgWE1MVmlldztcblx0Y29uc3QgY29udHJvbGxlciA9IHNvdXJjZVZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIENvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG5cdGlmIChjb250cm9sbGVyKSB7XG5cdFx0Y29uc3QgbWFjcm9BUElDaGlsZCA9IHNvdXJjZVZpZXcuZmluZEFnZ3JlZ2F0ZWRPYmplY3RzKHRydWUsIChzKSA9PiBzLmlzQShcInNhcC5mZS5tYWNyb3MuTWFjcm9BUElcIikpO1xuXHRcdGZvciAoY29uc3QgbWFuYWdlZE9iamVjdCBvZiBtYWNyb0FQSUNoaWxkKSB7XG5cdFx0XHRpbml0Q29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyhtYW5hZ2VkT2JqZWN0LCBjb250cm9sbGVyKTtcblx0XHR9XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUEwQ0E7RUFDQSxNQUFNQSxtQkFBK0IsR0FBRyxFQUFFO0VBQzFDLE1BQU1DLGtCQUEyQyxHQUFHLEVBQUU7O0VBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNDLFFBQVEsQ0FBQ0MsU0FBcUMsRUFBbUI7SUFDaEYsT0FBTyxVQUFVQyxNQUFlLEVBQUVDLFdBQTRCLEVBQUVDLFVBQThCLEVBQUU7TUFDL0YsTUFBTUMsZUFBZSxHQUFHSCxNQUFxQjtNQUU3Q0csZUFBZSxDQUFFLFNBQVFGLFdBQVcsQ0FBQ0csUUFBUSxFQUFHLEVBQUMsQ0FBQyxHQUFHLFVBQVVDLEVBQVksRUFBUTtRQUNsRixNQUFNQyxtQkFBbUIsR0FBRyxJQUEwQjtRQUN0RCxJQUFJLENBQUNBLG1CQUFtQixDQUFDQyxjQUFjLEVBQUU7VUFDeENELG1CQUFtQixDQUFDQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDO1FBQ0EsSUFBSSxDQUFDRCxtQkFBbUIsQ0FBQ0MsY0FBYyxDQUFDTixXQUFXLENBQUNHLFFBQVEsRUFBRSxDQUFDLEVBQUU7VUFDaEVFLG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQ2hFO1FBQ0FFLG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxFQUFFLENBQUMsQ0FBQ0ksSUFBSSxDQUFDSCxFQUFFLENBQUM7TUFDcEUsQ0FBQztNQUNERixlQUFlLENBQUUsU0FBUUYsV0FBVyxDQUFDRyxRQUFRLEVBQUcsRUFBQyxDQUFDLEdBQUcsVUFBVUMsRUFBWSxFQUFRO1FBQ2xGLE1BQU1DLG1CQUFtQixHQUFHLElBQTBCO1FBQ3RELE1BQU1HLFFBQVEsR0FBR0gsbUJBQW1CLENBQUNDLGNBQWMsQ0FBQ04sV0FBVyxDQUFDRyxRQUFRLEVBQUUsQ0FBQztRQUMzRSxNQUFNTSxLQUFLLEdBQUdELFFBQVEsQ0FBQ0UsT0FBTyxDQUFDTixFQUFFLENBQUM7UUFDbEMsSUFBSUssS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQ2pCRCxRQUFRLENBQUNHLE1BQU0sQ0FBQ0YsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxQjtNQUNELENBQUM7TUFFRCxNQUFNRyxRQUFRLEdBQUdYLFVBQVUsQ0FBQ1ksS0FBSztNQUNqQyxJQUFJZixTQUFTLEtBQUssYUFBYSxJQUFJQSxTQUFTLEtBQUssWUFBWSxFQUFFO1FBQzlERyxVQUFVLENBQUNZLEtBQUssR0FBRyxrQkFBc0Q7VUFDeEUsTUFBTVIsbUJBQW1CLEdBQUcsSUFBMEI7VUFDdEQsTUFBTUcsUUFBUSxHQUFJLENBQUFILG1CQUFtQixhQUFuQkEsbUJBQW1CLHVCQUFuQkEsbUJBQW1CLENBQUVDLGNBQWMsTUFBSUQsbUJBQW1CLGFBQW5CQSxtQkFBbUIsdUJBQW5CQSxtQkFBbUIsQ0FBRUMsY0FBYyxDQUFDTixXQUFXLENBQUNHLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRTtVQUMzSCxJQUFJVyxXQUFvQjtVQUN4QixJQUFJaEIsU0FBUyxLQUFLLFlBQVksRUFBRTtZQUMvQmdCLFdBQVcsR0FBRyxNQUFNRixRQUFRLENBQUNHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFPLENBQUM7VUFDakQ7VUFDQSxLQUFLLE1BQU1DLE9BQU8sSUFBSVIsUUFBUSxFQUFFO1lBQy9CLE1BQU1RLE9BQU8sQ0FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQU8sQ0FBQztVQUNsQztVQUNBLElBQUlqQixTQUFTLEtBQUssYUFBYSxFQUFFO1lBQ2hDZ0IsV0FBVyxHQUFHLE1BQU1GLFFBQVEsQ0FBQ0csSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQU8sQ0FBQztVQUNqRDtVQUNBLE9BQU9ELFdBQVc7UUFDbkIsQ0FBQztNQUNGLENBQUMsTUFBTTtRQUNOYixVQUFVLENBQUNZLEtBQUssR0FBRyxZQUF1QztVQUN6RCxNQUFNUixtQkFBbUIsR0FBRyxJQUEwQjtVQUN0RCxNQUFNRyxRQUFRLEdBQUksQ0FBQUgsbUJBQW1CLGFBQW5CQSxtQkFBbUIsdUJBQW5CQSxtQkFBbUIsQ0FBRUMsY0FBYyxNQUFJRCxtQkFBbUIsYUFBbkJBLG1CQUFtQix1QkFBbkJBLG1CQUFtQixDQUFFQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFO1VBQzNILElBQUlXLFdBQW9CO1VBQ3hCLElBQUloQixTQUFTLEtBQUssT0FBTyxFQUFFO1lBQzFCZ0IsV0FBVyxHQUFHRixRQUFRLENBQUNHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFPLENBQUM7VUFDM0M7VUFDQSxLQUFLLE1BQU1DLE9BQU8sSUFBSVIsUUFBUSxFQUFFO1lBQy9CUSxPQUFPLENBQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFPLENBQUM7VUFDNUI7VUFDQSxJQUFJakIsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUMzQmdCLFdBQVcsR0FBR0YsUUFBUSxDQUFDRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBTyxDQUFDO1VBQzNDO1VBQ0EsT0FBT0QsV0FBVztRQUNuQixDQUFDO01BQ0Y7SUFDRCxDQUFDO0VBQ0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQTtFQU9BLFNBQVNHLG1CQUFtQixDQUFDQyxxQkFBNEMsRUFBRUMsZUFBb0MsRUFBVztJQUN6SCxPQUFPLENBQUMsQ0FBQ0QscUJBQXFCLENBQUNFLElBQUksQ0FDakNDLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxJQUFJLEtBQUtILGVBQWUsQ0FBQ0csSUFBSSxJQUFJRCxDQUFDLENBQUNFLE1BQU0sS0FBS0osZUFBZSxDQUFDSSxNQUFNLElBQUlGLENBQUMsQ0FBQ0csWUFBWSxLQUFLTCxlQUFlLENBQUNLLFlBQVksQ0FDaEk7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQywwQkFBMEIsQ0FDekNILElBQWMsRUFDZEMsTUFBb0QsRUFDbEM7SUFDbEIsT0FBTyxVQUFVeEIsTUFBaUMsRUFBRUMsV0FBbUIsRUFBRTtNQUN4RSxNQUFNbUIsZUFBZSxHQUFHO1FBQUVHLElBQUk7UUFBRUMsTUFBTSxFQUFFRyxNQUFNLENBQUNILE1BQU0sQ0FBQztRQUFFQyxZQUFZLEVBQUV4QjtNQUFZLENBQUM7TUFDbkYsTUFBTVMsS0FBSyxHQUFHZCxtQkFBbUIsQ0FBQ2UsT0FBTyxDQUFDWCxNQUFNLENBQUM0QixXQUFXLENBQUM7O01BRTdEO01BQ0EsSUFBSWxCLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDUSxtQkFBbUIsQ0FBQ3JCLGtCQUFrQixDQUFDYSxLQUFLLENBQUMsRUFBRVUsZUFBZSxDQUFDLEVBQUU7UUFDckZ2QixrQkFBa0IsQ0FBQ2EsS0FBSyxDQUFDLENBQUNGLElBQUksQ0FBQ1ksZUFBZSxDQUFDO01BQ2hELENBQUMsTUFBTTtRQUNOeEIsbUJBQW1CLENBQUNZLElBQUksQ0FBQ1IsTUFBTSxDQUFDNEIsV0FBVyxDQUFDO1FBQzVDL0Isa0JBQWtCLENBQUNXLElBQUksQ0FBQyxDQUFDWSxlQUFlLENBQUMsQ0FBQztNQUMzQztJQUNELENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT08sU0FBU1MsbUNBQW1DLENBQUM3QixNQUFpQyxFQUFFOEIsVUFBc0IsRUFBUTtJQUNwSCxNQUFNcEIsS0FBSyxHQUFHZCxtQkFBbUIsQ0FBQ2UsT0FBTyxDQUFDWCxNQUFNLENBQUM0QixXQUFXLENBQUM7SUFDN0QsSUFBSWxCLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtNQUNqQixNQUFNcUIsbUJBQW1CLEdBQUdELFVBQXdDO01BQ3BFLE1BQU0zQixlQUFlLEdBQUdILE1BQWdDO01BRXhELEtBQUssTUFBTWdDLGlCQUFpQixJQUFJbkMsa0JBQWtCLENBQUNhLEtBQUssQ0FBQyxFQUFFO1FBQUE7UUFDMUQsTUFBTXVCLGVBQWUsR0FBRzlCLGVBQWUsQ0FBQzZCLGlCQUFpQixDQUFDUCxZQUFZLENBQUMsQ0FBQ1QsSUFBSSxDQUFDaEIsTUFBTSxDQUFDO1FBRXBGK0IsbUJBQW1CLENBQUNDLGlCQUFpQixDQUFDVCxJQUFJLENBQUMsQ0FBRSxTQUFRSSxNQUFNLENBQUNLLGlCQUFpQixDQUFDUixNQUFNLENBQUUsRUFBQyxDQUFDLENBQUNTLGVBQWUsQ0FBQztRQUN6Ryx1QkFBQUgsVUFBVSxDQUFDSSxPQUFPLEVBQUUsd0RBQXBCLG9CQUFzQkMsZ0JBQWdCLENBQUMsTUFBTTtVQUM1Q0osbUJBQW1CLENBQUNDLGlCQUFpQixDQUFDVCxJQUFJLENBQUMsQ0FBRSxTQUFRSSxNQUFNLENBQUNLLGlCQUFpQixDQUFDUixNQUFNLENBQUUsRUFBQyxDQUFDLENBQUNTLGVBQWUsQ0FBQztRQUMxRyxDQUFDLENBQUM7TUFDSDtJQUNEO0VBQ0Q7RUFBQztFQUVNLFNBQVNHLG1CQUFtQixDQUFDQyxNQUFjLEVBQUVDLE9BQWlCLEVBQUVDLFNBQWtCLEVBQVE7SUFDaEcsTUFBTUMsVUFBVSxHQUFHSCxNQUFpQjtJQUNwQyxNQUFNUCxVQUFVLEdBQUdVLFVBQVUsQ0FBQ0MsYUFBYSxFQUE0QjtJQUN2RSxJQUFJWCxVQUFVLEVBQUU7TUFDZixNQUFNWSxhQUFhLEdBQUdGLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUMsSUFBSSxFQUFHQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7TUFDcEcsS0FBSyxNQUFNQyxhQUFhLElBQUlKLGFBQWEsRUFBRTtRQUMxQ2IsbUNBQW1DLENBQUNpQixhQUFhLEVBQUVoQixVQUFVLENBQUM7TUFDL0Q7SUFDRDtFQUNEO0VBQUM7RUFBQTtBQUFBIn0=
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { ExtensionOverrideExecution } from "sap/fe/base/ClassSupport";
|
|
2
|
+
import type Controller from "sap/ui/core/mvc/Controller";
|
|
3
|
+
import type XMLView from "sap/ui/core/mvc/XMLView";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This type is to be extended with all controller extensions and methods that are hookable.
|
|
7
|
+
*/
|
|
8
|
+
type HookableControllerExtensions = {
|
|
9
|
+
editFlow: {
|
|
10
|
+
onAfterSave: true;
|
|
11
|
+
onBeforeSave: true;
|
|
12
|
+
};
|
|
13
|
+
collaborationManager: {
|
|
14
|
+
collectAvailableCards: true;
|
|
15
|
+
};
|
|
16
|
+
paginator: {
|
|
17
|
+
initialize: true;
|
|
18
|
+
};
|
|
19
|
+
routing: {
|
|
20
|
+
onAfterBinding: true;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
type HandlerConfiguration<CExtName extends keyof HookableControllerExtensions> = {
|
|
25
|
+
name: CExtName;
|
|
26
|
+
method: keyof HookableControllerExtensions[CExtName];
|
|
27
|
+
};
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
type HandlerRegistration = HandlerConfiguration<any> & { targetMethod: string };
|
|
30
|
+
|
|
31
|
+
type FunctionMap = {
|
|
32
|
+
[key: string]: Function;
|
|
33
|
+
};
|
|
34
|
+
type DeepFunctionMap = {
|
|
35
|
+
[key: string]: FunctionMap;
|
|
36
|
+
};
|
|
37
|
+
type HookMap = {
|
|
38
|
+
hookedHandlers: {
|
|
39
|
+
[key: string]: Function[];
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Use two arrays as we cannot index a map through an arbitrary object instance
|
|
44
|
+
const registeredInstances: Function[] = [];
|
|
45
|
+
const registeredHandlers: HandlerRegistration[][] = [];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Marks a controller extension method to be hookable by generating additional methods that can be used to attach and detach handlers at runtime.
|
|
49
|
+
*
|
|
50
|
+
* @param execution
|
|
51
|
+
* @returns A method decorator
|
|
52
|
+
*/
|
|
53
|
+
export function hookable(execution: ExtensionOverrideExecution): MethodDecorator {
|
|
54
|
+
return function (target: unknown, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
|
|
55
|
+
const indexableTarget = target as FunctionMap;
|
|
56
|
+
|
|
57
|
+
indexableTarget[`attach${propertyKey.toString()}`] = function (fn: Function): void {
|
|
58
|
+
const cExTInstanceHookMap = this as unknown as HookMap;
|
|
59
|
+
if (!cExTInstanceHookMap.hookedHandlers) {
|
|
60
|
+
cExTInstanceHookMap.hookedHandlers = {};
|
|
61
|
+
}
|
|
62
|
+
if (!cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) {
|
|
63
|
+
cExTInstanceHookMap.hookedHandlers[propertyKey.toString()] = [];
|
|
64
|
+
}
|
|
65
|
+
cExTInstanceHookMap.hookedHandlers[propertyKey.toString()].push(fn);
|
|
66
|
+
};
|
|
67
|
+
indexableTarget[`detach${propertyKey.toString()}`] = function (fn: Function): void {
|
|
68
|
+
const cExTInstanceHookMap = this as unknown as HookMap;
|
|
69
|
+
const handlers = cExTInstanceHookMap.hookedHandlers[propertyKey.toString()];
|
|
70
|
+
const index = handlers.indexOf(fn);
|
|
71
|
+
if (index !== -1) {
|
|
72
|
+
handlers.splice(index, 1);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const oldValue = descriptor.value;
|
|
77
|
+
if (execution === "BeforeAsync" || execution === "AfterAsync") {
|
|
78
|
+
descriptor.value = async function (...args: unknown[]): Promise<unknown> {
|
|
79
|
+
const cExTInstanceHookMap = this as unknown as HookMap;
|
|
80
|
+
const handlers = (cExTInstanceHookMap?.hookedHandlers && cExTInstanceHookMap?.hookedHandlers[propertyKey.toString()]) || [];
|
|
81
|
+
let returnValue: unknown;
|
|
82
|
+
if (execution === "AfterAsync") {
|
|
83
|
+
returnValue = await oldValue.bind(this)(...args);
|
|
84
|
+
}
|
|
85
|
+
for (const handler of handlers) {
|
|
86
|
+
await handler.bind(this)(...args);
|
|
87
|
+
}
|
|
88
|
+
if (execution === "BeforeAsync") {
|
|
89
|
+
returnValue = await oldValue.bind(this)(...args);
|
|
90
|
+
}
|
|
91
|
+
return returnValue;
|
|
92
|
+
};
|
|
93
|
+
} else {
|
|
94
|
+
descriptor.value = function (...args: unknown[]): unknown {
|
|
95
|
+
const cExTInstanceHookMap = this as unknown as HookMap;
|
|
96
|
+
const handlers = (cExTInstanceHookMap?.hookedHandlers && cExTInstanceHookMap?.hookedHandlers[propertyKey.toString()]) || [];
|
|
97
|
+
let returnValue: unknown;
|
|
98
|
+
if (execution === "After") {
|
|
99
|
+
returnValue = oldValue.bind(this)(...args);
|
|
100
|
+
}
|
|
101
|
+
for (const handler of handlers) {
|
|
102
|
+
handler.bind(this)(...args);
|
|
103
|
+
}
|
|
104
|
+
if (execution === "Before") {
|
|
105
|
+
returnValue = oldValue.bind(this)(...args);
|
|
106
|
+
}
|
|
107
|
+
return returnValue;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Checks whether a newRegistration is already included in some existingRegistrations by comparing all relevant attributes.
|
|
115
|
+
*
|
|
116
|
+
* @param existingRegistrations
|
|
117
|
+
* @param newRegistration
|
|
118
|
+
* @returns Result of the check
|
|
119
|
+
*/
|
|
120
|
+
function isAlreadyRegistered(existingRegistrations: HandlerRegistration[], newRegistration: HandlerRegistration): boolean {
|
|
121
|
+
return !!existingRegistrations.find(
|
|
122
|
+
(r) => r.name === newRegistration.name && r.method === newRegistration.method && r.targetMethod === newRegistration.targetMethod
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Registers a method as controller extension hook handler.
|
|
128
|
+
*
|
|
129
|
+
* Currently, only methods of runtime building blocks are supported.
|
|
130
|
+
*
|
|
131
|
+
* @param name Controller extension to hook into
|
|
132
|
+
* @param method Method to hook into
|
|
133
|
+
* @returns A method decorator
|
|
134
|
+
*/
|
|
135
|
+
export function controllerExtensionHandler<CExtName extends keyof HookableControllerExtensions>(
|
|
136
|
+
name: CExtName,
|
|
137
|
+
method: keyof HookableControllerExtensions[CExtName]
|
|
138
|
+
): MethodDecorator {
|
|
139
|
+
return function (target: { constructor: Function }, propertyKey: string) {
|
|
140
|
+
const newRegistration = { name, method: String(method), targetMethod: propertyKey };
|
|
141
|
+
const index = registeredInstances.indexOf(target.constructor);
|
|
142
|
+
|
|
143
|
+
// We need to check if this exact handler is already registered as handlers are registered statically (on the constructor)
|
|
144
|
+
if (index !== -1 && !isAlreadyRegistered(registeredHandlers[index], newRegistration)) {
|
|
145
|
+
registeredHandlers[index].push(newRegistration);
|
|
146
|
+
} else {
|
|
147
|
+
registeredInstances.push(target.constructor);
|
|
148
|
+
registeredHandlers.push([newRegistration]);
|
|
149
|
+
}
|
|
150
|
+
} as MethodDecorator;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Initializes all controller extension handlers registered for a given target.
|
|
155
|
+
*
|
|
156
|
+
* @param target Target class to initialize the handlers for
|
|
157
|
+
* @param target.constructor
|
|
158
|
+
* @param controller PageController instance to get the controller extensions instances from
|
|
159
|
+
*/
|
|
160
|
+
export function initControllerExtensionHookHandlers(target: { constructor: Function }, controller: Controller): void {
|
|
161
|
+
const index = registeredInstances.indexOf(target.constructor);
|
|
162
|
+
if (index !== -1) {
|
|
163
|
+
const indexableController = controller as unknown as DeepFunctionMap;
|
|
164
|
+
const indexableTarget = target as unknown as FunctionMap;
|
|
165
|
+
|
|
166
|
+
for (const registeredHandler of registeredHandlers[index]) {
|
|
167
|
+
const handlerFunction = indexableTarget[registeredHandler.targetMethod].bind(target);
|
|
168
|
+
|
|
169
|
+
indexableController[registeredHandler.name][`attach${String(registeredHandler.method)}`](handlerFunction);
|
|
170
|
+
controller.getView()?.attachBeforeExit(() => {
|
|
171
|
+
indexableController[registeredHandler.name][`detach${String(registeredHandler.method)}`](handlerFunction);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function xmlViewPreprocessor(source: object, _caller?: unknown, _settings?: object): void {
|
|
178
|
+
const sourceView = source as XMLView;
|
|
179
|
+
const controller = sourceView.getController() as Controller | undefined;
|
|
180
|
+
if (controller) {
|
|
181
|
+
const macroAPIChild = sourceView.findAggregatedObjects(true, (s) => s.isA("sap.fe.macros.MacroAPI"));
|
|
182
|
+
for (const managedObject of macroAPIChild) {
|
|
183
|
+
initControllerExtensionHookHandlers(managedObject, controller);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -55,6 +55,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
55
55
|
const CORE_REQUIRE = "core:require";
|
|
56
56
|
const LOG_SOURCEPATH = "log:sourcePath";
|
|
57
57
|
const CUSTOM_LOADVALUE = "customData:loadValue";
|
|
58
|
+
const CUSTOM_ENTITYTYPE = "customData:entityType";
|
|
58
59
|
const CUSTOM_URL = "customData:url";
|
|
59
60
|
function processObjectPropertyValue(childrenObject, namespaceAlias, propertyName) {
|
|
60
61
|
// This is called when the child is
|
|
@@ -101,7 +102,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
101
102
|
if (propertyName === LOG_SOURCEPATH) {
|
|
102
103
|
propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
103
104
|
}
|
|
104
|
-
if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE) {
|
|
105
|
+
if (propertyName === CUSTOM_URL || propertyName === CUSTOM_LOADVALUE || propertyName === CUSTOM_ENTITYTYPE) {
|
|
105
106
|
propertiesString.push(`xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
|
|
106
107
|
}
|
|
107
108
|
if (propertyValue && typeof propertyValue === "object") {
|
|
@@ -122,7 +123,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
122
123
|
} else {
|
|
123
124
|
aggregationString.push(processObjectPropertyValue(propertyValue, undefined, propertyName));
|
|
124
125
|
}
|
|
125
|
-
} else {
|
|
126
|
+
} else if (mSettings[propertyName] !== null) {
|
|
126
127
|
const prop = mSettings[propertyName];
|
|
127
128
|
propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(prop.toString())}'`);
|
|
128
129
|
}
|
|
@@ -178,7 +179,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
178
179
|
propertiesString.push(`${aggregationName}='${JSON.stringify(mSettings[aggregationName])}'`);
|
|
179
180
|
} else {
|
|
180
181
|
// In some case the aggregation expect a string value (like for the tooltip), in this case we set it directly as a property
|
|
181
|
-
propertiesString.push(`${aggregationName}='${mSettings[aggregationName]}'`);
|
|
182
|
+
propertiesString.push(`${aggregationName}='${escapeXMLAttributeValue(mSettings[aggregationName])}'`);
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
});
|
|
@@ -192,7 +193,9 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
192
193
|
let metadataAggregations;
|
|
193
194
|
let defaultAggregationName;
|
|
194
195
|
let isControl = false;
|
|
195
|
-
if (
|
|
196
|
+
if (type === "slot") {
|
|
197
|
+
return `<slot name="${mSettings.name}"/>`;
|
|
198
|
+
} else if (isAControl(type)) {
|
|
196
199
|
metadata = type.getMetadata();
|
|
197
200
|
metadataProperties = metadata.getAllProperties();
|
|
198
201
|
metadataProperties = {
|
|
@@ -207,7 +210,9 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
207
210
|
isControl = true;
|
|
208
211
|
} else {
|
|
209
212
|
metadata = type.metadata;
|
|
210
|
-
metadataProperties =
|
|
213
|
+
metadataProperties = {
|
|
214
|
+
...metadata.properties
|
|
215
|
+
};
|
|
211
216
|
metadataAggregations = {
|
|
212
217
|
...{
|
|
213
218
|
dependents: {},
|
|
@@ -247,6 +252,9 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
247
252
|
metadataProperties[CUSTOM_LOADVALUE] = {
|
|
248
253
|
name: CUSTOM_LOADVALUE
|
|
249
254
|
};
|
|
255
|
+
metadataProperties[CUSTOM_ENTITYTYPE] = {
|
|
256
|
+
name: CUSTOM_ENTITYTYPE
|
|
257
|
+
};
|
|
250
258
|
metadataProperties[CUSTOM_URL] = {
|
|
251
259
|
name: CUSTOM_URL
|
|
252
260
|
};
|
|
@@ -286,4 +294,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
|
|
|
286
294
|
};
|
|
287
295
|
return jsxXml;
|
|
288
296
|
}, false);
|
|
289
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJfdHlwZSIsInVuZGVmaW5lZCIsIndyaXRlQ2hpbGRyZW4iLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsInJlcGxhY2UiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidHJpbSIsImxlbmd0aCIsInB1c2giLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJjaGlsZEtleSIsIk9iamVjdCIsImtleXMiLCJpc0FDb250cm9sIiwiY2hpbGRyZW4iLCJnZXRNZXRhZGF0YSIsIkZMX0RFTEVHQVRFIiwiRFRfREVTSUdOVElNRSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJjaGlsZHJlbk9iamVjdEVsZW1lbnQiLCJ0b1N0cmluZyIsIm5hbWVzcGFjZWRQcm9wZXJ0eSIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaXNDb250cm9sIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJjb21waWxlRXhwcmVzc2lvbiIsIm91dFZhbHVlIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZXJ5IiwicHJvcCIsInByb2Nlc3NDb21tYW5kIiwic2V0dGluZ3MiLCJtZXRhZGF0YUV2ZW50cyIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50Iiwic3RhcnRzV2l0aCIsIm5hbWUiLCJwcm9jZXNzQWdncmVnYXRpb25zIiwibWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJkZWZhdWx0QWdncmVnYXRpb25OYW1lIiwiYWdncmVnYXRpb25DaGlsZEtleXMiLCJ3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24iLCJqc3hYbWwiLCJrZXkiLCJ4bWxOYW1lc3BhY2VNYXAiLCJvdmVycmlkZU5vZGVOYW1lIiwibWV0YWRhdGEiLCJjb250cm9sTmFtZSIsImdldEFsbFByb3BlcnRpZXMiLCJnZXRBbGxFdmVudHMiLCJnZXRBbGxBc3NvY2lhdGlvbnMiLCJnZXROYW1lIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsInByb3BlcnRpZXMiLCJkZXBlbmRlbnRzIiwiY3VzdG9tRGF0YSIsImFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsIm5hbWVzcGFjZSIsIm5hbWVzU3BsaXQiLCJzbGljZSIsInRhZ05hbWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImpzeC14bWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmZ1bmN0aW9uIGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKFxuXHRleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4gfCB1bmtub3duXG4pOiBleHByZXNzaW9uIGlzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB7XG5cdHJldHVybiAoZXhwcmVzc2lvbiBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4pPy5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCB3cml0ZUNoaWxkcmVuID0gZnVuY3Rpb24gKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcge1xuXHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0cmV0dXJuIHZhbC5qb2luKFwiXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cbn07XG5cbi8qKlxuICogU29tZSBjaGFyYWN0ZXJzIG5lZWRzIHRvIGJlIGVzY2FwZWQgd2hlbiB1c2VkIGFzIFhNTCBhdHRyaWJ1dGUgdmFsdWUsIG90aGVyd2lzZSB0aGlzIHJlc3VsdCBpbiBpbmNvcnJlY3QgWE1MLlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgeG1sIGF0dHJpYnV0ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChDb250cm9sIHwgc3RyaW5nKVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0aWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKCFhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBbXTtcblx0fVxuXHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKGNoaWxkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG5cdFx0Y2hpbGQuZm9yRWFjaCgoc3ViQ2hpbGQpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgYWdncmVnYXRpb25OYW1lLCBzdWJDaGlsZCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZEtleSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgY2hpbGRLZXksIGNoaWxkW2NoaWxkS2V5XSk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBpc0FDb250cm9sID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdHlwZW9mIENvbnRyb2wgfCBGdW5jdGlvbik6IGNoaWxkcmVuIGlzIHR5cGVvZiBDb250cm9sIHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5jb25zdCBGTF9ERUxFR0FURSA9IFwiZmw6ZGVsZWdhdGVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IENPUkVfUkVRVUlSRSA9IFwiY29yZTpyZXF1aXJlXCI7XG5jb25zdCBMT0dfU09VUkNFUEFUSCA9IFwibG9nOnNvdXJjZVBhdGhcIjtcbmNvbnN0IENVU1RPTV9MT0FEVkFMVUUgPSBcImN1c3RvbURhdGE6bG9hZFZhbHVlXCI7XG5jb25zdCBDVVNUT01fVVJMID0gXCJjdXN0b21EYXRhOnVybFwiO1xuXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShcblx0Y2hpbGRyZW5PYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRuYW1lc3BhY2VBbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpbGQgaXNcblx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBzdHJpbmdbXSA9IFtdO1xuXHRPYmplY3Qua2V5cyhjaGlsZHJlbk9iamVjdCkuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRjb25zdCBjaGlsZFZhbHVlID0gY2hpbGRyZW5PYmplY3Rbc3ViUHJvcE5hbWVdO1xuXHRcdGlmIChjaGlsZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZFZhbHVlKSkge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChgPCR7c3ViUHJvcE5hbWV9PmApO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRyZW5PYmplY3RFbGVtZW50IG9mIGNoaWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3RFbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuLnB1c2goYDwvJHtzdWJQcm9wTmFtZX0+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGEgdmFsdWUgaXQgbmVlZHMgdG8gYmUgc2VyaWFsaXplZCBhcyBhIGNoaWxkcmVuXG5cdFx0XHRcdFx0Ly8gPG15T2JqZWN0UHJvcCBwcm9wMT0neHh4JywgcHJvcDI9J3h4dCcvPlxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWVzcGFjZUFsaWFzLCBzdWJQcm9wTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2UgaXQncyBwYXJ0IG9mIHRoZSBtYWluIG9iamVjdCBqdXN0IGFzIGFub3RoZXIgcHJvcGVydHlcblx0XHRcdFx0YWdncmVnYXRpb25Qcm9wZXJ0aWVzLnB1c2goYCR7c3ViUHJvcE5hbWV9PScke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNoaWxkVmFsdWUudG9TdHJpbmcoKSl9J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgbmFtZXNwYWNlZFByb3BlcnR5ID0gbmFtZXNwYWNlQWxpYXMgPyBgJHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9YCA6IHByb3BlcnR5TmFtZTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VkUHJvcGVydHl9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcIlxcblwiKX08LyR7bmFtZXNwYWNlZFByb3BlcnR5fT5gO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllczxUPihcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFQcm9wZXJ0aWVzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXSxcblx0aXNDb250cm9sOiBib29sZWFuXG4pOiB2b2lkIHtcblx0T2JqZWN0LmtleXMobWV0YWRhdGFQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkgJiYgbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gQ09SRV9SRVFVSVJFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IEZMX0RFTEVHQVRFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Zmw9XCJzYXAudWkuZmxcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gRFRfREVTSUdOVElNRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmR0PVwic2FwLnVpLmR0XCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IExPR19TT1VSQ0VQQVRIKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6bG9nPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiYCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDVVNUT01fVVJMIHx8IHByb3BlcnR5TmFtZSA9PT0gQ1VTVE9NX0xPQURWQUxVRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChtZXRhZGF0YVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlID09PSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHsocHJvcGVydHlWYWx1ZSBhcyBDb250ZXh0KS5nZXRQYXRoKCl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZUV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkpfSdgKTtcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlWzBdID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZVswXSA6IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pO1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7b3V0VmFsdWV9J2ApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHByb3BlcnR5VmFsdWUuZXZlcnkoKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eVZhbHVlLmpvaW4oXCIgXCIpXG5cdFx0XHRcdFx0XHRcdDogSlNPTi5zdHJpbmdpZnkocHJvcGVydHlWYWx1ZSk7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtvdXRWYWx1ZX0nYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ29udHJvbCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHVuZGVmaW5lZCwgcHJvcGVydHlOYW1lKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3AgPSBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wLnRvU3RyaW5nKCkpfSdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bVNldHRpbmdzLmNoaWxkcmVuPy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmXG5cdFx0XHRPYmplY3Qua2V5cygobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gPz8ge30pLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdC8vIE9iamVjdCAvIEFycmF5IHByb3BlcnRpZXMgYXJlIHBhcnQgb2YgdGhlIGBjaGlsZHJlbmAgYWdncmVnYXRpb24gYW5kIGFzIHN1Y2ggc3RpbGwgbmVlZCB0byBiZSBwcm9jZXNzZWQgYXMgcHJvcGVydGllc1xuXHRcdFx0Y29uc3QgY2hpbGRyZW5PYmplY3QgPSAobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZHJlbk9iamVjdCwgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnR5TmFtZSkpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIG1ldGFkYXRhRXZlbnRzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHR9XG5cdD5cbik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGFFdmVudHNbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBjb21tYW5kO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA/PyBcImN1c3RvbURhdGFcIiwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkS2V5cyA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4pO1xuXHRsZXQgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdGlmIChhZ2dyZWdhdGlvbkNoaWxkS2V5cy5sZW5ndGggPT09IDEgJiYgYWdncmVnYXRpb25DaGlsZEtleXNbMF0gPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHR3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSB0cnVlO1xuXHR9XG5cdE9iamVjdC5rZXlzKG1ldGFkYXRhQWdncmVnYXRpb25zKS5mb3JFYWNoKChhZ2dyZWdhdGlvbk5hbWUpID0+IHtcblx0XHRpZiAoYWdncmVnYXRpb25DaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25OYW1lID09PSBkZWZhdWx0QWdncmVnYXRpb25OYW1lICYmIHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRhZ2dyZWdhdGlvblN0cmluZy5wdXNoKGAke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goXG5cdFx0XHRcdFx0YDwke25hbWVzcGFjZUFsaWFzfToke2FnZ3JlZ2F0aW9uTmFtZX0+XG5cdFx0XHRcdFx0XHQke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1cblx0XHRcdFx0XHQ8LyR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYWdncmVnYXRpb25OYW1lKSAmJiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHthZ2dyZWdhdGlvbk5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdKX0nYCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBzb21lIGNhc2UgdGhlIGFnZ3JlZ2F0aW9uIGV4cGVjdCBhIHN0cmluZyB2YWx1ZSAobGlrZSBmb3IgdGhlIHRvb2x0aXApLCBpbiB0aGlzIGNhc2Ugd2Ugc2V0IGl0IGRpcmVjdGx5IGFzIGEgcHJvcGVydHlcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV19J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhZ2dyZWdhdGlvbkNoaWxkcmVuO1xufVxuXG5jb25zdCBqc3hYbWwgPSBmdW5jdGlvbiA8VD4oXG5cdHR5cGU6IHR5cGVvZiBDb250cm9sIHwgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSxcblx0bVNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHsga2V5Pzogc3RyaW5nOyBjaGlsZHJlbj86IFVJNUVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPiB9LFxuXHRrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0eG1sTmFtZXNwYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRvdmVycmlkZU5vZGVOYW1lPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRsZXQgbWV0YWRhdGE7XG5cdGxldCBtZXRhZGF0YVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHsgbmFtZT86IHN0cmluZzsgdHlwZT86IHN0cmluZyB9Pjtcblx0bGV0IG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU6IHN0cmluZyB9Pjtcblx0bGV0IGNvbnRyb2xOYW1lO1xuXHRsZXQgbWV0YWRhdGFBZ2dyZWdhdGlvbnM7XG5cdGxldCBkZWZhdWx0QWdncmVnYXRpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBpc0NvbnRyb2wgPSBmYWxzZTtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCk7XG5cdFx0Y29udHJvbE5hbWUgPSBtZXRhZGF0YS5nZXROYW1lKCk7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0XHRkZWZhdWx0QWdncmVnYXRpb25OYW1lID0gbWV0YWRhdGEuZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSgpO1xuXHRcdGlzQ29udHJvbCA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0bWV0YWRhdGEgPSB0eXBlLm1ldGFkYXRhO1xuXHRcdG1ldGFkYXRhUHJvcGVydGllcyA9IG1ldGFkYXRhLnByb3BlcnRpZXM7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSB7IC4uLnsgZGVwZW5kZW50czoge30sIGN1c3RvbURhdGE6IHt9IH0sIC4uLm1ldGFkYXRhLmFnZ3JlZ2F0aW9ucyB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0ge307XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wiYmluZGluZ1wiXSA9IHsgbmFtZTogXCJiaW5kaW5nXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0RUX0RFU0lHTlRJTUVdID0geyBuYW1lOiBEVF9ERVNJR05USU1FIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDT1JFX1JFUVVJUkVdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0xPR19TT1VSQ0VQQVRIXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9MT0FEVkFMVUVdID0geyBuYW1lOiBDVVNUT01fTE9BRFZBTFVFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDVVNUT01fVVJMXSA9IHsgbmFtZTogQ1VTVE9NX1VSTCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpmbFwiXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6ZHRcIl0gPSB7IG5hbWU6IERUX0RFU0lHTlRJTUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6Y29yZVwiXSA9IHsgbmFtZTogQ09SRV9SRVFVSVJFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmxvZ1wiXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0aWYgKGNvbnRyb2xOYW1lID09PSBcInNhcC51aS5jb3JlLkZyYWdtZW50XCIpIHtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXNbXCJmcmFnbWVudE5hbWVcIl0gPSB7IG5hbWU6IFwiZnJhZ21lbnROYW1lXCIgfTtcblx0fVxuXHRjb25zdCBuYW1lc3BhY2UgPSBuYW1lc1NwbGl0LnNsaWNlKDAsIC0xKTtcblx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0aWYgKHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildKSB7XG5cdFx0bmFtZXNwYWNlQWxpYXMgPSB4bWxOYW1lc3BhY2VNYXBbbmFtZXNwYWNlLmpvaW4oXCIuXCIpXTtcblx0fVxuXHRsZXQgdGFnTmFtZSA9IGAke25hbWVzcGFjZUFsaWFzfToke25hbWV9YDtcblx0Y29uc3QgcHJvcGVydGllc1N0cmluZzogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdID0gW107XG5cdHByb2Nlc3NDb21tYW5kKG1TZXR0aW5ncywgbWV0YWRhdGFFdmVudHMpO1xuXHRwcm9jZXNzUHJvcGVydGllcyhtU2V0dGluZ3MsIG1ldGFkYXRhUHJvcGVydGllcywgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nLCBpc0NvbnRyb2wpO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zKG1TZXR0aW5ncywgbWV0YWRhdGFBZ2dyZWdhdGlvbnMsIG5hbWVzcGFjZUFsaWFzLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdGlmIChvdmVycmlkZU5vZGVOYW1lKSB7XG5cdFx0dGFnTmFtZSA9IG92ZXJyaWRlTm9kZU5hbWU7XG5cdH1cblx0cmV0dXJuIGA8JHt0YWdOYW1lfSB4bWxuczoke25hbWVzcGFjZUFsaWFzfT1cIiR7bmFtZXNwYWNlLmpvaW4oXCIuXCIpfVwiICR7cHJvcGVydGllc1N0cmluZy5qb2luKFwiIFwiKX0+JHthZ2dyZWdhdGlvblN0cmluZy5qb2luKFxuXHRcdFwiXCJcblx0KX08LyR7dGFnTmFtZX0+YDtcbn07XG5leHBvcnQgZGVmYXVsdCBqc3hYbWw7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBUUEsU0FBU0EsMEJBQTBCLENBQ2xDQyxVQUF1RCxFQUNMO0lBQ2xELE9BQU8sQ0FBQ0EsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQXdDQyxLQUFLLE1BQUtDLFNBQVM7RUFDOUU7RUFFQSxNQUFNQyxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJLENB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
|
|
297
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJfdHlwZSIsInVuZGVmaW5lZCIsIndyaXRlQ2hpbGRyZW4iLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsInJlcGxhY2UiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidHJpbSIsImxlbmd0aCIsInB1c2giLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJjaGlsZEtleSIsIk9iamVjdCIsImtleXMiLCJpc0FDb250cm9sIiwiY2hpbGRyZW4iLCJnZXRNZXRhZGF0YSIsIkZMX0RFTEVHQVRFIiwiRFRfREVTSUdOVElNRSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9FTlRJVFlUWVBFIiwiQ1VTVE9NX1VSTCIsInByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlIiwiY2hpbGRyZW5PYmplY3QiLCJuYW1lc3BhY2VBbGlhcyIsInByb3BlcnR5TmFtZSIsImFnZ3JlZ2F0aW9uUHJvcGVydGllcyIsInN1YlByb3BOYW1lIiwiY2hpbGRWYWx1ZSIsImNoaWxkcmVuT2JqZWN0RWxlbWVudCIsInRvU3RyaW5nIiwibmFtZXNwYWNlZFByb3BlcnR5IiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJtU2V0dGluZ3MiLCJtZXRhZGF0YVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzU3RyaW5nIiwiYWdncmVnYXRpb25TdHJpbmciLCJpc0NvbnRyb2wiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3BlcnR5VmFsdWUiLCJ0eXBlIiwiZ2V0UGF0aCIsImNvbXBpbGVFeHByZXNzaW9uIiwib3V0VmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwiZXZlcnkiLCJwcm9wIiwicHJvY2Vzc0NvbW1hbmQiLCJzZXR0aW5ncyIsIm1ldGFkYXRhRXZlbnRzIiwiY29tbWFuZFByb3BlcnR5IiwiY29tbWFuZCIsImV2ZW50TmFtZSIsInNwbGl0IiwiZXZlbnQiLCJzdGFydHNXaXRoIiwibmFtZSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJhZ2dyZWdhdGlvbkNoaWxkS2V5cyIsIndyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiIsImpzeFhtbCIsImtleSIsInhtbE5hbWVzcGFjZU1hcCIsIm92ZXJyaWRlTm9kZU5hbWUiLCJtZXRhZGF0YSIsImNvbnRyb2xOYW1lIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldEFsbEV2ZW50cyIsImdldEFsbEFzc29jaWF0aW9ucyIsImdldE5hbWUiLCJnZXRBbGxBZ2dyZWdhdGlvbnMiLCJnZXREZWZhdWx0QWdncmVnYXRpb25OYW1lIiwicHJvcGVydGllcyIsImRlcGVuZGVudHMiLCJjdXN0b21EYXRhIiwiYWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwibmFtZXNwYWNlIiwibmFtZXNTcGxpdCIsInNsaWNlIiwidGFnTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LXhtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZVwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcblxuZnVuY3Rpb24gaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24oXG5cdGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB8IHVua25vd25cbik6IGV4cHJlc3Npb24gaXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+IHtcblx0cmV0dXJuIChleHByZXNzaW9uIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPik/Ll90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IHdyaXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRyZXR1cm4gdmFsLmpvaW4oXCJcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufTtcblxuLyoqXG4gKiBTb21lIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aGVuIHVzZWQgYXMgWE1MIGF0dHJpYnV0ZSB2YWx1ZSwgb3RoZXJ3aXNlIHRoaXMgcmVzdWx0IGluIGluY29ycmVjdCBYTUwuXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB4bWwgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKENvbnRyb2wgfCBzdHJpbmcpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoY2hpbGQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkS2V5IG9mIE9iamVjdC5rZXlzKGNoaWxkKSkge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgdHlwZW9mIENvbnRyb2wge1xuXHRyZXR1cm4gISEoY2hpbGRyZW4gYXMgdHlwZW9mIENvbnRyb2wpPy5nZXRNZXRhZGF0YTtcbn07XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgRFRfREVTSUdOVElNRSA9IFwiZHQ6ZGVzaWdudGltZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IExPR19TT1VSQ0VQQVRIID0gXCJsb2c6c291cmNlUGF0aFwiO1xuY29uc3QgQ1VTVE9NX0xPQURWQUxVRSA9IFwiY3VzdG9tRGF0YTpsb2FkVmFsdWVcIjtcbmNvbnN0IENVU1RPTV9FTlRJVFlUWVBFID0gXCJjdXN0b21EYXRhOmVudGl0eVR5cGVcIjtcbmNvbnN0IENVU1RPTV9VUkwgPSBcImN1c3RvbURhdGE6dXJsXCI7XG5cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKFxuXHRjaGlsZHJlbk9iamVjdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHByb3BlcnR5TmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCBpc1xuXHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IHN0cmluZ1tdID0gW107XG5cdE9iamVjdC5rZXlzKGNoaWxkcmVuT2JqZWN0KS5mb3JFYWNoKChzdWJQcm9wTmFtZSkgPT4ge1xuXHRcdGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZHJlbk9iamVjdFtzdWJQcm9wTmFtZV07XG5cdFx0aWYgKGNoaWxkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNoaWxkVmFsdWUpKSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25DaGlsZHJlbi5wdXNoKGA8JHtzdWJQcm9wTmFtZX0+YCk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZHJlbk9iamVjdEVsZW1lbnQgb2YgY2hpbGRWYWx1ZSkge1xuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25DaGlsZHJlbi5wdXNoKFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZHJlbk9iamVjdEVsZW1lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWVzcGFjZUFsaWFzLCBzdWJQcm9wTmFtZSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChgPC8ke3N1YlByb3BOYW1lfT5gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiB0aGUgcHJvcGVydHkgaXMgYSB2YWx1ZSBpdCBuZWVkcyB0byBiZSBzZXJpYWxpemVkIGFzIGEgY2hpbGRyZW5cblx0XHRcdFx0XHQvLyA8bXlPYmplY3RQcm9wIHByb3AxPSd4eHgnLCBwcm9wMj0neHh0Jy8+XG5cdFx0XHRcdFx0YWdncmVnYXRpb25DaGlsZHJlbi5wdXNoKFxuXHRcdFx0XHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZXNwYWNlQWxpYXMsIHN1YlByb3BOYW1lKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIHBhcnQgb2YgdGhlIG1haW4gb2JqZWN0IGp1c3QgYXMgYW5vdGhlciBwcm9wZXJ0eVxuXHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnRpZXMucHVzaChgJHtzdWJQcm9wTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY2hpbGRWYWx1ZS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBuYW1lc3BhY2VkUHJvcGVydHkgPSBuYW1lc3BhY2VBbGlhcyA/IGAke25hbWVzcGFjZUFsaWFzfToke3Byb3BlcnR5TmFtZX1gIDogcHJvcGVydHlOYW1lO1xuXHRyZXR1cm4gYDwke25hbWVzcGFjZWRQcm9wZXJ0eX0gJHthZ2dyZWdhdGlvblByb3BlcnRpZXMuam9pbihcIiBcIil9PiR7YWdncmVnYXRpb25DaGlsZHJlbi5qb2luKFwiXFxuXCIpfTwvJHtuYW1lc3BhY2VkUHJvcGVydHl9PmA7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzPFQ+KFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YVByb3BlcnRpZXM6IFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0e1xuXHRcdFx0bmFtZT86IHN0cmluZztcblx0XHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0fVxuXHQ+LFxuXHRuYW1lc3BhY2VBbGlhczogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdLFxuXHRpc0NvbnRyb2w6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRPYmplY3Qua2V5cyhtZXRhZGF0YVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDT1JFX1JFUVVJUkUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gRkxfREVMRUdBVEUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpmbD1cInNhcC51aS5mbFwiYCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBEVF9ERVNJR05USU1FKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6ZHQ9XCJzYXAudWkuZHRcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gTE9HX1NPVVJDRVBBVEgpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpsb2c9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IENVU1RPTV9VUkwgfHwgcHJvcGVydHlOYW1lID09PSBDVVNUT01fTE9BRFZBTFVFIHx8IHByb3BlcnR5TmFtZSA9PT0gQ1VTVE9NX0VOVElUWVRZUEUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiYCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRpZiAobWV0YWRhdGFQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0udHlwZSA9PT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7KHByb3BlcnR5VmFsdWUgYXMgQ29udGV4dCkuZ2V0UGF0aCgpfSdgKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlKSkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNvbXBpbGVFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUpKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eVZhbHVlKSkge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3V0VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZVswXSA9PT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5VmFsdWVbMF0gOiBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVZhbHVlWzBdKTtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke291dFZhbHVlfSdgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb3V0VmFsdWUgPSBwcm9wZXJ0eVZhbHVlLmV2ZXJ5KCh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdD8gcHJvcGVydHlWYWx1ZS5qb2luKFwiIFwiKVxuXHRcdFx0XHRcdFx0XHQ6IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWUpO1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7b3V0VmFsdWV9J2ApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChpc0NvbnRyb2wpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtKU09OLnN0cmluZ2lmeShtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSl9J2ApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2gocHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUocHJvcGVydHlWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB1bmRlZmluZWQsIHByb3BlcnR5TmFtZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnN0IHByb3AgPSBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wLnRvU3RyaW5nKCkpfSdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bVNldHRpbmdzLmNoaWxkcmVuPy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmXG5cdFx0XHRPYmplY3Qua2V5cygobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gPz8ge30pLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdC8vIE9iamVjdCAvIEFycmF5IHByb3BlcnRpZXMgYXJlIHBhcnQgb2YgdGhlIGBjaGlsZHJlbmAgYWdncmVnYXRpb24gYW5kIGFzIHN1Y2ggc3RpbGwgbmVlZCB0byBiZSBwcm9jZXNzZWQgYXMgcHJvcGVydGllc1xuXHRcdFx0Y29uc3QgY2hpbGRyZW5PYmplY3QgPSAobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZHJlbk9iamVjdCwgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnR5TmFtZSkpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIG1ldGFkYXRhRXZlbnRzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHR9XG5cdD5cbik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGFFdmVudHNbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBjb21tYW5kO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA/PyBcImN1c3RvbURhdGFcIiwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkS2V5cyA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4pO1xuXHRsZXQgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdGlmIChhZ2dyZWdhdGlvbkNoaWxkS2V5cy5sZW5ndGggPT09IDEgJiYgYWdncmVnYXRpb25DaGlsZEtleXNbMF0gPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHR3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSB0cnVlO1xuXHR9XG5cdE9iamVjdC5rZXlzKG1ldGFkYXRhQWdncmVnYXRpb25zKS5mb3JFYWNoKChhZ2dyZWdhdGlvbk5hbWUpID0+IHtcblx0XHRpZiAoYWdncmVnYXRpb25DaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25OYW1lID09PSBkZWZhdWx0QWdncmVnYXRpb25OYW1lICYmIHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRhZ2dyZWdhdGlvblN0cmluZy5wdXNoKGAke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goXG5cdFx0XHRcdFx0YDwke25hbWVzcGFjZUFsaWFzfToke2FnZ3JlZ2F0aW9uTmFtZX0+XG5cdFx0XHRcdFx0XHQke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1cblx0XHRcdFx0XHQ8LyR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYWdncmVnYXRpb25OYW1lKSAmJiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHthZ2dyZWdhdGlvbk5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdKX0nYCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBzb21lIGNhc2UgdGhlIGFnZ3JlZ2F0aW9uIGV4cGVjdCBhIHN0cmluZyB2YWx1ZSAobGlrZSBmb3IgdGhlIHRvb2x0aXApLCBpbiB0aGlzIGNhc2Ugd2Ugc2V0IGl0IGRpcmVjdGx5IGFzIGEgcHJvcGVydHlcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgc3RyaW5nKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ2hpbGRyZW47XG59XG5cbmNvbnN0IGpzeFhtbCA9IGZ1bmN0aW9uIDxUPihcblx0dHlwZTogdHlwZW9mIENvbnRyb2wgfCB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIHwgXCJzbG90XCIsXG5cdG1TZXR0aW5nczogTm9uQ29udHJvbFByb3BlcnRpZXM8VD4gJiB7IGtleT86IHN0cmluZzsgY2hpbGRyZW4/OiBVSTVFbGVtZW50IHwgQ29udHJvbFByb3BlcnRpZXM8VD47IG5hbWU/OiBzdHJpbmcgfSxcblx0a2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHhtbE5hbWVzcGFjZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0b3ZlcnJpZGVOb2RlTmFtZT86IHN0cmluZ1xuKTogc3RyaW5nIHtcblx0bGV0IG1ldGFkYXRhO1xuXHRsZXQgbWV0YWRhdGFQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmcgfT47XG5cdGxldCBtZXRhZGF0YUV2ZW50czogUmVjb3JkPHN0cmluZywgeyBuYW1lOiBzdHJpbmcgfT47XG5cdGxldCBjb250cm9sTmFtZTtcblx0bGV0IG1ldGFkYXRhQWdncmVnYXRpb25zO1xuXHRsZXQgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgaXNDb250cm9sID0gZmFsc2U7XG5cdGlmICh0eXBlID09PSBcInNsb3RcIikge1xuXHRcdHJldHVybiBgPHNsb3QgbmFtZT1cIiR7bVNldHRpbmdzLm5hbWV9XCIvPmA7XG5cdH0gZWxzZSBpZiAoaXNBQ29udHJvbCh0eXBlKSkge1xuXHRcdG1ldGFkYXRhID0gdHlwZS5nZXRNZXRhZGF0YSgpO1xuXHRcdG1ldGFkYXRhUHJvcGVydGllcyA9IG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSB7IC4uLm1ldGFkYXRhUHJvcGVydGllcywgLi4ubWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCksIC4uLm1ldGFkYXRhLmdldEFsbEFzc29jaWF0aW9ucygpIH07XG5cdFx0bWV0YWRhdGFFdmVudHMgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKTtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLmdldE5hbWUoKTtcblx0XHRtZXRhZGF0YUFnZ3JlZ2F0aW9ucyA9IG1ldGFkYXRhLmdldEFsbEFnZ3JlZ2F0aW9ucygpO1xuXHRcdGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdFx0aXNDb250cm9sID0gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUubWV0YWRhdGE7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YS5wcm9wZXJ0aWVzIH07XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSB7IC4uLnsgZGVwZW5kZW50czoge30sIGN1c3RvbURhdGE6IHt9IH0sIC4uLm1ldGFkYXRhLmFnZ3JlZ2F0aW9ucyB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0ge307XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wiYmluZGluZ1wiXSA9IHsgbmFtZTogXCJiaW5kaW5nXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0RUX0RFU0lHTlRJTUVdID0geyBuYW1lOiBEVF9ERVNJR05USU1FIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDT1JFX1JFUVVJUkVdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0xPR19TT1VSQ0VQQVRIXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9MT0FEVkFMVUVdID0geyBuYW1lOiBDVVNUT01fTE9BRFZBTFVFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDVVNUT01fRU5USVRZVFlQRV0gPSB7IG5hbWU6IENVU1RPTV9FTlRJVFlUWVBFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDVVNUT01fVVJMXSA9IHsgbmFtZTogQ1VTVE9NX1VSTCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpmbFwiXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6ZHRcIl0gPSB7IG5hbWU6IERUX0RFU0lHTlRJTUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6Y29yZVwiXSA9IHsgbmFtZTogQ09SRV9SRVFVSVJFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmxvZ1wiXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0aWYgKGNvbnRyb2xOYW1lID09PSBcInNhcC51aS5jb3JlLkZyYWdtZW50XCIpIHtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXNbXCJmcmFnbWVudE5hbWVcIl0gPSB7IG5hbWU6IFwiZnJhZ21lbnROYW1lXCIgfTtcblx0fVxuXHRjb25zdCBuYW1lc3BhY2UgPSBuYW1lc1NwbGl0LnNsaWNlKDAsIC0xKTtcblx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0aWYgKHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildKSB7XG5cdFx0bmFtZXNwYWNlQWxpYXMgPSB4bWxOYW1lc3BhY2VNYXBbbmFtZXNwYWNlLmpvaW4oXCIuXCIpXTtcblx0fVxuXHRsZXQgdGFnTmFtZSA9IGAke25hbWVzcGFjZUFsaWFzfToke25hbWV9YDtcblx0Y29uc3QgcHJvcGVydGllc1N0cmluZzogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdID0gW107XG5cdHByb2Nlc3NDb21tYW5kKG1TZXR0aW5ncywgbWV0YWRhdGFFdmVudHMpO1xuXHRwcm9jZXNzUHJvcGVydGllcyhtU2V0dGluZ3MsIG1ldGFkYXRhUHJvcGVydGllcywgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nLCBpc0NvbnRyb2wpO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zKG1TZXR0aW5ncywgbWV0YWRhdGFBZ2dyZWdhdGlvbnMsIG5hbWVzcGFjZUFsaWFzLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdGlmIChvdmVycmlkZU5vZGVOYW1lKSB7XG5cdFx0dGFnTmFtZSA9IG92ZXJyaWRlTm9kZU5hbWU7XG5cdH1cblx0cmV0dXJuIGA8JHt0YWdOYW1lfSB4bWxuczoke25hbWVzcGFjZUFsaWFzfT1cIiR7bmFtZXNwYWNlLmpvaW4oXCIuXCIpfVwiICR7cHJvcGVydGllc1N0cmluZy5qb2luKFwiIFwiKX0+JHthZ2dyZWdhdGlvblN0cmluZy5qb2luKFxuXHRcdFwiXCJcblx0KX08LyR7dGFnTmFtZX0+YDtcbn07XG5leHBvcnQgZGVmYXVsdCBqc3hYbWw7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBUUEsU0FBU0EsMEJBQTBCLENBQ2xDQyxVQUF1RCxFQUNMO0lBQ2xELE9BQU8sQ0FBQ0EsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQXdDQyxLQUFLLE1BQUtDLFNBQVM7RUFDOUU7RUFFQSxNQUFNQyxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3BCLENBQUMsTUFBTTtNQUNOLE9BQU9ILEdBQUc7SUFDWDtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0ksdUJBQXVCLENBQUNDLEtBQWMsRUFBc0I7SUFDcEUsT0FBT0EsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO0VBQzNHO0VBRUEsTUFBTUMsbUJBQW1CLEdBQUcsVUFDM0JDLG1CQUF5RCxFQUN6REMsZUFBdUIsRUFDdkJDLEtBQXNDLEVBQy9CO0lBQ1AsSUFBSUEsS0FBSyxLQUFLWixTQUFTLEVBQUU7TUFDeEI7SUFDRDtJQUNBLElBQUksQ0FBQ1UsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxFQUFFO01BQzFDRCxtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEdBQUcsRUFBRTtJQUMxQztJQUNBLElB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
|