@sapui5/sap.fe.macros 1.130.6 → 1.130.9
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/macros/.library +1 -1
- package/src/sap/fe/macros/DelegateUtil.js +5 -1
- package/src/sap/fe/macros/DelegateUtil.ts +10 -0
- package/src/sap/fe/macros/field/FieldBaseDelegate.js +58 -7
- package/src/sap/fe/macros/field/FieldBaseDelegate.ts +44 -2
- package/src/sap/fe/macros/field/FieldRuntime.js +7 -2
- package/src/sap/fe/macros/field/FieldRuntime.ts +5 -1
- package/src/sap/fe/macros/filter/FilterFieldTemplating.js +4 -4
- package/src/sap/fe/macros/filter/FilterFieldTemplating.ts +4 -4
- package/src/sap/fe/macros/internal/helpers/Upload.js +4 -3
- package/src/sap/fe/macros/internal/helpers/Upload.ts +3 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +5 -1
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +1 -1
- package/src/sap/fe/macros/library.js +1 -1
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +4 -4
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +4 -4
- package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +2 -2
- package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +1 -1
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +10 -3
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +9 -2
package/package.json
CHANGED
|
@@ -146,12 +146,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
|
|
|
146
146
|
for (const oDependent of aDependents) {
|
|
147
147
|
let oTargetDependent = oDependent;
|
|
148
148
|
if (oModifier) {
|
|
149
|
+
var _getPayload;
|
|
149
150
|
if (oModifier.getControlType(oDependent) === "sap.fe.macros.ValueHelp" && (await oModifier.getProperty(oDependent, "metaPath")) === mParameters.metaPath) {
|
|
150
151
|
// in xml validate against the metaPath of the ValueHelp
|
|
151
152
|
return true;
|
|
152
153
|
} else if (oModifier.getControlType(oDependent) === "sap.fe.macros.ValueHelp" && oModifier.targets !== "xmlTree") {
|
|
153
154
|
// in xml validate against the metaPath of the ValueHelp
|
|
154
155
|
oTargetDependent = oDependent.getContent();
|
|
156
|
+
} else if (oModifier.getControlType(oDependent) === "sap.ui.mdc.ValueHelp" && oModifier.targets !== "xmlTree" && ((_getPayload = oDependent.getPayload()) === null || _getPayload === void 0 ? void 0 : _getPayload.propertyPath) === mParameters.metaPath && oModifier.getId(oTargetDependent).includes("::FilterFieldValueHelp::")) {
|
|
157
|
+
// specific case of the OVP
|
|
158
|
+
return true;
|
|
155
159
|
}
|
|
156
160
|
if (oTargetDependent && oModifier.getId(oTargetDependent) === sGeneratedId) {
|
|
157
161
|
return true;
|
|
@@ -231,4 +235,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converter
|
|
|
231
235
|
};
|
|
232
236
|
return DelegateUtil;
|
|
233
237
|
}, false);
|
|
234
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOU19NQUNST0RBVEEiLCJfcmV0cmlldmVNb2RlbCIsImNvbnRyb2wiLCJkZXRhY2hNb2RlbENvbnRleHRDaGFuZ2UiLCJzTW9kZWxOYW1lIiwibW9kZWxOYW1lIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJyZXNvbHZlIiwiYXR0YWNoTW9kZWxDb250ZXh0Q2hhbmdlIiwiZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllciIsInByb3BlcnR5IiwibW9kaWZpZXIiLCJjdXN0b21EYXRhIiwiRGVsZWdhdGVVdGlsIiwicmV0cmlldmVDdXN0b21EYXRhTm9kZSIsImxlbmd0aCIsImdldFByb3BlcnR5IiwidW5kZWZpbmVkIiwiRkVUQ0hFRF9QUk9QRVJUSUVTX0RBVEFfS0VZIiwic2V0Q2FjaGVkUHJvcGVydGllcyIsImZldGNoZWRQcm9wZXJ0aWVzIiwid2luZG93IiwiRWxlbWVudCIsImtleSIsInNldEN1c3RvbURhdGEiLCJnZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0Q3VzdG9tRGF0YSIsIm9Db250cm9sIiwic1Byb3BlcnR5Iiwib01vZGlmaWVyIiwiZ2V0QXR0cmlidXRlTlMiLCJkYXRhIiwiRnVuY3Rpb24iLCJ2VmFsdWUiLCJzZXRBdHRyaWJ1dGVOUyIsImZldGNoUHJvcGVydGllc0ZvckVudGl0eSIsInNFbnRpdHlTZXQiLCJvTWV0YU1vZGVsIiwicmVxdWVzdE9iamVjdCIsImZldGNoQW5ub3RhdGlvbnNGb3JFbnRpdHkiLCJmZXRjaE1vZGVsIiwiUHJvbWlzZSIsImdldERlbGVnYXRlIiwicGF5bG9hZCIsIm9Db250ZXh0IiwiY2FsbCIsInRlbXBsYXRlQ29udHJvbEZyYWdtZW50Iiwic0ZyYWdtZW50TmFtZSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9PcHRpb25zIiwiQ29tbW9uVXRpbHMiLCJkb2VzVmFsdWVIZWxwRXhpc3QiLCJtUGFyYW1ldGVycyIsInNQcm9wZXJ0eU5hbWUiLCJzVmFsdWVIZWxwVHlwZSIsInNPcmlnaW5hbFByb3BlcnR5Iiwic0JpbmRpbmdQYXRoIiwicHJvcGVydHlDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ2YWx1ZUhlbHBQcm9wZXJ0eVBhdGgiLCJGaWVsZEhlbHBlciIsInZhbHVlSGVscFByb3BlcnR5IiwiYklzQWJzb2x1dGUiLCJpbmRleE9mIiwiaW5jbHVkZXMiLCJnZXRPYmplY3QiLCJwcm9wZXJ0eURhdGFNb2RlbCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJ1bml0T3JDdXJyZW5jeURhdGFNb2RlbCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInNHZW5lcmF0ZWRJZCIsImdlbmVyYXRlSUQiLCJmbGV4SWQiLCJnZW5lcmF0ZSIsImdldElkIiwiZ2V0UmVsYXRpdmVQcm9wZXJ0eVBhdGgiLCJjb250ZXh0IiwiZ2V0UGF0aCIsInRoZW4iLCJnZXRBZ2dyZWdhdGlvbiIsImFEZXBlbmRlbnRzIiwib0RlcGVuZGVudCIsIm9UYXJnZXREZXBlbmRlbnQiLCJnZXRDb250cm9sVHlwZSIsIm1ldGFQYXRoIiwidGFyZ2V0cyIsImdldENvbnRlbnQiLCJfb1RhcmdldERlcGVuZGVudCIsImlzQSIsImlzVmFsdWVIZWxwUmVxdWlyZWQiLCJiSW5GaWx0ZXJGaWVsZCIsIm9Qcm9wZXJ0eUNvbnRleHQiLCJzVmFsdWVIZWxwUHJvcGVydHkiLCJiUmVhZE9ubHkiLCJhbGwiLCJhUmVzdWx0cyIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwid2FybmluZyIsImlzTXVsdGlWYWx1ZSIsIm9Qcm9wZXJ0eSIsImJJc011bHRpVmFsdWUiLCJmaWx0ZXJFeHByZXNzaW9uIiwidHlwZSIsInByb3BlcnR5S2V5IiwiYVJldHJpZXZlZEN1c3RvbURhdGEiLCJiaW5kIiwib0N1c3RvbURhdGEiLCJwdXNoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJEZWxlZ2F0ZVV0aWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VUcmVlTW9kaWZpZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRDb2x1bW5FeHBvcnRTZXR0aW5ncyxcblx0Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbixcblx0RXh0ZW5zaW9uRm9yQW5hbHl0aWNzLFxuXHRQcm9wZXJ0eVR5cGVDb25maWcsXG5cdFZpc3VhbFNldHRpbmdzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5Rm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHAgZnJvbSBcInNhcC9mZS9tYWNyb3MvVmFsdWVIZWxwXCI7XG5pbXBvcnQgRmllbGRIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRIZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlSUQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVIZWxwVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuXG5jb25zdCBOU19NQUNST0RBVEEgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIjtcblxuZXhwb3J0IHR5cGUgdGFibGVEZWxlZ2F0ZU1vZGVsID0ge1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG5cdHJlYWRPbmx5OiBib29sZWFuO1xuXHR0YWJsZVR5cGU6IHN0cmluZztcblx0b25DaGFuZ2U6IEZ1bmN0aW9uO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGNvbHVtbkluZm86IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj47XG5cdGNvbGxlY3Rpb246IHtcblx0XHRzUGF0aDogc3RyaW5nO1xuXHRcdG9Nb2RlbDogc3RyaW5nO1xuXHR9O1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5SW5mbyA9IHtcblx0YWRkaXRpb25hbExhYmVscz86IHN0cmluZ1tdO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUHJvcGVydHk/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdGZvcm1hdE9wdGlvbnM/OiBPYmplY3QgfCBudWxsO1xuXHRmaWx0ZXJhYmxlPzogYm9vbGVhbjtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwYWJsZT86IGJvb2xlYW47XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGlzS2V5PzogYm9vbGVhbjtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdG1heENvbmRpdGlvbnM/OiBudW1iZXI7XG5cdG1ldGFkYXRhUGF0aD86IHN0cmluZztcblx0bW9kZT86IERpc3BsYXlNb2RlO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGtleT86IHN0cmluZztcblx0cGF0aD86IHN0cmluZztcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRyZWxhdGl2ZVBhdGg/OiBzdHJpbmc7XG5cdHNvcnRhYmxlPzogYm9vbGVhbjtcblx0c29ydERpcmVjdGlvbj86IHN0cmluZztcblx0dGV4dD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcblx0dHlwZUNvbmZpZz86IFByb3BlcnR5VHlwZUNvbmZpZztcblx0dHlwZT86IHN0cmluZztcblx0dW5pdD86IHN0cmluZztcblx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0dmlzaWJsZT86IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzPzogVmlzdWFsU2V0dGluZ3M7XG5cdGV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlPzogc3RyaW5nO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdGFnZ3JlZ2F0YWJsZT86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xufTtcblxuZnVuY3Rpb24gX3JldHJpZXZlTW9kZWwodGhpczogeyBtb2RlbE5hbWU6IHN0cmluZzsgY29udHJvbDogYW55OyByZXNvbHZlOiBGdW5jdGlvbiB9KSB7XG5cdHRoaXMuY29udHJvbC5kZXRhY2hNb2RlbENvbnRleHRDaGFuZ2UoX3JldHJpZXZlTW9kZWwsIHRoaXMpO1xuXHRjb25zdCBzTW9kZWxOYW1lID0gdGhpcy5tb2RlbE5hbWUsXG5cdFx0b01vZGVsID0gdGhpcy5jb250cm9sLmdldE1vZGVsKHNNb2RlbE5hbWUpO1xuXG5cdGlmIChvTW9kZWwpIHtcblx0XHR0aGlzLnJlc29sdmUob01vZGVsKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLmNvbnRyb2wuYXR0YWNoTW9kZWxDb250ZXh0Q2hhbmdlKF9yZXRyaWV2ZU1vZGVsLCB0aGlzKTtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllciA9IHtcblx0Z2V0QWdncmVnYXRpb246IEZ1bmN0aW9uO1xuXHRnZXRQcm9wZXJ0eTogRnVuY3Rpb247XG5cdHNldFByb3BlcnR5OiBGdW5jdGlvbjtcblx0aW5zZXJ0QWdncmVnYXRpb246IEZ1bmN0aW9uO1xufTtcbmFzeW5jIGZ1bmN0aW9uIGdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIoY29udHJvbDogVUk1RWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBjdXN0b21EYXRhID0gYXdhaXQgRGVsZWdhdGVVdGlsLnJldHJpZXZlQ3VzdG9tRGF0YU5vZGUoY29udHJvbCwgcHJvcGVydHksIG1vZGlmaWVyKTtcblx0aWYgKGN1c3RvbURhdGEubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG1vZGlmaWVyLmdldFByb3BlcnR5KGN1c3RvbURhdGFbMF0sIFwidmFsdWVcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5jb25zdCBEZWxlZ2F0ZVV0aWwgPSB7XG5cdEZFVENIRURfUFJPUEVSVElFU19EQVRBX0tFWTogXCJzYXBfZmVfQ29udHJvbERlbGVnYXRlX3Byb3BlcnR5SW5mb01hcFwiLFxuXHRzZXRDYWNoZWRQcm9wZXJ0aWVzKGNvbnRyb2w6IGFueSwgZmV0Y2hlZFByb3BlcnRpZXM6IFByb3BlcnR5SW5mb1tdKSB7XG5cdFx0Ly8gZG8gbm90IGNhY2hlIGR1cmluZyB0ZW1wbGF0aW5nLCBlbHNlIGl0IGJlY29tZXMgcGFydCBvZiB0aGUgY2FjaGVkIHZpZXdcblx0XHRpZiAoY29udHJvbCBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGtleSA9IERlbGVnYXRlVXRpbC5GRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVk7XG5cdFx0RGVsZWdhdGVVdGlsLnNldEN1c3RvbURhdGEoY29udHJvbCwga2V5LCBmZXRjaGVkUHJvcGVydGllcyBhcyB1bmtub3duIGFzIHN0cmluZyk7XG5cdH0sXG5cdGdldENhY2hlZFByb3BlcnRpZXMoY29udHJvbDogYW55KTogUHJvcGVydHlJbmZvW10gfCBudWxsIHtcblx0XHQvLyBwcm9wZXJ0aWVzIGFyZSBub3QgY2FjaGVkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0aWYgKGNvbnRyb2wgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IGtleSA9IERlbGVnYXRlVXRpbC5GRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVk7XG5cdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKGNvbnRyb2wsIGtleSk7XG5cdH0sXG5cblx0Z2V0Q3VzdG9tRGF0YShvQ29udHJvbDogYW55LCBzUHJvcGVydHk6IGFueSwgb01vZGlmaWVyPzogYW55KSB7XG5cdFx0Ly8gSWYgTW9kaWZpZXIgaXMgZ2l2ZW4sIHRoZSBtZXRob2QgbXVzdCBleGVjdXRlIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm4gYSBQcm9taXNlXG5cdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0cmV0dXJuIGdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIob0NvbnRyb2wsIHNQcm9wZXJ0eSwgb01vZGlmaWVyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRGVsZWdhdGUgaW52b2tlZCBmcm9tIGEgbm9uLWZsZXggY2hhbmdlIC0gRmlsdGVyQmFyRGVsZWdhdGUuX2FkZFAxM25JdGVtIGZvciBPUCB0YWJsZSBmaWx0ZXJpbmcsIEZpbHRlckJhckRlbGVnYXRlLmZldGNoUHJvcGVydGllcyBldGMuXG5cdFx0XHRpZiAob0NvbnRyb2wgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRcdGlmIChvQ29udHJvbCBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sLmdldEF0dHJpYnV0ZU5TKE5TX01BQ1JPREFUQSwgc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0NvbnRyb2wuZGF0YSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sLmRhdGEoc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH0sXG5cdHNldEN1c3RvbURhdGEob0NvbnRyb2w6IEVsZW1lbnQgfCBDb250cm9sLCBzUHJvcGVydHk6IHN0cmluZywgdlZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0aWYgKG9Db250cm9sICYmIHNQcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG9Db250cm9sIGluc3RhbmNlb2Ygd2luZG93LkVsZW1lbnQpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sLnNldEF0dHJpYnV0ZU5TKE5TX01BQ1JPREFUQSwgYGN1c3RvbURhdGE6JHtzUHJvcGVydHl9YCwgdlZhbHVlIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRyb2wuZGF0YSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbC5kYXRhKHNQcm9wZXJ0eSwgdlZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGZldGNoUHJvcGVydGllc0ZvckVudGl0eShzRW50aXR5U2V0OiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogdW5rbm93biB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzRW50aXR5U2V0fS9gKTtcblx0fSxcblx0ZmV0Y2hBbm5vdGF0aW9uc0ZvckVudGl0eShzRW50aXR5U2V0OiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogdW5rbm93biB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzRW50aXR5U2V0fUBgKTtcblx0fSxcblx0ZmV0Y2hNb2RlbChvQ29udHJvbDogYW55KTogUHJvbWlzZTxNb2RlbD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0Y29uc3Qgc01vZGVsTmFtZSA9IG9Db250cm9sLmdldERlbGVnYXRlKCkucGF5bG9hZCAmJiBvQ29udHJvbC5nZXREZWxlZ2F0ZSgpLnBheWxvYWQubW9kZWxOYW1lLFxuXHRcdFx0XHRvQ29udGV4dCA9IHsgbW9kZWxOYW1lOiBzTW9kZWxOYW1lLCBjb250cm9sOiBvQ29udHJvbCwgcmVzb2x2ZTogcmVzb2x2ZSB9O1xuXHRcdFx0X3JldHJpZXZlTW9kZWwuY2FsbChvQ29udGV4dCk7XG5cdFx0fSk7XG5cdH0sXG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KHNGcmFnbWVudE5hbWU6IGFueSwgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnksIG9PcHRpb25zOiBhbnksIG9Nb2RpZmllcj86IGFueSkge1xuXHRcdHJldHVybiBDb21tb25VdGlscy50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIG9PcHRpb25zLCBvTW9kaWZpZXIpO1xuXHR9LFxuXHRkb2VzVmFsdWVIZWxwRXhpc3QobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBtUGFyYW1ldGVycy5zUHJvcGVydHlOYW1lIHx8IFwiXCI7XG5cdFx0Y29uc3Qgc1ZhbHVlSGVscFR5cGUgPSBtUGFyYW1ldGVycy5zVmFsdWVIZWxwVHlwZSB8fCBcIlwiO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBtUGFyYW1ldGVycy5vTWV0YU1vZGVsO1xuXHRcdGNvbnN0IG9Nb2RpZmllciA9IG1QYXJhbWV0ZXJzLm9Nb2RpZmllcjtcblx0XHRjb25zdCBzT3JpZ2luYWxQcm9wZXJ0eSA9IGAke21QYXJhbWV0ZXJzLnNCaW5kaW5nUGF0aH0vJHtzUHJvcGVydHlOYW1lfWA7XG5cdFx0Y29uc3QgcHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzT3JpZ2luYWxQcm9wZXJ0eSk7XG5cdFx0bGV0IHZhbHVlSGVscFByb3BlcnR5UGF0aCA9IEZpZWxkSGVscGVyLnZhbHVlSGVscFByb3BlcnR5KHByb3BlcnR5Q29udGV4dCk7XG5cdFx0Y29uc3QgYklzQWJzb2x1dGUgPSBtUGFyYW1ldGVycy5zQmluZGluZ1BhdGggJiYgbVBhcmFtZXRlcnMuc0JpbmRpbmdQYXRoLmluZGV4T2YoXCIvXCIpID09PSAwO1xuXG5cdFx0Ly8gdW5pdC9jdXJyZW5jeVxuXHRcdGlmICh2YWx1ZUhlbHBQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIkUGF0aFwiKSkge1xuXHRcdFx0dmFsdWVIZWxwUHJvcGVydHlQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QodmFsdWVIZWxwUHJvcGVydHlQYXRoKTtcblx0XHR9XG5cdFx0aWYgKGJJc0Fic29sdXRlICYmIHZhbHVlSGVscFByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSAhPT0gMCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMocHJvcGVydHlDb250ZXh0KTtcblx0XHRcdGNvbnN0IHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoID1cblx0XHRcdFx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5RGF0YU1vZGVsLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eSkgfHxcblx0XHRcdFx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgocHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHVuaXRPckN1cnJlbmN5RGF0YU1vZGVsID0gZW5oYW5jZURhdGFNb2RlbFBhdGgocHJvcGVydHlEYXRhTW9kZWwsIHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoKTtcblx0XHRcdHZhbHVlSGVscFByb3BlcnR5UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgodW5pdE9yQ3VycmVuY3lEYXRhTW9kZWwpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNHZW5lcmF0ZWRJZCA9IGdlbmVyYXRlSUQoXG5cdFx0XHRtUGFyYW1ldGVycy5mbGV4SWQsXG5cdFx0XHRnZW5lcmF0ZShbb01vZGlmaWVyID8gb01vZGlmaWVyLmdldElkKG1QYXJhbWV0ZXJzLm9Db250cm9sKSA6IG1QYXJhbWV0ZXJzLm9Db250cm9sLmdldElkKCksIHNWYWx1ZUhlbHBUeXBlXSksXG5cdFx0XHRnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aChwcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoc09yaWdpbmFsUHJvcGVydHkpLCB7XG5cdFx0XHRcdGNvbnRleHQ6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLm9NZXRhTW9kZWw7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc09yaWdpbmFsUHJvcGVydHk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGFzIGFueVxuXHRcdFx0fSksXG5cdFx0XHRnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aChwcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkodmFsdWVIZWxwUHJvcGVydHlQYXRoKSwge1xuXHRcdFx0XHRjb250ZXh0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6ICgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5vTWV0YU1vZGVsO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0UGF0aDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlSGVscFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYXMgYW55XG5cdFx0XHR9KVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0XHRcdHJldHVybiBvTW9kaWZpZXIuZ2V0QWdncmVnYXRpb24obVBhcmFtZXRlcnMub0NvbnRyb2wsIFwiZGVwZW5kZW50c1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbVBhcmFtZXRlcnMub0NvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJkZXBlbmRlbnRzXCIpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChhRGVwZW5kZW50czogVUk1RWxlbWVudFtdKSB7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50cykge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgb0RlcGVuZGVudCBvZiBhRGVwZW5kZW50cykge1xuXHRcdFx0XHRcdFx0bGV0IG9UYXJnZXREZXBlbmRlbnQ6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQgPSBvRGVwZW5kZW50O1xuXHRcdFx0XHRcdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0b01vZGlmaWVyLmdldENvbnRyb2xUeXBlKG9EZXBlbmRlbnQpID09PSBcInNhcC5mZS5tYWNyb3MuVmFsdWVIZWxwXCIgJiZcblx0XHRcdFx0XHRcdFx0XHQoYXdhaXQgb01vZGlmaWVyLmdldFByb3BlcnR5KG9EZXBlbmRlbnQsIFwibWV0YVBhdGhcIikpID09PSBtUGFyYW1ldGVycy5tZXRhUGF0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiB4bWwgdmFsaWRhdGUgYWdhaW5zdCB0aGUgbWV0YVBhdGggb2YgdGhlIFZhbHVlSGVscFxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdG9Nb2RpZmllci5nZXRDb250cm9sVHlwZShvRGVwZW5kZW50KSA9PT0gXCJzYXAuZmUubWFjcm9zLlZhbHVlSGVscFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0b01vZGlmaWVyLnRhcmdldHMgIT09IFwieG1sVHJlZVwiXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHhtbCB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBtZXRhUGF0aCBvZiB0aGUgVmFsdWVIZWxwXG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldERlcGVuZGVudCA9IChvRGVwZW5kZW50IGFzIFZhbHVlSGVscCkuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChvVGFyZ2V0RGVwZW5kZW50ICYmIG9Nb2RpZmllci5nZXRJZChvVGFyZ2V0RGVwZW5kZW50KSA9PT0gc0dlbmVyYXRlZElkKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGVwZW5kZW50LmlzQTxWYWx1ZUhlbHA+KFwic2FwLmZlLm1hY3Jvcy5WYWx1ZUhlbHBcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0RGVwZW5kZW50ID0gb0RlcGVuZGVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXREZXBlbmRlbnQ/LmdldElkKCkgPT09IHNHZW5lcmF0ZWRJZCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXHR9LFxuXHRpc1ZhbHVlSGVscFJlcXVpcmVkKG1QYXJhbWV0ZXJzOiBhbnksIGJJbkZpbHRlckZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBtUGFyYW1ldGVycy5zUHJvcGVydHlOYW1lIHx8IFwiXCIsXG5cdFx0XHRvTWV0YU1vZGVsID0gbVBhcmFtZXRlcnMub01ldGFNb2RlbCxcblx0XHRcdHNQcm9wZXJ0eSA9IGAke21QYXJhbWV0ZXJzLnNCaW5kaW5nUGF0aH0vJHtzUHJvcGVydHlOYW1lfWAsXG5cdFx0XHRvUHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUHJvcGVydHkpLFxuXHRcdFx0c1ZhbHVlSGVscFByb3BlcnR5ID0gRmllbGRIZWxwZXIudmFsdWVIZWxwUHJvcGVydHkob1Byb3BlcnR5Q29udGV4dCwgYkluRmlsdGVyRmllbGQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q3VzdG9tRGF0YShtUGFyYW1ldGVycy5vQ29udHJvbCwgXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiLCBtUGFyYW1ldGVycy5vTW9kaWZpZXIpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoYlJlYWRPbmx5OiBhbnkpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgY29udHJvbCBpcyByZWFkLW9ubHkuIElmIHllcywgbm8gbmVlZCBvZiBhIHZhbHVlIGhlbHAuXG5cdFx0XHRcdGJSZWFkT25seSA9IHR5cGVvZiBiUmVhZE9ubHkgPT09IFwiYm9vbGVhblwiID8gYlJlYWRPbmx5IDogYlJlYWRPbmx5ID09PSBcInRydWVcIjtcblx0XHRcdFx0aWYgKGJSZWFkT25seSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBFbHNlLCBjaGVjayB3aGV0aGVyIFZhbHVlIEhlbHAgcmVsZXZhbnQgYW5ub3RhdGlvbiBleGlzdHMgZm9yIHRoZSBwcm9wZXJ0eS5cblx0XHRcdFx0Ly8gVE9ETyB1c2UgUHJvcGVydHlGb3JtYXR0ZXIuaGFzVmFsdWVIZWxwICgpID0+IGlmIGRvaW5nIHNvLCBRVW5pdCB0ZXN0cyBmYWlsIGR1ZSB0byBtb2NrZWQgbW9kZWwgaW1wbGVtZW50YXRpb25cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtcblx0XHRcdFx0XHRvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3QoYCR7c1ZhbHVlSGVscFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzYCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KGAke3NWYWx1ZUhlbHBQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFJlZmVyZW5jZXNgKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3QoYCR7c1ZhbHVlSGVscFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0TWFwcGluZ2ApLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzVmFsdWVIZWxwUHJvcGVydHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RgKVxuXHRcdFx0XHRdKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoYVJlc3VsdHM6IGFueVtdKSB7XG5cdFx0XHRcdHJldHVybiAhIWFSZXN1bHRzWzBdIHx8ICEhYVJlc3VsdHNbMV0gfHwgISFhUmVzdWx0c1syXSB8fCAhIWFSZXN1bHRzWzNdO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIGN1c3RvbSBkYXRhIC8gdmFsdWUgbGlzdCBhbm5vdGF0aW9uIHZhbHVlc1wiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0sXG5cdGlzTXVsdGlWYWx1ZShvUHJvcGVydHk6IGFueSkge1xuXHRcdGxldCBiSXNNdWx0aVZhbHVlID0gdHJ1ZTtcblx0XHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdFx0c3dpdGNoIChvUHJvcGVydHkuZmlsdGVyRXhwcmVzc2lvbikge1xuXHRcdFx0Y2FzZSBcIlNlYXJjaEV4cHJlc3Npb25cIjpcblx0XHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdFx0Y2FzZSBcIlNpbmdsZVZhbHVlXCI6XG5cdFx0XHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKG9Qcm9wZXJ0eS50eXBlICYmIG9Qcm9wZXJ0eS50eXBlLmluZGV4T2YoXCJCb29sZWFuXCIpID4gMCkge1xuXHRcdFx0YklzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gYklzTXVsdGlWYWx1ZTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhIGN1c3RvbSBkYXRhIG5vZGUgZnJvbSB0aGUgY29udHJvbC5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgY3VzdG9tIGRhdGEgbm9kZVxuXHQgKiBAcGFyYW0gcHJvcGVydHlLZXkgVGhlIGtleSBvZiB0aGUgY3VzdG9tIGRhdGEgbm9kZSB0byByZXRyaWV2ZVxuXHQgKiBAcGFyYW0gbW9kaWZpZXIgVGhlIG1vZGlmaWVyIGZvciB0aGUgY29udHJvbFxuXHQgKiBAcmV0dXJucyAtIFRoZSBjdXN0b20gZGF0YSBub2RlXG5cdCAqL1xuXHRhc3luYyByZXRyaWV2ZUN1c3RvbURhdGFOb2RlKGNvbnRyb2w6IFVJNUVsZW1lbnQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIG1vZGlmaWVyOiBCYXNlVHJlZU1vZGlmaWVyKTogUHJvbWlzZTxFbGVtZW50W10+IHtcblx0XHRjb25zdCBjdXN0b21EYXRhOiBFbGVtZW50W10gPSBbXTtcblx0XHRjb25zdCBhUmV0cmlldmVkQ3VzdG9tRGF0YSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXG5cdFx0XHRtb2RpZmllci5nZXRBZ2dyZWdhdGlvbi5iaW5kKG1vZGlmaWVyLCBjb250cm9sLCBcImN1c3RvbURhdGFcIikgYXMgKCkgPT4gUHJvbWlzZTxFbGVtZW50W10+XG5cdFx0KTtcblxuXHRcdC8vIFByb2Nlc3MgZWFjaCByZXRyaWV2ZWQgY3VzdG9tIGRhdGEgZWxlbWVudFxuXHRcdGZvciAoY29uc3Qgb0N1c3RvbURhdGEgb2YgYVJldHJpZXZlZEN1c3RvbURhdGEpIHtcblx0XHRcdGNvbnN0IGtleSA9IGF3YWl0IG1vZGlmaWVyLmdldFByb3BlcnR5KG9DdXN0b21EYXRhLCBcImtleVwiKTtcblx0XHRcdGlmIChrZXkgPT09IHByb3BlcnR5S2V5KSB7XG5cdFx0XHRcdGN1c3RvbURhdGEucHVzaChvQ3VzdG9tRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGN1c3RvbURhdGE7XG5cdH1cbn07XG5leHBvcnQgZGVmYXVsdCBEZWxlZ2F0ZVV0aWw7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztFQTBCQSxNQUFNQSxZQUFZLEdBQUcsa0VBQWtFO0VBd0R2RixTQUFTQyxjQUFjQSxDQUFBLEVBQStEO0lBQ3JGLElBQUksQ0FBQ0MsT0FBTyxDQUFDQyx3QkFBd0IsQ0FBQ0YsY0FBYyxFQUFFLElBQUksQ0FBQztJQUMzRCxNQUFNRyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxTQUFTO01BQ2hDQyxNQUFNLEdBQUcsSUFBSSxDQUFDSixPQUFPLENBQUNLLFFBQVEsQ0FBQ0gsVUFBVSxDQUFDO0lBRTNDLElBQUlFLE1BQU0sRUFBRTtNQUNYLElBQUksQ0FBQ0UsT0FBTyxDQUFDRixNQUFNLENBQUM7SUFDckIsQ0FBQyxNQUFNO01BQ04sSUFBSSxDQUFDSixPQUFPLENBQUNPLHdCQUF3QixDQUFDUixjQUFjLEVBQUUsSUFBSSxDQUFDO0lBQzVEO0VBQ0Q7RUFRQSxlQUFlUyx5QkFBeUJBLENBQUNSLE9BQW1CLEVBQUVTLFFBQWdCLEVBQUVDLFFBQTBCLEVBQStCO0lBQ3hJLE1BQU1DLFVBQVUsR0FBRyxNQUFNQyxZQUFZLENBQUNDLHNCQUFzQixDQUFDYixPQUFPLEVBQUVTLFFBQVEsRUFBRUMsUUFBUSxDQUFDO0lBQ3pGLElBQUlDLFVBQVUsQ0FBQ0csTUFBTSxLQUFLLENBQUMsRUFBRTtNQUM1QixPQUFPSixRQUFRLENBQUNLLFdBQVcsQ0FBQ0osVUFBVSxDQUFDLENBQUMsQ0FB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
|
|
238
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOU19NQUNST0RBVEEiLCJfcmV0cmlldmVNb2RlbCIsImNvbnRyb2wiLCJkZXRhY2hNb2RlbENvbnRleHRDaGFuZ2UiLCJzTW9kZWxOYW1lIiwibW9kZWxOYW1lIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJyZXNvbHZlIiwiYXR0YWNoTW9kZWxDb250ZXh0Q2hhbmdlIiwiZ2V0Q3VzdG9tRGF0YVdpdGhNb2RpZmllciIsInByb3BlcnR5IiwibW9kaWZpZXIiLCJjdXN0b21EYXRhIiwiRGVsZWdhdGVVdGlsIiwicmV0cmlldmVDdXN0b21EYXRhTm9kZSIsImxlbmd0aCIsImdldFByb3BlcnR5IiwidW5kZWZpbmVkIiwiRkVUQ0hFRF9QUk9QRVJUSUVTX0RBVEFfS0VZIiwic2V0Q2FjaGVkUHJvcGVydGllcyIsImZldGNoZWRQcm9wZXJ0aWVzIiwid2luZG93IiwiRWxlbWVudCIsImtleSIsInNldEN1c3RvbURhdGEiLCJnZXRDYWNoZWRQcm9wZXJ0aWVzIiwiZ2V0Q3VzdG9tRGF0YSIsIm9Db250cm9sIiwic1Byb3BlcnR5Iiwib01vZGlmaWVyIiwiZ2V0QXR0cmlidXRlTlMiLCJkYXRhIiwiRnVuY3Rpb24iLCJ2VmFsdWUiLCJzZXRBdHRyaWJ1dGVOUyIsImZldGNoUHJvcGVydGllc0ZvckVudGl0eSIsInNFbnRpdHlTZXQiLCJvTWV0YU1vZGVsIiwicmVxdWVzdE9iamVjdCIsImZldGNoQW5ub3RhdGlvbnNGb3JFbnRpdHkiLCJmZXRjaE1vZGVsIiwiUHJvbWlzZSIsImdldERlbGVnYXRlIiwicGF5bG9hZCIsIm9Db250ZXh0IiwiY2FsbCIsInRlbXBsYXRlQ29udHJvbEZyYWdtZW50Iiwic0ZyYWdtZW50TmFtZSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9PcHRpb25zIiwiQ29tbW9uVXRpbHMiLCJkb2VzVmFsdWVIZWxwRXhpc3QiLCJtUGFyYW1ldGVycyIsInNQcm9wZXJ0eU5hbWUiLCJzVmFsdWVIZWxwVHlwZSIsInNPcmlnaW5hbFByb3BlcnR5Iiwic0JpbmRpbmdQYXRoIiwicHJvcGVydHlDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ2YWx1ZUhlbHBQcm9wZXJ0eVBhdGgiLCJGaWVsZEhlbHBlciIsInZhbHVlSGVscFByb3BlcnR5IiwiYklzQWJzb2x1dGUiLCJpbmRleE9mIiwiaW5jbHVkZXMiLCJnZXRPYmplY3QiLCJwcm9wZXJ0eURhdGFNb2RlbCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwidGFyZ2V0T2JqZWN0IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJ1bml0T3JDdXJyZW5jeURhdGFNb2RlbCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsInNHZW5lcmF0ZWRJZCIsImdlbmVyYXRlSUQiLCJmbGV4SWQiLCJnZW5lcmF0ZSIsImdldElkIiwiZ2V0UmVsYXRpdmVQcm9wZXJ0eVBhdGgiLCJjb250ZXh0IiwiZ2V0UGF0aCIsInRoZW4iLCJnZXRBZ2dyZWdhdGlvbiIsImFEZXBlbmRlbnRzIiwib0RlcGVuZGVudCIsIm9UYXJnZXREZXBlbmRlbnQiLCJfZ2V0UGF5bG9hZCIsImdldENvbnRyb2xUeXBlIiwibWV0YVBhdGgiLCJ0YXJnZXRzIiwiZ2V0Q29udGVudCIsImdldFBheWxvYWQiLCJwcm9wZXJ0eVBhdGgiLCJfb1RhcmdldERlcGVuZGVudCIsImlzQSIsImlzVmFsdWVIZWxwUmVxdWlyZWQiLCJiSW5GaWx0ZXJGaWVsZCIsIm9Qcm9wZXJ0eUNvbnRleHQiLCJzVmFsdWVIZWxwUHJvcGVydHkiLCJiUmVhZE9ubHkiLCJhbGwiLCJhUmVzdWx0cyIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwid2FybmluZyIsImlzTXVsdGlWYWx1ZSIsIm9Qcm9wZXJ0eSIsImJJc011bHRpVmFsdWUiLCJmaWx0ZXJFeHByZXNzaW9uIiwidHlwZSIsInByb3BlcnR5S2V5IiwiYVJldHJpZXZlZEN1c3RvbURhdGEiLCJiaW5kIiwib0N1c3RvbURhdGEiLCJwdXNoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJEZWxlZ2F0ZVV0aWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VUcmVlTW9kaWZpZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRDb2x1bW5FeHBvcnRTZXR0aW5ncyxcblx0Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbixcblx0RXh0ZW5zaW9uRm9yQW5hbHl0aWNzLFxuXHRQcm9wZXJ0eVR5cGVDb25maWcsXG5cdFZpc3VhbFNldHRpbmdzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5Rm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHAgZnJvbSBcInNhcC9mZS9tYWNyb3MvVmFsdWVIZWxwXCI7XG5pbXBvcnQgRmllbGRIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRIZWxwZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlSUQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVIZWxwVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTURDVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuXG5jb25zdCBOU19NQUNST0RBVEEgPSBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIjtcblxuZXhwb3J0IHR5cGUgdGFibGVEZWxlZ2F0ZU1vZGVsID0ge1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG5cdHJlYWRPbmx5OiBib29sZWFuO1xuXHR0YWJsZVR5cGU6IHN0cmluZztcblx0b25DaGFuZ2U6IEZ1bmN0aW9uO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGNvbHVtbkluZm86IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj47XG5cdGNvbGxlY3Rpb246IHtcblx0XHRzUGF0aDogc3RyaW5nO1xuXHRcdG9Nb2RlbDogc3RyaW5nO1xuXHR9O1xuXHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5SW5mbyA9IHtcblx0YWRkaXRpb25hbExhYmVscz86IHN0cmluZ1tdO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uUHJvcGVydHk/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdGZvcm1hdE9wdGlvbnM/OiBPYmplY3QgfCBudWxsO1xuXHRmaWx0ZXJhYmxlPzogYm9vbGVhbjtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwYWJsZT86IGJvb2xlYW47XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdGlzS2V5PzogYm9vbGVhbjtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdG1heENvbmRpdGlvbnM/OiBudW1iZXI7XG5cdG1ldGFkYXRhUGF0aD86IHN0cmluZztcblx0bW9kZT86IERpc3BsYXlNb2RlO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGtleT86IHN0cmluZztcblx0cGF0aD86IHN0cmluZztcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRyZWxhdGl2ZVBhdGg/OiBzdHJpbmc7XG5cdHNvcnRhYmxlPzogYm9vbGVhbjtcblx0c29ydERpcmVjdGlvbj86IHN0cmluZztcblx0dGV4dD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcblx0dHlwZUNvbmZpZz86IFByb3BlcnR5VHlwZUNvbmZpZztcblx0dHlwZT86IHN0cmluZztcblx0dW5pdD86IHN0cmluZztcblx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0dmlzaWJsZT86IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzPzogVmlzdWFsU2V0dGluZ3M7XG5cdGV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlPzogc3RyaW5nO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdGFnZ3JlZ2F0YWJsZT86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xufTtcblxuZnVuY3Rpb24gX3JldHJpZXZlTW9kZWwodGhpczogeyBtb2RlbE5hbWU6IHN0cmluZzsgY29udHJvbDogYW55OyByZXNvbHZlOiBGdW5jdGlvbiB9KSB7XG5cdHRoaXMuY29udHJvbC5kZXRhY2hNb2RlbENvbnRleHRDaGFuZ2UoX3JldHJpZXZlTW9kZWwsIHRoaXMpO1xuXHRjb25zdCBzTW9kZWxOYW1lID0gdGhpcy5tb2RlbE5hbWUsXG5cdFx0b01vZGVsID0gdGhpcy5jb250cm9sLmdldE1vZGVsKHNNb2RlbE5hbWUpO1xuXG5cdGlmIChvTW9kZWwpIHtcblx0XHR0aGlzLnJlc29sdmUob01vZGVsKTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLmNvbnRyb2wuYXR0YWNoTW9kZWxDb250ZXh0Q2hhbmdlKF9yZXRyaWV2ZU1vZGVsLCB0aGlzKTtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBNb2RpZmllciA9IHtcblx0Z2V0QWdncmVnYXRpb246IEZ1bmN0aW9uO1xuXHRnZXRQcm9wZXJ0eTogRnVuY3Rpb247XG5cdHNldFByb3BlcnR5OiBGdW5jdGlvbjtcblx0aW5zZXJ0QWdncmVnYXRpb246IEZ1bmN0aW9uO1xufTtcbmFzeW5jIGZ1bmN0aW9uIGdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIoY29udHJvbDogVUk1RWxlbWVudCwgcHJvcGVydHk6IHN0cmluZywgbW9kaWZpZXI6IEJhc2VUcmVlTW9kaWZpZXIpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBjdXN0b21EYXRhID0gYXdhaXQgRGVsZWdhdGVVdGlsLnJldHJpZXZlQ3VzdG9tRGF0YU5vZGUoY29udHJvbCwgcHJvcGVydHksIG1vZGlmaWVyKTtcblx0aWYgKGN1c3RvbURhdGEubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG1vZGlmaWVyLmdldFByb3BlcnR5KGN1c3RvbURhdGFbMF0sIFwidmFsdWVcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5jb25zdCBEZWxlZ2F0ZVV0aWwgPSB7XG5cdEZFVENIRURfUFJPUEVSVElFU19EQVRBX0tFWTogXCJzYXBfZmVfQ29udHJvbERlbGVnYXRlX3Byb3BlcnR5SW5mb01hcFwiLFxuXHRzZXRDYWNoZWRQcm9wZXJ0aWVzKGNvbnRyb2w6IGFueSwgZmV0Y2hlZFByb3BlcnRpZXM6IFByb3BlcnR5SW5mb1tdKSB7XG5cdFx0Ly8gZG8gbm90IGNhY2hlIGR1cmluZyB0ZW1wbGF0aW5nLCBlbHNlIGl0IGJlY29tZXMgcGFydCBvZiB0aGUgY2FjaGVkIHZpZXdcblx0XHRpZiAoY29udHJvbCBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGtleSA9IERlbGVnYXRlVXRpbC5GRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVk7XG5cdFx0RGVsZWdhdGVVdGlsLnNldEN1c3RvbURhdGEoY29udHJvbCwga2V5LCBmZXRjaGVkUHJvcGVydGllcyBhcyB1bmtub3duIGFzIHN0cmluZyk7XG5cdH0sXG5cdGdldENhY2hlZFByb3BlcnRpZXMoY29udHJvbDogYW55KTogUHJvcGVydHlJbmZvW10gfCBudWxsIHtcblx0XHQvLyBwcm9wZXJ0aWVzIGFyZSBub3QgY2FjaGVkIGR1cmluZyB0ZW1wbGF0aW5nXG5cdFx0aWYgKGNvbnRyb2wgaW5zdGFuY2VvZiB3aW5kb3cuRWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IGtleSA9IERlbGVnYXRlVXRpbC5GRVRDSEVEX1BST1BFUlRJRVNfREFUQV9LRVk7XG5cdFx0cmV0dXJuIERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKGNvbnRyb2wsIGtleSk7XG5cdH0sXG5cblx0Z2V0Q3VzdG9tRGF0YShvQ29udHJvbDogYW55LCBzUHJvcGVydHk6IGFueSwgb01vZGlmaWVyPzogYW55KSB7XG5cdFx0Ly8gSWYgTW9kaWZpZXIgaXMgZ2l2ZW4sIHRoZSBtZXRob2QgbXVzdCBleGVjdXRlIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm4gYSBQcm9taXNlXG5cdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0cmV0dXJuIGdldEN1c3RvbURhdGFXaXRoTW9kaWZpZXIob0NvbnRyb2wsIHNQcm9wZXJ0eSwgb01vZGlmaWVyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRGVsZWdhdGUgaW52b2tlZCBmcm9tIGEgbm9uLWZsZXggY2hhbmdlIC0gRmlsdGVyQmFyRGVsZWdhdGUuX2FkZFAxM25JdGVtIGZvciBPUCB0YWJsZSBmaWx0ZXJpbmcsIEZpbHRlckJhckRlbGVnYXRlLmZldGNoUHJvcGVydGllcyBldGMuXG5cdFx0XHRpZiAob0NvbnRyb2wgJiYgc1Byb3BlcnR5KSB7XG5cdFx0XHRcdGlmIChvQ29udHJvbCBpbnN0YW5jZW9mIHdpbmRvdy5FbGVtZW50KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sLmdldEF0dHJpYnV0ZU5TKE5TX01BQ1JPREFUQSwgc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob0NvbnRyb2wuZGF0YSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sLmRhdGEoc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH0sXG5cdHNldEN1c3RvbURhdGEob0NvbnRyb2w6IEVsZW1lbnQgfCBDb250cm9sLCBzUHJvcGVydHk6IHN0cmluZywgdlZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0aWYgKG9Db250cm9sICYmIHNQcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG9Db250cm9sIGluc3RhbmNlb2Ygd2luZG93LkVsZW1lbnQpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250cm9sLnNldEF0dHJpYnV0ZU5TKE5TX01BQ1JPREFUQSwgYGN1c3RvbURhdGE6JHtzUHJvcGVydHl9YCwgdlZhbHVlIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRyb2wuZGF0YSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udHJvbC5kYXRhKHNQcm9wZXJ0eSwgdlZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGZldGNoUHJvcGVydGllc0ZvckVudGl0eShzRW50aXR5U2V0OiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogdW5rbm93biB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzRW50aXR5U2V0fS9gKTtcblx0fSxcblx0ZmV0Y2hBbm5vdGF0aW9uc0ZvckVudGl0eShzRW50aXR5U2V0OiBzdHJpbmcsIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogdW5rbm93biB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzRW50aXR5U2V0fUBgKTtcblx0fSxcblx0ZmV0Y2hNb2RlbChvQ29udHJvbDogYW55KTogUHJvbWlzZTxNb2RlbD4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0Y29uc3Qgc01vZGVsTmFtZSA9IG9Db250cm9sLmdldERlbGVnYXRlKCkucGF5bG9hZCAmJiBvQ29udHJvbC5nZXREZWxlZ2F0ZSgpLnBheWxvYWQubW9kZWxOYW1lLFxuXHRcdFx0XHRvQ29udGV4dCA9IHsgbW9kZWxOYW1lOiBzTW9kZWxOYW1lLCBjb250cm9sOiBvQ29udHJvbCwgcmVzb2x2ZTogcmVzb2x2ZSB9O1xuXHRcdFx0X3JldHJpZXZlTW9kZWwuY2FsbChvQ29udGV4dCk7XG5cdFx0fSk7XG5cdH0sXG5cdHRlbXBsYXRlQ29udHJvbEZyYWdtZW50KHNGcmFnbWVudE5hbWU6IGFueSwgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnksIG9PcHRpb25zOiBhbnksIG9Nb2RpZmllcj86IGFueSkge1xuXHRcdHJldHVybiBDb21tb25VdGlscy50ZW1wbGF0ZUNvbnRyb2xGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MsIG9PcHRpb25zLCBvTW9kaWZpZXIpO1xuXHR9LFxuXHRkb2VzVmFsdWVIZWxwRXhpc3QobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eU5hbWUgPSBtUGFyYW1ldGVycy5zUHJvcGVydHlOYW1lIHx8IFwiXCI7XG5cdFx0Y29uc3Qgc1ZhbHVlSGVscFR5cGUgPSBtUGFyYW1ldGVycy5zVmFsdWVIZWxwVHlwZSB8fCBcIlwiO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBtUGFyYW1ldGVycy5vTWV0YU1vZGVsO1xuXHRcdGNvbnN0IG9Nb2RpZmllciA9IG1QYXJhbWV0ZXJzLm9Nb2RpZmllcjtcblx0XHRjb25zdCBzT3JpZ2luYWxQcm9wZXJ0eSA9IGAke21QYXJhbWV0ZXJzLnNCaW5kaW5nUGF0aH0vJHtzUHJvcGVydHlOYW1lfWA7XG5cdFx0Y29uc3QgcHJvcGVydHlDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzT3JpZ2luYWxQcm9wZXJ0eSk7XG5cdFx0bGV0IHZhbHVlSGVscFByb3BlcnR5UGF0aCA9IEZpZWxkSGVscGVyLnZhbHVlSGVscFByb3BlcnR5KHByb3BlcnR5Q29udGV4dCk7XG5cdFx0Y29uc3QgYklzQWJzb2x1dGUgPSBtUGFyYW1ldGVycy5zQmluZGluZ1BhdGggJiYgbVBhcmFtZXRlcnMuc0JpbmRpbmdQYXRoLmluZGV4T2YoXCIvXCIpID09PSAwO1xuXG5cdFx0Ly8gdW5pdC9jdXJyZW5jeVxuXHRcdGlmICh2YWx1ZUhlbHBQcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIkUGF0aFwiKSkge1xuXHRcdFx0dmFsdWVIZWxwUHJvcGVydHlQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QodmFsdWVIZWxwUHJvcGVydHlQYXRoKTtcblx0XHR9XG5cdFx0aWYgKGJJc0Fic29sdXRlICYmIHZhbHVlSGVscFByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSAhPT0gMCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMocHJvcGVydHlDb250ZXh0KTtcblx0XHRcdGNvbnN0IHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoID1cblx0XHRcdFx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5RGF0YU1vZGVsLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eSkgfHxcblx0XHRcdFx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgocHJvcGVydHlEYXRhTW9kZWwudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHVuaXRPckN1cnJlbmN5RGF0YU1vZGVsID0gZW5oYW5jZURhdGFNb2RlbFBhdGgocHJvcGVydHlEYXRhTW9kZWwsIHVuaXRPckN1cnJlbmN5UHJvcGVydHlQYXRoKTtcblx0XHRcdHZhbHVlSGVscFByb3BlcnR5UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgodW5pdE9yQ3VycmVuY3lEYXRhTW9kZWwpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNHZW5lcmF0ZWRJZCA9IGdlbmVyYXRlSUQoXG5cdFx0XHRtUGFyYW1ldGVycy5mbGV4SWQsXG5cdFx0XHRnZW5lcmF0ZShbb01vZGlmaWVyID8gb01vZGlmaWVyLmdldElkKG1QYXJhbWV0ZXJzLm9Db250cm9sKSA6IG1QYXJhbWV0ZXJzLm9Db250cm9sLmdldElkKCksIHNWYWx1ZUhlbHBUeXBlXSksXG5cdFx0XHRnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aChwcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkoc09yaWdpbmFsUHJvcGVydHkpLCB7XG5cdFx0XHRcdGNvbnRleHQ6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLm9NZXRhTW9kZWw7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXRQYXRoOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc09yaWdpbmFsUHJvcGVydHk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGFzIGFueVxuXHRcdFx0fSksXG5cdFx0XHRnZXRSZWxhdGl2ZVByb3BlcnR5UGF0aChwcm9wZXJ0eUNvbnRleHQuZ2V0UHJvcGVydHkodmFsdWVIZWxwUHJvcGVydHlQYXRoKSwge1xuXHRcdFx0XHRjb250ZXh0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6ICgpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5vTWV0YU1vZGVsO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0UGF0aDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlSGVscFByb3BlcnR5UGF0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gYXMgYW55XG5cdFx0XHR9KVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0XHRcdHJldHVybiBvTW9kaWZpZXIuZ2V0QWdncmVnYXRpb24obVBhcmFtZXRlcnMub0NvbnRyb2wsIFwiZGVwZW5kZW50c1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbVBhcmFtZXRlcnMub0NvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJkZXBlbmRlbnRzXCIpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChhRGVwZW5kZW50czogVUk1RWxlbWVudFtdKSB7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50cykge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgb0RlcGVuZGVudCBvZiBhRGVwZW5kZW50cykge1xuXHRcdFx0XHRcdFx0bGV0IG9UYXJnZXREZXBlbmRlbnQ6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQgPSBvRGVwZW5kZW50O1xuXHRcdFx0XHRcdFx0aWYgKG9Nb2RpZmllcikge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0b01vZGlmaWVyLmdldENvbnRyb2xUeXBlKG9EZXBlbmRlbnQpID09PSBcInNhcC5mZS5tYWNyb3MuVmFsdWVIZWxwXCIgJiZcblx0XHRcdFx0XHRcdFx0XHQoYXdhaXQgb01vZGlmaWVyLmdldFByb3BlcnR5KG9EZXBlbmRlbnQsIFwibWV0YVBhdGhcIikpID09PSBtUGFyYW1ldGVycy5tZXRhUGF0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbiB4bWwgdmFsaWRhdGUgYWdhaW5zdCB0aGUgbWV0YVBhdGggb2YgdGhlIFZhbHVlSGVscFxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdG9Nb2RpZmllci5nZXRDb250cm9sVHlwZShvRGVwZW5kZW50KSA9PT0gXCJzYXAuZmUubWFjcm9zLlZhbHVlSGVscFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0b01vZGlmaWVyLnRhcmdldHMgIT09IFwieG1sVHJlZVwiXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHhtbCB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBtZXRhUGF0aCBvZiB0aGUgVmFsdWVIZWxwXG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldERlcGVuZGVudCA9IChvRGVwZW5kZW50IGFzIFZhbHVlSGVscCkuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRcdG9Nb2RpZmllci5nZXRDb250cm9sVHlwZShvRGVwZW5kZW50KSA9PT0gXCJzYXAudWkubWRjLlZhbHVlSGVscFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0b01vZGlmaWVyLnRhcmdldHMgIT09IFwieG1sVHJlZVwiICYmXG5cdFx0XHRcdFx0XHRcdFx0KChvRGVwZW5kZW50IGFzIE1EQ1ZhbHVlSGVscCkuZ2V0UGF5bG9hZCgpIGFzIHsgcHJvcGVydHlQYXRoPzogc3RyaW5nIH0pPy5wcm9wZXJ0eVBhdGggPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXRhUGF0aCAmJlxuXHRcdFx0XHRcdFx0XHRcdG9Nb2RpZmllci5nZXRJZChvVGFyZ2V0RGVwZW5kZW50KS5pbmNsdWRlcyhcIjo6RmlsdGVyRmllbGRWYWx1ZUhlbHA6OlwiKVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBzcGVjaWZpYyBjYXNlIG9mIHRoZSBPVlBcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldERlcGVuZGVudCAmJiBvTW9kaWZpZXIuZ2V0SWQob1RhcmdldERlcGVuZGVudCkgPT09IHNHZW5lcmF0ZWRJZCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAob0RlcGVuZGVudC5pc0E8VmFsdWVIZWxwPihcInNhcC5mZS5tYWNyb3MuVmFsdWVIZWxwXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldERlcGVuZGVudCA9IG9EZXBlbmRlbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChvVGFyZ2V0RGVwZW5kZW50Py5nZXRJZCgpID09PSBzR2VuZXJhdGVkSWQpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblx0fSxcblx0aXNWYWx1ZUhlbHBSZXF1aXJlZChtUGFyYW1ldGVyczogYW55LCBiSW5GaWx0ZXJGaWVsZD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gbVBhcmFtZXRlcnMuc1Byb3BlcnR5TmFtZSB8fCBcIlwiLFxuXHRcdFx0b01ldGFNb2RlbCA9IG1QYXJhbWV0ZXJzLm9NZXRhTW9kZWwsXG5cdFx0XHRzUHJvcGVydHkgPSBgJHttUGFyYW1ldGVycy5zQmluZGluZ1BhdGh9LyR7c1Byb3BlcnR5TmFtZX1gLFxuXHRcdFx0b1Byb3BlcnR5Q29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1Byb3BlcnR5KSxcblx0XHRcdHNWYWx1ZUhlbHBQcm9wZXJ0eSA9IEZpZWxkSGVscGVyLnZhbHVlSGVscFByb3BlcnR5KG9Qcm9wZXJ0eUNvbnRleHQsIGJJbkZpbHRlckZpZWxkKTtcblxuXHRcdHJldHVybiB0aGlzLmdldEN1c3RvbURhdGEobVBhcmFtZXRlcnMub0NvbnRyb2wsIFwiZGlzcGxheU1vZGVQcm9wZXJ0eUJpbmRpbmdcIiwgbVBhcmFtZXRlcnMub01vZGlmaWVyKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGJSZWFkT25seTogYW55KSB7XG5cdFx0XHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgcmVhZC1vbmx5LiBJZiB5ZXMsIG5vIG5lZWQgb2YgYSB2YWx1ZSBoZWxwLlxuXHRcdFx0XHRiUmVhZE9ubHkgPSB0eXBlb2YgYlJlYWRPbmx5ID09PSBcImJvb2xlYW5cIiA/IGJSZWFkT25seSA6IGJSZWFkT25seSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdGlmIChiUmVhZE9ubHkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gRWxzZSwgY2hlY2sgd2hldGhlciBWYWx1ZSBIZWxwIHJlbGV2YW50IGFubm90YXRpb24gZXhpc3RzIGZvciB0aGUgcHJvcGVydHkuXG5cdFx0XHRcdC8vIFRPRE8gdXNlIFByb3BlcnR5Rm9ybWF0dGVyLmhhc1ZhbHVlSGVscCAoKSA9PiBpZiBkb2luZyBzbywgUVVuaXQgdGVzdHMgZmFpbCBkdWUgdG8gbW9ja2VkIG1vZGVsIGltcGxlbWVudGF0aW9uXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KGAke3NWYWx1ZUhlbHBQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlc2ApLFxuXHRcdFx0XHRcdG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzVmFsdWVIZWxwUHJvcGVydHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5WYWx1ZUxpc3RSZWZlcmVuY2VzYCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KGAke3NWYWx1ZUhlbHBQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlZhbHVlTGlzdE1hcHBpbmdgKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3QoYCR7c1ZhbHVlSGVscFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVmFsdWVMaXN0YClcblx0XHRcdFx0XSk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFSZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRyZXR1cm4gISFhUmVzdWx0c1swXSB8fCAhIWFSZXN1bHRzWzFdIHx8ICEhYVJlc3VsdHNbMl0gfHwgISFhUmVzdWx0c1szXTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyBjdXN0b20gZGF0YSAvIHZhbHVlIGxpc3QgYW5ub3RhdGlvbiB2YWx1ZXNcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9LFxuXHRpc011bHRpVmFsdWUob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRsZXQgYklzTXVsdGlWYWx1ZSA9IHRydWU7XG5cdFx0Ly9TaW5nbGVWYWx1ZSB8IE11bHRpVmFsdWUgfCBTaW5nbGVSYW5nZSB8IE11bHRpUmFuZ2UgfCBTZWFyY2hFeHByZXNzaW9uIHwgTXVsdGlSYW5nZU9yU2VhcmNoRXhwcmVzc2lvblxuXHRcdHN3aXRjaCAob1Byb3BlcnR5LmZpbHRlckV4cHJlc3Npb24pIHtcblx0XHRcdGNhc2UgXCJTZWFyY2hFeHByZXNzaW9uXCI6XG5cdFx0XHRjYXNlIFwiU2luZ2xlUmFuZ2VcIjpcblx0XHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmIChvUHJvcGVydHkudHlwZSAmJiBvUHJvcGVydHkudHlwZS5pbmRleE9mKFwiQm9vbGVhblwiKSA+IDApIHtcblx0XHRcdGJJc011bHRpVmFsdWUgPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGJJc011bHRpVmFsdWU7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYSBjdXN0b20gZGF0YSBub2RlIGZyb20gdGhlIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGN1c3RvbSBkYXRhIG5vZGVcblx0ICogQHBhcmFtIHByb3BlcnR5S2V5IFRoZSBrZXkgb2YgdGhlIGN1c3RvbSBkYXRhIG5vZGUgdG8gcmV0cmlldmVcblx0ICogQHBhcmFtIG1vZGlmaWVyIFRoZSBtb2RpZmllciBmb3IgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgLSBUaGUgY3VzdG9tIGRhdGEgbm9kZVxuXHQgKi9cblx0YXN5bmMgcmV0cmlldmVDdXN0b21EYXRhTm9kZShjb250cm9sOiBVSTVFbGVtZW50LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBtb2RpZmllcjogQmFzZVRyZWVNb2RpZmllcik6IFByb21pc2U8RWxlbWVudFtdPiB7XG5cdFx0Y29uc3QgY3VzdG9tRGF0YTogRWxlbWVudFtdID0gW107XG5cdFx0Y29uc3QgYVJldHJpZXZlZEN1c3RvbURhdGEgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKFxuXHRcdFx0bW9kaWZpZXIuZ2V0QWdncmVnYXRpb24uYmluZChtb2RpZmllciwgY29udHJvbCwgXCJjdXN0b21EYXRhXCIpIGFzICgpID0+IFByb21pc2U8RWxlbWVudFtdPlxuXHRcdCk7XG5cblx0XHQvLyBQcm9jZXNzIGVhY2ggcmV0cmlldmVkIGN1c3RvbSBkYXRhIGVsZW1lbnRcblx0XHRmb3IgKGNvbnN0IG9DdXN0b21EYXRhIG9mIGFSZXRyaWV2ZWRDdXN0b21EYXRhKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBhd2FpdCBtb2RpZmllci5nZXRQcm9wZXJ0eShvQ3VzdG9tRGF0YSwgXCJrZXlcIik7XG5cdFx0XHRpZiAoa2V5ID09PSBwcm9wZXJ0eUtleSkge1xuXHRcdFx0XHRjdXN0b21EYXRhLnB1c2gob0N1c3RvbURhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjdXN0b21EYXRhO1xuXHR9XG59O1xuZXhwb3J0IGRlZmF1bHQgRGVsZWdhdGVVdGlsO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7RUEy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
|
|
@@ -21,6 +21,7 @@ import FieldHelper from "sap/fe/macros/field/FieldHelper";
|
|
|
21
21
|
import { generateID } from "sap/fe/macros/internal/valuehelp/ValueHelpTemplating";
|
|
22
22
|
import type Control from "sap/ui/core/Control";
|
|
23
23
|
import type UI5Element from "sap/ui/core/Element";
|
|
24
|
+
import type MDCValueHelp from "sap/ui/mdc/ValueHelp";
|
|
24
25
|
import type Model from "sap/ui/model/Model";
|
|
25
26
|
import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
|
|
26
27
|
|
|
@@ -241,6 +242,15 @@ const DelegateUtil = {
|
|
|
241
242
|
) {
|
|
242
243
|
// in xml validate against the metaPath of the ValueHelp
|
|
243
244
|
oTargetDependent = (oDependent as ValueHelp).getContent();
|
|
245
|
+
} else if (
|
|
246
|
+
oModifier.getControlType(oDependent) === "sap.ui.mdc.ValueHelp" &&
|
|
247
|
+
oModifier.targets !== "xmlTree" &&
|
|
248
|
+
((oDependent as MDCValueHelp).getPayload() as { propertyPath?: string })?.propertyPath ===
|
|
249
|
+
mParameters.metaPath &&
|
|
250
|
+
oModifier.getId(oTargetDependent).includes("::FilterFieldValueHelp::")
|
|
251
|
+
) {
|
|
252
|
+
// specific case of the OVP
|
|
253
|
+
return true;
|
|
244
254
|
}
|
|
245
255
|
if (oTargetDependent && oModifier.getId(oTargetDependent) === sGeneratedId) {
|
|
246
256
|
return true;
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/ui/core/Element", "sap/ui/mdc/field/FieldBaseDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/model/Filter"], function (Log, CommonUtils, Element, FieldBaseDelegate, TypeMap, Filter) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConverter", "sap/ui/core/Element", "sap/ui/mdc/field/FieldBaseDelegate", "sap/ui/mdc/odata/v4/TypeMap", "sap/ui/model/Filter", "../CommonHelper"], function (Log, CommonUtils, MetaModelConverter, Element, FieldBaseDelegate, TypeMap, Filter, CommonHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
+
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
8
9
|
return Object.assign({}, FieldBaseDelegate, {
|
|
9
10
|
apiVersion: 2,
|
|
10
11
|
/**
|
|
@@ -102,7 +103,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/ui/core/Element",
|
|
|
102
103
|
* @returns List of filters
|
|
103
104
|
*/
|
|
104
105
|
_getFilter: function (valueList, propertyName, valueHelpProperty, keyValue, valuehelpPayload, valuehelpConditionPayload, bindingContext) {
|
|
105
|
-
|
|
106
|
+
let filters = [];
|
|
106
107
|
const parameters = valueList.Parameters.filter(function (parameter) {
|
|
107
108
|
var _parameter$LocalDataP;
|
|
108
109
|
return parameter.$Type === "com.sap.vocabularies.Common.v1.ValueListParameterIn" || parameter.$Type === "com.sap.vocabularies.Common.v1.ValueListParameterInOut" || ((_parameter$LocalDataP = parameter.LocalDataProperty) === null || _parameter$LocalDataP === void 0 ? void 0 : _parameter$LocalDataP.$PropertyPath) === propertyName && parameter.ValueListProperty === valueHelpProperty;
|
|
@@ -118,14 +119,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/ui/core/Element",
|
|
|
118
119
|
const apdField = Element.getElementById(apdFieldPath);
|
|
119
120
|
filterValue = apdField === null || apdField === void 0 ? void 0 : apdField.getValue();
|
|
120
121
|
} else if (valuehelpConditionPayload !== undefined) {
|
|
121
|
-
|
|
122
|
-
const sourcePath = (_parameter$LocalDataP4 = parameter.LocalDataProperty) === null || _parameter$LocalDataP4 === void 0 ? void 0 : _parameter$LocalDataP4.$PropertyPath;
|
|
122
|
+
const sourcePath = parameter.ValueListProperty;
|
|
123
123
|
const conditionPayload = valuehelpConditionPayload === null || valuehelpConditionPayload === void 0 ? void 0 : valuehelpConditionPayload[0];
|
|
124
124
|
filterValue = sourcePath && (conditionPayload === null || conditionPayload === void 0 ? void 0 : conditionPayload[sourcePath]);
|
|
125
125
|
} else if (bindingContext) {
|
|
126
|
-
var _parameter$
|
|
126
|
+
var _parameter$LocalDataP4;
|
|
127
127
|
// if the value help is not used try getting the filter value from the binding context
|
|
128
|
-
const sourcePath = (_parameter$
|
|
128
|
+
const sourcePath = (_parameter$LocalDataP4 = parameter.LocalDataProperty) === null || _parameter$LocalDataP4 === void 0 ? void 0 : _parameter$LocalDataP4.$PropertyPath;
|
|
129
129
|
filterValue = bindingContext.getObject(sourcePath);
|
|
130
130
|
}
|
|
131
131
|
/* Add value to the filter for the text determination */
|
|
@@ -137,8 +137,59 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/ui/core/Element",
|
|
|
137
137
|
}));
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
+
if (valuehelpConditionPayload !== null && valuehelpConditionPayload !== void 0 && valuehelpConditionPayload[0]) {
|
|
141
|
+
// In case of multiple keys for the valuelist collection, the main ValueListProperty might not be unique to get exact value list selection.
|
|
142
|
+
// So, we add filters for key properties if they are present in the valuehelpConditionPayload.
|
|
143
|
+
filters = filters.concat(this._getRemainingKeyValueFilters(valuehelpConditionPayload[0], valueList));
|
|
144
|
+
}
|
|
140
145
|
return filters;
|
|
141
146
|
},
|
|
147
|
+
/**
|
|
148
|
+
* Get model filters to ensure a precise selection from the condition payload.
|
|
149
|
+
* @param conditionPayload Additional condition information for this key
|
|
150
|
+
* @param valueList Value list information
|
|
151
|
+
* @returns List of filters
|
|
152
|
+
*/
|
|
153
|
+
_getRemainingKeyValueFilters(conditionPayload, valueList) {
|
|
154
|
+
const {
|
|
155
|
+
$model: valueListModel,
|
|
156
|
+
CollectionPath: collectionPath,
|
|
157
|
+
Parameters: parameters
|
|
158
|
+
} = valueList;
|
|
159
|
+
const metaContext = valueListModel.getMetaModel().getMetaContext(`/${collectionPath}`);
|
|
160
|
+
const entityType = getInvolvedDataModelObjects(metaContext).targetEntityType;
|
|
161
|
+
const allLocalDataProperties = parameters.reduce((arr, parameter) => {
|
|
162
|
+
var _parameter$LocalDataP5;
|
|
163
|
+
if ((_parameter$LocalDataP5 = parameter.LocalDataProperty) !== null && _parameter$LocalDataP5 !== void 0 && _parameter$LocalDataP5.$PropertyPath) {
|
|
164
|
+
arr.push(parameter.LocalDataProperty.$PropertyPath);
|
|
165
|
+
}
|
|
166
|
+
return arr;
|
|
167
|
+
}, []);
|
|
168
|
+
const allRemainingKeys = entityType.keys.reduce((arr, _ref) => {
|
|
169
|
+
let {
|
|
170
|
+
name: keyName
|
|
171
|
+
} = _ref;
|
|
172
|
+
if (!allLocalDataProperties.includes(keyName) && conditionPayload.hasOwnProperty(keyName)) {
|
|
173
|
+
arr.push(keyName);
|
|
174
|
+
}
|
|
175
|
+
return arr;
|
|
176
|
+
}, []);
|
|
177
|
+
if (allRemainingKeys.length > 0) {
|
|
178
|
+
return allRemainingKeys.reduce((filters, key) => {
|
|
179
|
+
// This is a metamodel operation. The original isPropertyFilterable needs to be converted later.
|
|
180
|
+
const keyContext = valueListModel.getMetaModel().getMetaContext(`/${collectionPath}/${key}`);
|
|
181
|
+
if (CommonHelper.isPropertyFilterable(keyContext)) {
|
|
182
|
+
filters.push(new Filter({
|
|
183
|
+
path: key,
|
|
184
|
+
operator: "EQ",
|
|
185
|
+
value1: conditionPayload[key]
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
return filters;
|
|
189
|
+
}, []);
|
|
190
|
+
}
|
|
191
|
+
return [];
|
|
192
|
+
},
|
|
142
193
|
/**
|
|
143
194
|
* Determines the key, description, and payload of a user input.
|
|
144
195
|
* @param field The <code>Field</code> instance
|
|
@@ -275,4 +326,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/ui/core/Element",
|
|
|
275
326
|
}
|
|
276
327
|
});
|
|
277
328
|
}, false);
|
|
278
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJGaWVsZEJhc2VEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nIiwiZmllbGQiLCJ0eXBlIiwidmFsdWUiLCJyZXN1bHQiLCJpc0EiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJmb3JtYXRWYWx1ZSIsImJUeXBlSW5pdGlhbGl6ZWQiLCJtQ3VzdG9tVW5pdHMiLCJpbml0aWFsaXplSW50ZXJuYWxVbml0VHlwZSIsInR5cGVJbml0aWFsaXphdGlvbiIsImVuaGFuY2VWYWx1ZUZvclVuaXQiLCJ2YWx1ZXMiLCJwdXNoIiwiZ2V0RGVmYXVsdFZhbHVlSGVscERlbGVnYXRlIiwiX2ZpZWxkIiwibmFtZSIsInBheWxvYWQiLCJnZXRUeXBlTWFwIiwiVHlwZU1hcCIsIl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIiLCJ2YWx1ZUxpc3RJbmZvIiwicHJvcGVydHlOYW1lIiwiUGFyYW1ldGVycyIsImZpbHRlciIsImVudHJ5IiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiX2dldEZpbHRlciIsInZhbHVlTGlzdCIsInZhbHVlSGVscFByb3BlcnR5Iiwia2V5VmFsdWUiLCJ2YWx1ZWhlbHBQYXlsb2FkIiwidmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCIsImJpbmRpbmdDb250ZXh0IiwiZmlsdGVycyIsInBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJfcGFyYW1ldGVyJExvY2FsRGF0YVAiLCIkVHlwZSIsIlZhbHVlTGlzdFByb3BlcnR5IiwiX3BhcmFtZXRlciRMb2NhbERhdGFQMiIsImZpbHRlclZhbHVlIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJfcGFyYW1ldGVyJExvY2FsRGF0YVAzIiwiYXBkRmllbGRQYXRoIiwiYXBkRmllbGQiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRWYWx1ZSIsIl9wYXJhbWV0ZXIkTG9jYWxEYXRhUDQiLCJzb3VyY2VQYXRoIiwiY29uZGl0aW9uUGF5bG9hZCIsIl9wYXJhbWV0ZXIkTG9jYWxEYXRhUDUiLCJnZXRPYmplY3QiLCJGaWx0ZXIiLCJwYXRoIiwib3BlcmF0b3IiLCJ2YWx1ZTEiLCJnZXRJdGVtRm9yVmFsdWUiLCJ2YWx1ZUhlbHAiLCJjb25maWciLCJjaGVja0Rlc2NyaXB0aW9uIiwiZ2V0UGF5bG9hZCIsImRlc2NyaXB0aW9uUGF0aCIsInZhbHVlSGVscERlc2NyaXB0aW9uUGF0aCIsIm1heExlbmd0aCIsInZhbHVlTGVuZ3RoIiwidG9TdHJpbmciLCJnZXREZXNjcmlwdGlvbiIsImtleSIsIl9jb25kaXRpb25JbiIsIl9jb25kaXRpb25PdXQiLCJfQ29uZGl0aW9uTW9kZWwiLCJfY29uZGl0aW9uTW9kZWxOYW1lIiwiY29udHJvbCIsIl90eXBlIiwiX3BheWxvYWQiLCJfcGF5bG9hZDIiLCJnZXREaXNwbGF5IiwiaW5jbHVkZXMiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiaXNGaWx0ZXJGaWVsZCIsImRhdGFNb2RlbCIsImdldE1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aCIsInRleHRQcm9wZXJ0eSIsIl92YWx1ZUhlbHBQYXJhbWV0ZXJzJCIsInJlcXVlc3RWYWx1ZUxpc3RJbmZvIiwia2V5cyIsInZhbHVlSGVscFBhcmFtZXRlcnMiLCJFcnJvciIsInZhbHVlTGlzdE1vZGVsIiwiJG1vZGVsIiwidGV4dEFubm90YXRpb24iLCJDb2xsZWN0aW9uUGF0aCIsIiRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiRzZWxlY3QiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwic2lkZUVmZmVjdFBhdGgiLCJzdWJzdHJpbmciLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJMb2ciLCJ3YXJuaW5nIiwiX21ldGFNb2RlbCRnZXRPYmplY3QiLCJleHRlcm5hbElkUGF0aCIsIl9tZXRhTW9kZWwkZ2V0T2JqZWN0MiIsImV4dGVybmFsSWRGdWxsUGF0aCIsInJlcGxhY2UiLCJleHRlcm5hbElkTmFtZSIsImV4dGVybmFsSWREZXNjcmlwdGlvblBhdGgiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJTdHJpbmciLCJtc2ciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZpZWxkQmFzZURlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsIFZhbHVlSGVscFBheWxvYWQgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCB0eXBlIHsgSXRlbUZvclZhbHVlQ29uZmlndXJhdGlvbiB9IGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHR5cGUgQ29uZGl0aW9uTW9kZWwgZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvbk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlXCI7XG5pbXBvcnQgRmllbGRCYXNlRGVsZWdhdGUgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlRGVsZWdhdGVcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIFNpbXBsZVR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9TaW1wbGVUeXBlXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uUGF5bG9hZE1hcCwgQ29uZGl0aW9uUGF5bG9hZFR5cGUgfSBmcm9tIFwiLi4vdmFsdWVoZWxwL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5leHBvcnQgdHlwZSBGaWVsZFBheWxvYWQgPSB7XG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q/OiBib29sZWFuO1xuXHRpc0ZpbHRlckZpZWxkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFZhbHVlID0gc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBUeXBlSW5pdGlhbGl6YXRpb24gPSB7XG5cdGJUeXBlSW5pdGlhbGl6ZWQ/OiBib29sZWFuO1xuXHRtQ3VzdG9tVW5pdHM/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25maWcgPSB7XG5cdHZhbHVlOiBWYWx1ZTtcblx0cGFyc2VkVmFsdWU6IFZhbHVlO1xuXHRiaW5kaW5nQ29udGV4dDogQ29udGV4dDtcblx0Y2hlY2tLZXk6IGJvb2xlYW47XG5cdGNoZWNrRGVzY3JpcHRpb246IGJvb2xlYW47XG5cdGNvbmRpdGlvbk1vZGVsPzogQ29uZGl0aW9uTW9kZWw7XG5cdGNvbmRpdGlvbk1vZGVsTmFtZT86IHN0cmluZztcblx0Y29udHJvbD86IG9iamVjdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oe30sIEZpZWxkQmFzZURlbGVnYXRlLCB7XG5cdGFwaVZlcnNpb246IDIsXG5cblx0LyoqXG5cdCAqIElmIHRoZSA8Y29kZT5GaWVsZDwvY29kZT4gY29udHJvbCBpcyB1c2VkLCB0aGUgdXNlZCBkYXRhIHR5cGUgbWlnaHQgY29tZSBmcm9tIHRoZSBiaW5kaW5nLlxuXHQgKiBJbiBWNC11bml0IG9yIGN1cnJlbmN5IGNhc2UgaXQgbWlnaHQgbmVlZCB0byBiZSBmb3JtYXR0ZWQgb25jZS5cblx0ICogVG8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgdHlwZSBsYXRlciBvbiwgdGhlIGN1cnJlbmNpZXMgbXVzdCBiZSByZXR1cm5lZC5cblx0ICogQHBhcmFtIGZpZWxkIFRoZSA8Y29kZT5GaWVsZDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIHR5cGUgVHlwZSBmcm9tIGJpbmRpbmdcblx0ICogQHBhcmFtIHZhbHVlIEdpdmVuIHZhbHVlXG5cdCAqIEByZXR1cm5zIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGUgKG5lZWRzIHRvIHNldCBiVHlwZUluaXRpYWxpemVkIHRvIHRydWUgaWYgaW5pdGlhbGl6ZWQpXG5cdCAqL1xuXHRpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB0eXBlOiBTaW1wbGVUeXBlIHwgdW5kZWZpbmVkLCB2YWx1ZTogVmFsdWUgfCBWYWx1ZVtdKSB7XG5cdFx0Ly8gVjQgVW5pdCBhbmQgQ3VycmVuY3kgdHlwZXMgaGF2ZSBhIG1hcCB3aXRoIHZhbGlkIHVuaXRzIGFuZCBjcmVhdGUgYW4gaW50ZXJuYWwgY3VzdG9taXppbmcgZm9yIGl0LlxuXHRcdC8vIFRoZSBGaWVsZCBuZWVkcyB0byBrZWVwIHRoaXMgY3VzdG9taXppbmcgbG9naWMgd2hlbiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgdHlwZS5cblx0XHQvLyAoQXMgZXh0ZXJuYWwgUkFXIGJpbmRpbmcgaXMgdXNlZCB0aGVyZSBpcyBubyBmb3JtYXR0aW5nIG9uIHBhcnNpbmcuKVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBUeXBlSW5pdGlhbGl6YXRpb24gPSB7fTtcblx0XHRpZiAoXG5cdFx0XHR0eXBlICYmXG5cdFx0XHR0eXBlLmlzQShbXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIsIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIl0pICYmXG5cdFx0XHRBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuXHRcdFx0dmFsdWUubGVuZ3RoID4gMiAmJlxuXHRcdFx0dmFsdWVbMl0gIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Ly8gZm9ybWF0IG9uY2UgdG8gc2V0IGludGVybmFsIGN1c3RvbWl6aW5nLiBBbGxvdyBudWxsIGFzIHZhbGlkIHZhbHVlcyBmb3IgY3VzdG9tIHVuaXRzXG5cdFx0XHR0eXBlLmZvcm1hdFZhbHVlKHZhbHVlLCBcInN0cmluZ1wiKTtcblx0XHRcdHJlc3VsdC5iVHlwZUluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHRcdHJlc3VsdC5tQ3VzdG9tVW5pdHMgPSB2YWx1ZVsyXSBhcyBzdHJpbmc7IC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIHByb3ZpZGUgY3VzdG9tIHVuaXRzIHRvIGludGVybmFsIHR5cGVcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB1bml0IHR5cGUuXG5cdCAqIElmIHRoZSA8Y29kZT5GaWVsZDwvY29kZT4gY29udHJvbCBpcyB1c2VkLCB0aGUgdXNlZCBkYXRhIHR5cGUgbWlnaHQgY29tZSBmcm9tIHRoZSBiaW5kaW5nLlxuXHQgKiBJZiB0aGUgdHlwZSBpcyBhIFY0IHVuaXQgb3IgY3VycmVuY3ksIGl0IG1pZ2h0IG5lZWQgdG8gYmUgZm9ybWF0dGVkIG9uY2UuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB0eXBlIFR5cGUgZnJvbSBiaW5kaW5nXG5cdCAqIEBwYXJhbSB0eXBlSW5pdGlhbGl6YXRpb24gSW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgdHlwZVxuXHQgKi9cblx0aW5pdGlhbGl6ZUludGVybmFsVW5pdFR5cGU6IGZ1bmN0aW9uIChmaWVsZDogRmllbGQsIHR5cGU6IFNpbXBsZVR5cGUsIHR5cGVJbml0aWFsaXphdGlvbj86IFR5cGVJbml0aWFsaXphdGlvbikge1xuXHRcdGlmICh0eXBlSW5pdGlhbGl6YXRpb24/Lm1DdXN0b21Vbml0cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBpZiBhbHJlYWR5IGluaXRpYWxpemVkIGluaXRpYWxpemUgbmV3IHR5cGUgdG9vLlxuXHRcdFx0dHlwZS5mb3JtYXRWYWx1ZShbbnVsbCwgbnVsbCwgdHlwZUluaXRpYWxpemF0aW9uLm1DdXN0b21Vbml0c10sIFwic3RyaW5nXCIpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBlbmhhbmNlcyB0aGUgdmFsdWUgd2l0aCB1bml0IG9yIGN1cnJlbmN5IGluZm9ybWF0aW9uIGlmIG5lZWRlZCBieSB0aGUgZGF0YSB0eXBlLlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gIHZhbHVlcyBWYWx1ZXNcblx0ICogQHBhcmFtICB0eXBlSW5pdGlhbGl6YXRpb24gSW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgdHlwZVxuXHQgKiBAcmV0dXJucyBWYWx1ZXNcblx0ICovXG5cdGVuaGFuY2VWYWx1ZUZvclVuaXQ6IGZ1bmN0aW9uIChmaWVsZDogRmllbGQsIHZhbHVlczogVmFsdWVbXSwgdHlwZUluaXRpYWxpemF0aW9uPzogVHlwZUluaXRpYWxpemF0aW9uKSB7XG5cdFx0aWYgKHR5cGVJbml0aWFsaXphdGlvbj8uYlR5cGVJbml0aWFsaXplZCA9PT0gdHJ1ZSAmJiB2YWx1ZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHR2YWx1ZXMucHVzaCh0eXBlSW5pdGlhbGl6YXRpb24ubUN1c3RvbVVuaXRzKTtcblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoaWNoIDxjb2RlPlZhbHVlSGVscERlbGVnYXRlPC9jb2RlPiBpcyB1c2VkXG5cdCAqIGlmIGEgZGVmYXVsdCBmaWVsZCBoZWxwIChmb3IgZXhhbXBsZSwgZm9yIGRlZmluaW5nIGNvbmRpdGlvbnMgaW4gPC9jb2RlPkZpbHRlckZpZWxkPC9jb2RlPilcblx0ICogaXMgY3JlYXRlZC5cblx0ICogQHBhcmFtIF9maWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIERlbGVnYXRlIG9iamVjdCB3aXRoIG5hbWUgYW5kIHBheWxvYWRcblx0ICovXG5cdGdldERlZmF1bHRWYWx1ZUhlbHBEZWxlZ2F0ZTogZnVuY3Rpb24gKF9maWVsZDogRmllbGQpIHtcblx0XHRyZXR1cm4geyBuYW1lOiBcInNhcC91aS9tZGMvb2RhdGEvdjQvVmFsdWVIZWxwRGVsZWdhdGVcIiwgcGF5bG9hZDoge30gfTtcblx0fSxcblxuXHRnZXRUeXBlTWFwOiBmdW5jdGlvbiAoX2ZpZWxkOiBGaWVsZCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgYWxsIHBhcmFtZXRlcnMgaW4gYSB2YWx1ZSBoZWxwIHRoYXQgdXNlIGEgc3BlY2lmaWMgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RJbmZvIFZhbHVlIGxpc3QgaW5mb1xuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIExpc3Qgb2YgYWxsIGZvdW5kIHBhcmFtZXRlcnNcblx0ICovXG5cdF9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXI6IGZ1bmN0aW9uICh2YWx1ZUxpc3RJbmZvOiBBbm5vdGF0aW9uVmFsdWVMaXN0VHlwZSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHQvL2RldGVybWluZSBwYXRoIHRvIHZhbHVlIGxpc3QgcHJvcGVydHlcblx0XHRyZXR1cm4gdmFsdWVMaXN0SW5mby5QYXJhbWV0ZXJzLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHtcblx0XHRcdGlmIChlbnRyeS5Mb2NhbERhdGFQcm9wZXJ0eSkge1xuXHRcdFx0XHRyZXR1cm4gZW50cnkuTG9jYWxEYXRhUHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlOYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogQnVpbGQgZmlsdGVycyBmb3IgZWFjaCByZWxldmFudCBwYXJhbWV0ZXIuXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3QgVmFsdWUgbGlzdCBpbmZvXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgTmFtZSBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHZhbHVlSGVscFByb3BlcnR5IE5hbWUgb2YgdGhlIHZhbHVlIGhlbHAgcHJvcGVydHlcblx0ICogQHBhcmFtIGtleVZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gdmFsdWVoZWxwUGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkIEFkZGl0aW9uYWwgY29uZGl0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGtleVxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZ0NvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIExpc3Qgb2YgZmlsdGVyc1xuXHQgKi9cblx0X2dldEZpbHRlcjogZnVuY3Rpb24gKFxuXHRcdHZhbHVlTGlzdDogQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0dmFsdWVIZWxwUHJvcGVydHk6IHN0cmluZyxcblx0XHRrZXlWYWx1ZTogc3RyaW5nLFxuXHRcdHZhbHVlaGVscFBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0dmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGVbXSB8IHVuZGVmaW5lZCxcblx0XHRiaW5kaW5nQ29udGV4dD86IENvbnRleHRcblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVycyA9IFtdO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB2YWx1ZUxpc3QuUGFyYW1ldGVycy5maWx0ZXIoZnVuY3Rpb24gKHBhcmFtZXRlcikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0cGFyYW1ldGVyLiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuVmFsdWVMaXN0UGFyYW1ldGVySW4gfHxcblx0XHRcdFx0cGFyYW1ldGVyLiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuVmFsdWVMaXN0UGFyYW1ldGVySW5PdXQgfHxcblx0XHRcdFx0KHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlOYW1lICYmIHBhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eSA9PT0gdmFsdWVIZWxwUHJvcGVydHkpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcblx0XHRcdGxldCBmaWx0ZXJWYWx1ZTtcblx0XHRcdGlmIChwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGtleVZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZWhlbHBQYXlsb2FkPy5pc0FjdGlvblBhcmFtZXRlckRpYWxvZyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBhcGRGaWVsZFBhdGggPSBgQVBEXzo6JHtwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGh9YDtcblx0XHRcdFx0Y29uc3QgYXBkRmllbGQgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGFwZEZpZWxkUGF0aCkgYXMgRmllbGQ7XG5cdFx0XHRcdGZpbHRlclZhbHVlID0gYXBkRmllbGQ/LmdldFZhbHVlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBzb3VyY2VQYXRoID0gcGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkID0gdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZD8uWzBdO1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IHNvdXJjZVBhdGggJiYgY29uZGl0aW9uUGF5bG9hZD8uW3NvdXJjZVBhdGhdO1xuXHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHQvLyBpZiB0aGUgdmFsdWUgaGVscCBpcyBub3QgdXNlZCB0cnkgZ2V0dGluZyB0aGUgZmlsdGVyIHZhbHVlIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dFxuXHRcdFx0XHRjb25zdCBzb3VyY2VQYXRoID0gcGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGJpbmRpbmdDb250ZXh0LmdldE9iamVjdChzb3VyY2VQYXRoKTtcblx0XHRcdH1cblx0XHRcdC8qIEFkZCB2YWx1ZSB0byB0aGUgZmlsdGVyIGZvciB0aGUgdGV4dCBkZXRlcm1pbmF0aW9uICovXG5cdFx0XHRpZiAoZmlsdGVyVmFsdWUgIT09IG51bGwgJiYgZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IHBhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eSwgb3BlcmF0b3I6IFwiRVFcIiwgdmFsdWUxOiBmaWx0ZXJWYWx1ZSB9KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmaWx0ZXJzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHRoZSBrZXksIGRlc2NyaXB0aW9uLCBhbmQgcGF5bG9hZCBvZiBhIHVzZXIgaW5wdXQuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVmFsdWUgaGVscCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gT2JqZWN0XG5cdCAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGRlc2NyaXB0aW9uLCBrZXksIGFuZCBwYXlsb2FkLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdyAobXVzdCBiZSByZXF1ZXN0ZWQpLCBhIDxjb2RlPlByb21pc2U8L2NvZGU+IGlzIHJldHVybmVkXG5cdCAqL1xuXHRnZXRJdGVtRm9yVmFsdWU6IGZ1bmN0aW9uIChmaWVsZDogRmllbGQsIHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb25maWc6IEl0ZW1Gb3JWYWx1ZUNvbmZpZ3VyYXRpb24pIHtcblx0XHQvL0JDUDogMjI3MDE2Mjg4NyAuIFRoZSBNREMgZmllbGQgc2hvdWxkIG5vdCB0cnkgdG8gZ2V0IHRoZSBpdGVtIHdoZW4gdGhlIGZpZWxkIGlzIGVtcHRpZWRcblx0XHQvLyBKSVJBOiBGSU9SSVRFQ0hQMS0yNTM2MSAtIEltcHJvdmUgdGhlIHR5cGUtYWhlYWQgYmVoYXZpb3IgZm9yIG1pc3Npbm5nIHRleHQgYW5ub3RhdGlvbiBvciBjb25zdHJhaW50cyB2aW9sYXRpb25zIG9mIHRoZSBleGlzdGluZyB0ZXh0IGFubm90YXRpb25cblx0XHRpZiAoY29uZmlnLnZhbHVlID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbmZpZy5jaGVja0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRjb25zdCB2YWx1ZWhlbHBQYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0Y29uc3QgZGVzY3JpcHRpb25QYXRoID0gdmFsdWVoZWxwUGF5bG9hZC52YWx1ZUhlbHBEZXNjcmlwdGlvblBhdGg7XG5cdFx0XHRjb25zdCBtYXhMZW5ndGggPSB2YWx1ZWhlbHBQYXlsb2FkPy5tYXhMZW5ndGg7XG5cdFx0XHRjb25zdCB2YWx1ZUxlbmd0aCA9IGNvbmZpZy52YWx1ZSAhPT0gbnVsbCAmJiBjb25maWcudmFsdWUgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy52YWx1ZS50b1N0cmluZygpLmxlbmd0aCA6IDA7XG5cdFx0XHRpZiAoZGVzY3JpcHRpb25QYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIHByb3BlcnR5IHZhbHVlIGhlbHAgY29sbGVjdGlvbiBoYXMgbm8gdGV4dCBhbm5vdGF0aW9uIChkZXNjcmlwdGlvblBhdGggaXMgZW1wdHkpIHRoZSBkZXNjcmlwdGlvbiBjaGVjayBzaG91bGRuwrR0IG9jY3VyLlxuXHRcdFx0XHQvLyBJbiBzdWNoIGEgY2FzZSB0aGUgbWV0aG9kIGdldERlc2NyaXB0aW9uIHdpbGwgYmUgY2FsbGVkIGJ5IE1EQyBhbmQgd2l0aGluIHRoaXMgbWV0aG9kIGEgU2lkZUVmZmVjdCBpcyByZXF1ZXN0ZWQgdG8gcmV0cmlldmUgdGhlIHRleHQgZnJvbSB0aGUgdGV4dCBwcm9wZXJ0eSBvZiB0aGUgbWFpbiBlbnRpdHlcblx0XHRcdFx0Y29uZmlnLmNoZWNrRGVzY3JpcHRpb24gPSBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAobWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdmFsdWVMZW5ndGggPiBtYXhMZW5ndGgpIHtcblx0XHRcdFx0Ly92YWx1ZSBsZW5ndGggaXMgPiB0ZXh0IHByb2VwZXJ0eSBsZW5ndGggY29uc3RyYWludFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBGaWVsZEJhc2VEZWxlZ2F0ZS5nZXRJdGVtRm9yVmFsdWUoZmllbGQsIHZhbHVlSGVscCwgY29uZmlnKTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4ga2V5LlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIEZpZWxkIGhlbHAgYXNzaWduZWQgdG8gdGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBvciA8Y29kZT5GaWx0ZXJGaWVsZDwvY29kZT4gY29udHJvbFxuXHQgKiBAcGFyYW0ga2V5IEtleSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb25cblx0ICogQHBhcmFtIF9jb25kaXRpb25JbiBJbiBwYXJhbWV0ZXJzIGZvciB0aGUga2V5IChubyBsb25nZXIgc3VwcG9ydGVkKVxuXHQgKiBAcGFyYW0gX2NvbmRpdGlvbk91dCBPdXQgcGFyYW1ldGVycyBmb3IgdGhlIGtleSAobm8gbG9uZ2VyIHN1cHBvcnRlZClcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmdDb250ZXh0IDxjb2RlPkJpbmRpbmdDb250ZXh0PC9jb2RlPiBvZiB0aGUgY2hlY2tlZCBmaWVsZC4gSW5zaWRlIGEgdGFibGUsIHRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGVsZW1lbnQgY2FuIGJlIGNvbm5lY3RlZCB0byBhIGRpZmZlcmVudCByb3dcblx0ICogQHBhcmFtIF9Db25kaXRpb25Nb2RlbCBDb25kaXRpb25Nb2RlbDwvY29kZT4sIGlmIGJvdW5kIHRvIG9uZVxuXHQgKiBAcGFyYW0gX2NvbmRpdGlvbk1vZGVsTmFtZSBOYW1lIG9mIHRoZSA8Y29kZT5Db25kaXRpb25Nb2RlbDwvY29kZT4sIGlmIGJvdW5kIHRvIG9uZVxuXHQgKiBAcGFyYW0gY29uZGl0aW9uUGF5bG9hZCBBZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIHRoaXMga2V5XG5cdCAqIEBwYXJhbSBjb250cm9sIEluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIGNvbnRyb2xcblx0ICogQHBhcmFtIF90eXBlIFR5cGUgb2YgdGhlIHZhbHVlXG5cdCAqIEByZXR1cm5zIERlc2NyaXB0aW9uIGZvciB0aGUga2V5IG9yIG9iamVjdCBjb250YWluaW5nIGEgZGVzY3JpcHRpb24sIGtleSBhbmQgcGF5bG9hZC4gSWYgdGhlIGRlc2NyaXB0aW9uIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgYXdheSAoaXQgbXVzdCBiZSByZXF1ZXN0ZWQpLCBhIDxjb2RlPlByb21pc2U8L2NvZGU+IGlzIHJldHVybmVkXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGZpZWxkOiBGaWVsZCB8IG51bGwsXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0X2NvbmRpdGlvbkluOiBvYmplY3QsXG5cdFx0X2NvbmRpdGlvbk91dDogb2JqZWN0LFxuXHRcdGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdF9Db25kaXRpb25Nb2RlbDogQ29uZGl0aW9uTW9kZWwsXG5cdFx0X2NvbmRpdGlvbk1vZGVsTmFtZTogc3RyaW5nLFxuXHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAsXG5cdFx0Y29udHJvbDogQ29udHJvbCxcblx0XHRfdHlwZTogdW5rbm93blxuXHQpIHtcblx0XHQvL0pJUkE6IEZJT1JJVEVDSFAxLTIyMDIyIC4gVGhlIE1EQyBmaWVsZCBzaG91bGQgbm90ICB0cmllcyB0byBkZXRlcm1pbmUgZGVzY3JpcHRpb24gd2l0aCB0aGUgaW5pdGlhbCBHRVQgb2YgdGhlIGRhdGEuXG5cdFx0Ly8gaXQgc2hvdWxkIHJlbHkgb24gdGhlIGRhdGEgd2UgYWxyZWFkeSByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0Ly8gQnV0IFRoZSBnZXREZXNjcmlwdGlvbiBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZCBpbiB0aGUgRmlsdGVyRmllbGQgY2FzZSBpZiBhIHZhcmlhbnQgaXMgbG9hZGVkLlxuXHRcdC8vIEFzIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGNvdWxkIGJlIGxhbmd1YWdlIGRlcGVuZGVudCBpdCBpcyBub3Qgc3RvcmVkIGluIHRoZSB2YXJpYW50LCBzbyBpdCBuZWVkcyB0byBiZSByZWFkIG9uIHJlbmRlcmluZy5cblxuXHRcdGxldCBwYXlsb2FkID0gZmllbGQ/LmdldFBheWxvYWQoKSBhcyBGaWVsZFBheWxvYWQ7XG5cblx0XHQvKiBSZXRyaWV2ZSB0ZXh0IGZyb20gdmFsdWUgaGVscCwgaWYgdmFsdWUgd2FzIHNldCBieSBvdXQtcGFyYW1ldGVyIChCQ1AgMjI3MDE2MDYzMykgKi9cblx0XHRpZiAoIXBheWxvYWQgJiYgKGNvbnRyb2wgYXMgRmllbGRCYXNlKT8uZ2V0RGlzcGxheSgpLmluY2x1ZGVzKFwiRGVzY3JpcHRpb25cIikpIHtcblx0XHRcdHBheWxvYWQgPSB7XG5cdFx0XHRcdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHBheWxvYWQ/LnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgPT09IHRydWUgfHwgcGF5bG9hZD8uaXNGaWx0ZXJGaWVsZCA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgZGF0YU1vZGVsID0gdmFsdWVIZWxwLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGRhdGFNb2RlbFxuXHRcdFx0XHQ/IGRhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh2YWx1ZUhlbHAgYXMgdW5rbm93biBhcyBDb250cm9sKVxuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHZhbHVlaGVscFBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0XHRjb25zdCB2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkID0gY29uZGl0aW9uUGF5bG9hZD8uW3ZhbHVlaGVscFBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXTtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHZhbHVlaGVscFBheWxvYWQucHJvcGVydHlQYXRoO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEZXNjcmlwdGlvblBhdGggPSB2YWx1ZWhlbHBQYXlsb2FkPy5wcm9wZXJ0eURlc2NyaXB0aW9uUGF0aDtcblx0XHRcdGxldCB0ZXh0UHJvcGVydHk6IHN0cmluZztcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0LyogUmVxdWVzdCB2YWx1ZSBoZWxwIG1ldGFkYXRhICovXG5cdFx0XHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPSBhd2FpdCBtZXRhTW9kZWwucmVxdWVzdFZhbHVlTGlzdEluZm8ocHJvcGVydHlQYXRoLCB0cnVlLCBiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtwcm9wZXJ0eVBhdGh9QHNhcHVpLm5hbWVgKSBhcyBzdHJpbmc7XG5cdFx0XHRcdC8vIHRha2UgdGhlIGZpcnN0IHZhbHVlIGxpc3QgYW5ub3RhdGlvbiAtIGFsdGVybmF0aXZlbHkgdGFrZSB0aGUgb25lIHdpdGhvdXQgcXVhbGlmaWVyIG9yIHRoZSBmaXJzdCBvbmVcblx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0ID0gdmFsdWVMaXN0SW5mb1tPYmplY3Qua2V5cyh2YWx1ZUxpc3RJbmZvKVswXV07XG5cdFx0XHRcdGNvbnN0IHZhbHVlSGVscFBhcmFtZXRlcnMgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIodmFsdWVMaXN0LCBwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRjb25zdCB2YWx1ZUhlbHBQcm9wZXJ0eSA9IHZhbHVlSGVscFBhcmFtZXRlcnM/LlswXT8uVmFsdWVMaXN0UHJvcGVydHk7XG5cdFx0XHRcdGlmICghdmFsdWVIZWxwUHJvcGVydHkpIHtcblx0XHRcdFx0XHR0aHJvdyBFcnJvcihgSW5jb25zaXN0ZW50IHZhbHVlIGhlbHAgYW5ub3RhdGlvbiBmb3IgJHtwcm9wZXJ0eU5hbWV9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gZ2V0IHRleHQgYW5ub3RhdGlvbiBmb3IgdGhpcyB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdFx0XHRcdGNvbnN0IHZhbHVlTGlzdE1vZGVsID0gdmFsdWVMaXN0LiRtb2RlbDtcblx0XHRcdFx0Y29uc3QgdGV4dEFubm90YXRpb24gPSB2YWx1ZUxpc3RNb2RlbFxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRPYmplY3QoYC8ke3ZhbHVlTGlzdC5Db2xsZWN0aW9uUGF0aH0vJHt2YWx1ZUhlbHBQcm9wZXJ0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRgKTtcblx0XHRcdFx0aWYgKHRleHRBbm5vdGF0aW9uICYmIHRleHRBbm5vdGF0aW9uLiRQYXRoKSB7XG5cdFx0XHRcdFx0dGV4dFByb3BlcnR5ID0gdGV4dEFubm90YXRpb24uJFBhdGg7XG5cdFx0XHRcdFx0LyogQnVpbGQgdGhlIGZpbHRlciBmb3IgdGhlIHJlbGV2YW50IHBhcmFtZXRlcnMgKi9cblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJzID0gdGhpcy5fZ2V0RmlsdGVyKFxuXHRcdFx0XHRcdFx0dmFsdWVMaXN0LFxuXHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRcdFx0dmFsdWVIZWxwUHJvcGVydHksXG5cdFx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdFx0XHR2YWx1ZWhlbHBQYXlsb2FkLFxuXHRcdFx0XHRcdFx0dmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBsaXN0QmluZGluZyA9IHZhbHVlTGlzdE1vZGVsLmJpbmRMaXN0KGAvJHt2YWx1ZUxpc3QuQ29sbGVjdGlvblBhdGh9YCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZpbHRlcnMsIHtcblx0XHRcdFx0XHRcdCRzZWxlY3Q6IHRleHRQcm9wZXJ0eVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdC8qIFJlcXVlc3QgZGVzY3JpcHRpb24gZm9yIGdpdmVuIGtleSBmcm9tIHZhbHVlIGxpc3QgZW50aXR5ICovXG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmxlbmd0aCA/IGNvbnRleHRzWzBdLmdldE9iamVjdCh0ZXh0UHJvcGVydHkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJpbmRpbmdDb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgcHJvcGVydHlEZXNjcmlwdGlvblBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0SW5kZXggPSBwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gcHJvcGVydHlEZXNjcmlwdGlvblBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiBwcm9wZXJ0eURlc2NyaXB0aW9uUGF0aDtcblx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmFsdWVIZWxwIGFzIHVua25vd24gYXMgQ29udHJvbCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRcdFx0YXdhaXQgc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdLCBiaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRgUmVxdWVzdFNpZGVFZmZlY3RzIGlzIHRyaWdnZXJlZCBiZWNhdXNlIHRoZSB0ZXh0IGFubm90YXRpb24gZm9yICR7dmFsdWVIZWxwUHJvcGVydHl9IGlzIG5vdCBkZWZpbmVkIGF0IHRoZSBDb2xsZWN0aW9uUGF0aCBvZiB0aGUgdmFsdWUgaGVscGBcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyogRVhURVJOQWxJRCAqL1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQYXRoID0gbWV0YU1vZGVsPy5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRgJHt2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkV4dGVybmFsSURgXG5cdFx0XHRcdFx0KT8uJFBhdGg7XG5cdFx0XHRcdFx0aWYgKGV4dGVybmFsSWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkRnVsbFBhdGggPSB2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aC5yZXBsYWNlKHByb3BlcnR5TmFtZSwgZXh0ZXJuYWxJZFBhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZE5hbWUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2V4dGVybmFsSWRGdWxsUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZERlc2NyaXB0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke2V4dGVybmFsSWRGdWxsUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlRleHRgKVxuXHRcdFx0XHRcdFx0XHQ/LiRQYXRoO1xuXHRcdFx0XHRcdFx0Y29uc3QgZmlsdGVycyA9IFtdO1xuXHRcdFx0XHRcdFx0ZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBleHRlcm5hbElkTmFtZSwgb3BlcmF0b3I6IFwiRVFcIiwgdmFsdWUxOiBrZXkgfSkpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB2YWx1ZUxpc3RNb2RlbC5iaW5kTGlzdChgLyR7dmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXJzLCB7XG5cdFx0XHRcdFx0XHRcdCRzZWxlY3Q6IGAke2V4dGVybmFsSWROYW1lfSwke2V4dGVybmFsSWREZXNjcmlwdGlvblBhdGh9YFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKTtcblx0XHRcdFx0XHRcdGlmIChjb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChleHRlcm5hbElkRGVzY3JpcHRpb25QYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBUZXh0IEFubm90YXRpb24gZm9yICR7dmFsdWVIZWxwUHJvcGVydHl9IGlzIG5vdCBkZWZpbmVkYCk7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3Qgc3RhdHVzID0gZXJyb3IgPyAoZXJyb3IgYXMgWE1MSHR0cFJlcXVlc3QpLnN0YXR1cyA6IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdFx0Y29uc3QgbXNnID0gc3RhdHVzID09PSA0MDQgPyBgTWV0YWRhdGEgbm90IGZvdW5kICgke3N0YXR1c30pIGZvciB2YWx1ZSBoZWxwIG9mIHByb3BlcnR5ICR7cHJvcGVydHlQYXRofWAgOiBtZXNzYWdlO1xuXHRcdFx0XHRMb2cuZXJyb3IobXNnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7U0F5Q2VBLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFQyxpQkFBaUIsRUFBRTtJQUNuREMsVUFBVSxFQUFFLENBQUM7SUFFYjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MseUJBQXlCLEVBQUUsU0FBQUEsQ0FBVUMsS0FBWSxFQUFFQyxJQUE0QixFQUFFQyxLQUFzQixFQUFFO01BQ3hHO01BQ0E7TUFDQTs7TUFFQSxNQUFNQyxNQUEwQixHQUFHLENBQUMsQ0FBQztNQUNyQyxJQUNDRixJQUFJLElBQ0pBLElBQUksQ0FBQ0csR0FBRyxDQUFDLENBQUMsOEJBQThCLEVBQUUsa0NBQWtDLENBQUMsQ0FBQyxJQUM5RUMsS0FBSyxDQUFDQyxPQUFPLENBQUNKLEtBQUssQ0FBQyxJQUNwQkEsS0FBSyxDQUFDSyxNQUFNLEdBQUcsQ0FBQyxJQUNoQkwsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLTSxTQUFTLEVBQ3JCO1FBQ0Q7UUFDQVAsSUFBSSxDQUFDUSxXQUFXLENBQUNQLEtBQUssRUFBRSxRQUFRLENBQUM7UUFDakNDLE1BQU0sQ0FBQ08sZ0JBQWdCLEdBQUcsSUFBSTtRQUM5QlAs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
|
|
329
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJhc3NpZ24iLCJGaWVsZEJhc2VEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJpbml0aWFsaXplVHlwZUZyb21CaW5kaW5nIiwiZmllbGQiLCJ0eXBlIiwidmFsdWUiLCJyZXN1bHQiLCJpc0EiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJmb3JtYXRWYWx1ZSIsImJUeXBlSW5pdGlhbGl6ZWQiLCJtQ3VzdG9tVW5pdHMiLCJpbml0aWFsaXplSW50ZXJuYWxVbml0VHlwZSIsInR5cGVJbml0aWFsaXphdGlvbiIsImVuaGFuY2VWYWx1ZUZvclVuaXQiLCJ2YWx1ZXMiLCJwdXNoIiwiZ2V0RGVmYXVsdFZhbHVlSGVscERlbGVnYXRlIiwiX2ZpZWxkIiwibmFtZSIsInBheWxvYWQiLCJnZXRUeXBlTWFwIiwiVHlwZU1hcCIsIl9nZXRWYWx1ZUxpc3RQYXJhbWV0ZXIiLCJ2YWx1ZUxpc3RJbmZvIiwicHJvcGVydHlOYW1lIiwiUGFyYW1ldGVycyIsImZpbHRlciIsImVudHJ5IiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiX2dldEZpbHRlciIsInZhbHVlTGlzdCIsInZhbHVlSGVscFByb3BlcnR5Iiwia2V5VmFsdWUiLCJ2YWx1ZWhlbHBQYXlsb2FkIiwidmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCIsImJpbmRpbmdDb250ZXh0IiwiZmlsdGVycyIsInBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJfcGFyYW1ldGVyJExvY2FsRGF0YVAiLCIkVHlwZSIsIlZhbHVlTGlzdFByb3BlcnR5IiwiX3BhcmFtZXRlciRMb2NhbERhdGFQMiIsImZpbHRlclZhbHVlIiwiaXNBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJfcGFyYW1ldGVyJExvY2FsRGF0YVAzIiwiYXBkRmllbGRQYXRoIiwiYXBkRmllbGQiLCJFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRWYWx1ZSIsInNvdXJjZVBhdGgiLCJjb25kaXRpb25QYXlsb2FkIiwiX3BhcmFtZXRlciRMb2NhbERhdGFQNCIsImdldE9iamVjdCIsIkZpbHRlciIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlMSIsImNvbmNhdCIsIl9nZXRSZW1haW5pbmdLZXlWYWx1ZUZpbHRlcnMiLCIkbW9kZWwiLCJ2YWx1ZUxpc3RNb2RlbCIsIkNvbGxlY3Rpb25QYXRoIiwiY29sbGVjdGlvblBhdGgiLCJtZXRhQ29udGV4dCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5VHlwZSIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInRhcmdldEVudGl0eVR5cGUiLCJhbGxMb2NhbERhdGFQcm9wZXJ0aWVzIiwicmVkdWNlIiwiYXJyIiwiX3BhcmFtZXRlciRMb2NhbERhdGFQNSIsImFsbFJlbWFpbmluZ0tleXMiLCJrZXlzIiwiX3JlZiIsImtleU5hbWUiLCJpbmNsdWRlcyIsImhhc093blByb3BlcnR5Iiwia2V5Iiwia2V5Q29udGV4dCIsIkNvbW1vbkhlbHBlciIsImlzUHJvcGVydHlGaWx0ZXJhYmxlIiwiZ2V0SXRlbUZvclZhbHVlIiwidmFsdWVIZWxwIiwiY29uZmlnIiwiY2hlY2tEZXNjcmlwdGlvbiIsImdldFBheWxvYWQiLCJkZXNjcmlwdGlvblBhdGgiLCJ2YWx1ZUhlbHBEZXNjcmlwdGlvblBhdGgiLCJtYXhMZW5ndGgiLCJ2YWx1ZUxlbmd0aCIsInRvU3RyaW5nIiwiZ2V0RGVzY3JpcHRpb24iLCJfY29uZGl0aW9uSW4iLCJfY29uZGl0aW9uT3V0IiwiX0NvbmRpdGlvbk1vZGVsIiwiX2NvbmRpdGlvbk1vZGVsTmFtZSIsImNvbnRyb2wiLCJfdHlwZSIsIl9wYXlsb2FkIiwiX3BheWxvYWQyIiwiZ2V0RGlzcGxheSIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJpc0ZpbHRlckZpZWxkIiwiZGF0YU1vZGVsIiwiZ2V0TW9kZWwiLCJtZXRhTW9kZWwiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsInZhbHVlSGVscFF1YWxpZmllciIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5RGVzY3JpcHRpb25QYXRoIiwidGV4dFByb3BlcnR5IiwiX3ZhbHVlSGVscFBhcmFtZXRlcnMkIiwicmVxdWVzdFZhbHVlTGlzdEluZm8iLCJ2YWx1ZUhlbHBQYXJhbWV0ZXJzIiwiRXJyb3IiLCJ0ZXh0QW5ub3RhdGlvbiIsIiRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiRzZWxlY3QiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwic2lkZUVmZmVjdFBhdGgiLCJzdWJzdHJpbmciLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJMb2ciLCJ3YXJuaW5nIiwiX21ldGFNb2RlbCRnZXRPYmplY3QiLCJleHRlcm5hbElkUGF0aCIsIl9tZXRhTW9kZWwkZ2V0T2JqZWN0MiIsImV4dGVybmFsSWRGdWxsUGF0aCIsInJlcGxhY2UiLCJleHRlcm5hbElkTmFtZSIsImV4dGVybmFsSWREZXNjcmlwdGlvblBhdGgiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJTdHJpbmciLCJtc2ciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZpZWxkQmFzZURlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVmFsdWVMaXN0VHlwZSwgVmFsdWVIZWxwUGF5bG9hZCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHR5cGUgeyBJdGVtRm9yVmFsdWVDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC91aS9tZGMvVmFsdWVIZWxwXCI7XG5pbXBvcnQgdHlwZSBDb25kaXRpb25Nb2RlbCBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uTW9kZWxcIjtcbmltcG9ydCB0eXBlIEZpZWxkQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VcIjtcbmltcG9ydCBGaWVsZEJhc2VEZWxlZ2F0ZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgU2ltcGxlVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL1NpbXBsZVR5cGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwiLi4vQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvblBheWxvYWRNYXAsIENvbmRpdGlvblBheWxvYWRUeXBlIH0gZnJvbSBcIi4uL3ZhbHVlaGVscC9WYWx1ZUhlbHBEZWxlZ2F0ZVwiO1xuZXhwb3J0IHR5cGUgRmllbGRQYXlsb2FkID0ge1xuXHRyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0PzogYm9vbGVhbjtcblx0aXNGaWx0ZXJGaWVsZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBWYWx1ZSA9IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgVHlwZUluaXRpYWxpemF0aW9uID0ge1xuXHRiVHlwZUluaXRpYWxpemVkPzogYm9vbGVhbjtcblx0bUN1c3RvbVVuaXRzPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnID0ge1xuXHR2YWx1ZTogVmFsdWU7XG5cdHBhcnNlZFZhbHVlOiBWYWx1ZTtcblx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQ7XG5cdGNoZWNrS2V5OiBib29sZWFuO1xuXHRjaGVja0Rlc2NyaXB0aW9uOiBib29sZWFuO1xuXHRjb25kaXRpb25Nb2RlbD86IENvbmRpdGlvbk1vZGVsO1xuXHRjb25kaXRpb25Nb2RlbE5hbWU/OiBzdHJpbmc7XG5cdGNvbnRyb2w/OiBvYmplY3Q7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKHt9LCBGaWVsZEJhc2VEZWxlZ2F0ZSwge1xuXHRhcGlWZXJzaW9uOiAyLFxuXG5cdC8qKlxuXHQgKiBJZiB0aGUgPGNvZGU+RmllbGQ8L2NvZGU+IGNvbnRyb2wgaXMgdXNlZCwgdGhlIHVzZWQgZGF0YSB0eXBlIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYmluZGluZy5cblx0ICogSW4gVjQtdW5pdCBvciBjdXJyZW5jeSBjYXNlIGl0IG1pZ2h0IG5lZWQgdG8gYmUgZm9ybWF0dGVkIG9uY2UuXG5cdCAqIFRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIHR5cGUgbGF0ZXIgb24sIHRoZSBjdXJyZW5jaWVzIG11c3QgYmUgcmV0dXJuZWQuXG5cdCAqIEBwYXJhbSBmaWVsZCBUaGUgPGNvZGU+RmllbGQ8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSB0eXBlIFR5cGUgZnJvbSBiaW5kaW5nXG5cdCAqIEBwYXJhbSB2YWx1ZSBHaXZlbiB2YWx1ZVxuXHQgKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBpbnRlcm5hbCB0eXBlIChuZWVkcyB0byBzZXQgYlR5cGVJbml0aWFsaXplZCB0byB0cnVlIGlmIGluaXRpYWxpemVkKVxuXHQgKi9cblx0aW5pdGlhbGl6ZVR5cGVGcm9tQmluZGluZzogZnVuY3Rpb24gKGZpZWxkOiBGaWVsZCwgdHlwZTogU2ltcGxlVHlwZSB8IHVuZGVmaW5lZCwgdmFsdWU6IFZhbHVlIHwgVmFsdWVbXSkge1xuXHRcdC8vIFY0IFVuaXQgYW5kIEN1cnJlbmN5IHR5cGVzIGhhdmUgYSBtYXAgd2l0aCB2YWxpZCB1bml0cyBhbmQgY3JlYXRlIGFuIGludGVybmFsIGN1c3RvbWl6aW5nIGZvciBpdC5cblx0XHQvLyBUaGUgRmllbGQgbmVlZHMgdG8ga2VlcCB0aGlzIGN1c3RvbWl6aW5nIGxvZ2ljIHdoZW4gY3JlYXRpbmcgdGhlIGludGVybmFsIHR5cGUuXG5cdFx0Ly8gKEFzIGV4dGVybmFsIFJBVyBiaW5kaW5nIGlzIHVzZWQgdGhlcmUgaXMgbm8gZm9ybWF0dGluZyBvbiBwYXJzaW5nLilcblxuXHRcdGNvbnN0IHJlc3VsdDogVHlwZUluaXRpYWxpemF0aW9uID0ge307XG5cdFx0aWYgKFxuXHRcdFx0dHlwZSAmJlxuXHRcdFx0dHlwZS5pc0EoW1wic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiLCBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCJdKSAmJlxuXHRcdFx0QXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+IDIgJiZcblx0XHRcdHZhbHVlWzJdICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdC8vIGZvcm1hdCBvbmNlIHRvIHNldCBpbnRlcm5hbCBjdXN0b21pemluZy4gQWxsb3cgbnVsbCBhcyB2YWxpZCB2YWx1ZXMgZm9yIGN1c3RvbSB1bml0c1xuXHRcdFx0dHlwZS5mb3JtYXRWYWx1ZSh2YWx1ZSwgXCJzdHJpbmdcIik7XG5cdFx0XHRyZXN1bHQuYlR5cGVJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0XHRyZXN1bHQubUN1c3RvbVVuaXRzID0gdmFsdWVbMl0gYXMgc3RyaW5nOyAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBwcm92aWRlIGN1c3RvbSB1bml0cyB0byBpbnRlcm5hbCB0eXBlXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgdW5pdCB0eXBlLlxuXHQgKiBJZiB0aGUgPGNvZGU+RmllbGQ8L2NvZGU+IGNvbnRyb2wgaXMgdXNlZCwgdGhlIHVzZWQgZGF0YSB0eXBlIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYmluZGluZy5cblx0ICogSWYgdGhlIHR5cGUgaXMgYSBWNCB1bml0IG9yIGN1cnJlbmN5LCBpdCBtaWdodCBuZWVkIHRvIGJlIGZvcm1hdHRlZCBvbmNlLlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdHlwZSBUeXBlIGZyb20gYmluZGluZ1xuXHQgKiBAcGFyYW0gdHlwZUluaXRpYWxpemF0aW9uIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGVcblx0ICovXG5cdGluaXRpYWxpemVJbnRlcm5hbFVuaXRUeXBlOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB0eXBlOiBTaW1wbGVUeXBlLCB0eXBlSW5pdGlhbGl6YXRpb24/OiBUeXBlSW5pdGlhbGl6YXRpb24pIHtcblx0XHRpZiAodHlwZUluaXRpYWxpemF0aW9uPy5tQ3VzdG9tVW5pdHMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gaWYgYWxyZWFkeSBpbml0aWFsaXplZCBpbml0aWFsaXplIG5ldyB0eXBlIHRvby5cblx0XHRcdHR5cGUuZm9ybWF0VmFsdWUoW251bGwsIG51bGwsIHR5cGVJbml0aWFsaXphdGlvbi5tQ3VzdG9tVW5pdHNdLCBcInN0cmluZ1wiKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gZW5oYW5jZXMgdGhlIHZhbHVlIHdpdGggdW5pdCBvciBjdXJyZW5jeSBpbmZvcm1hdGlvbiBpZiBuZWVkZWQgYnkgdGhlIGRhdGEgdHlwZS5cblx0ICogQHBhcmFtIGZpZWxkIFRoZSA8Y29kZT5GaWVsZDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtICB2YWx1ZXMgVmFsdWVzXG5cdCAqIEBwYXJhbSAgdHlwZUluaXRpYWxpemF0aW9uIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIGludGVybmFsIHR5cGVcblx0ICogQHJldHVybnMgVmFsdWVzXG5cdCAqL1xuXHRlbmhhbmNlVmFsdWVGb3JVbml0OiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB2YWx1ZXM6IFZhbHVlW10sIHR5cGVJbml0aWFsaXphdGlvbj86IFR5cGVJbml0aWFsaXphdGlvbikge1xuXHRcdGlmICh0eXBlSW5pdGlhbGl6YXRpb24/LmJUeXBlSW5pdGlhbGl6ZWQgPT09IHRydWUgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0dmFsdWVzLnB1c2godHlwZUluaXRpYWxpemF0aW9uLm1DdXN0b21Vbml0cyk7XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGljaCA8Y29kZT5WYWx1ZUhlbHBEZWxlZ2F0ZTwvY29kZT4gaXMgdXNlZFxuXHQgKiBpZiBhIGRlZmF1bHQgZmllbGQgaGVscCAoZm9yIGV4YW1wbGUsIGZvciBkZWZpbmluZyBjb25kaXRpb25zIGluIDwvY29kZT5GaWx0ZXJGaWVsZDwvY29kZT4pXG5cdCAqIGlzIGNyZWF0ZWQuXG5cdCAqIEBwYXJhbSBfZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcmV0dXJucyBEZWxlZ2F0ZSBvYmplY3Qgd2l0aCBuYW1lIGFuZCBwYXlsb2FkXG5cdCAqL1xuXHRnZXREZWZhdWx0VmFsdWVIZWxwRGVsZWdhdGU6IGZ1bmN0aW9uIChfZmllbGQ6IEZpZWxkKSB7XG5cdFx0cmV0dXJuIHsgbmFtZTogXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1ZhbHVlSGVscERlbGVnYXRlXCIsIHBheWxvYWQ6IHt9IH07XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF9maWVsZDogRmllbGQpIHtcblx0XHRyZXR1cm4gVHlwZU1hcDtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIGFsbCBwYXJhbWV0ZXJzIGluIGEgdmFsdWUgaGVscCB0aGF0IHVzZSBhIHNwZWNpZmljIHByb3BlcnR5LlxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0SW5mbyBWYWx1ZSBsaXN0IGluZm9cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBMaXN0IG9mIGFsbCBmb3VuZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfZ2V0VmFsdWVMaXN0UGFyYW1ldGVyOiBmdW5jdGlvbiAodmFsdWVMaXN0SW5mbzogQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly9kZXRlcm1pbmUgcGF0aCB0byB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdFx0cmV0dXJuIHZhbHVlTGlzdEluZm8uUGFyYW1ldGVycy5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG5cdFx0XHRpZiAoZW50cnkuTG9jYWxEYXRhUHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIGVudHJ5LkxvY2FsRGF0YVByb3BlcnR5LiRQcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblx0LyoqXG5cdCAqIEJ1aWxkIGZpbHRlcnMgZm9yIGVhY2ggcmVsZXZhbnQgcGFyYW1ldGVyLlxuXHQgKiBAcGFyYW0gdmFsdWVMaXN0IFZhbHVlIGxpc3QgaW5mb1xuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBQcm9wZXJ0eSBOYW1lIG9mIHRoZSB2YWx1ZSBoZWxwIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBrZXlWYWx1ZSBWYWx1ZSBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHZhbHVlaGVscFBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCBBZGRpdGlvbmFsIGNvbmRpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBrZXlcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmdDb250ZXh0IG9mIHRoZSBmaWVsZFxuXHQgKiBAcmV0dXJucyBMaXN0IG9mIGZpbHRlcnNcblx0ICovXG5cdF9nZXRGaWx0ZXI6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUxpc3Q6IEFubm90YXRpb25WYWx1ZUxpc3RUeXBlLFxuXHRcdHByb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHZhbHVlSGVscFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0a2V5VmFsdWU6IHN0cmluZyxcblx0XHR2YWx1ZWhlbHBQYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRUeXBlW10gfCB1bmRlZmluZWQsXG5cdFx0YmluZGluZ0NvbnRleHQ/OiBDb250ZXh0XG5cdCkge1xuXHRcdGxldCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB2YWx1ZUxpc3QuUGFyYW1ldGVycy5maWx0ZXIoZnVuY3Rpb24gKHBhcmFtZXRlcikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0cGFyYW1ldGVyLiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuVmFsdWVMaXN0UGFyYW1ldGVySW4gfHxcblx0XHRcdFx0cGFyYW1ldGVyLiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuVmFsdWVMaXN0UGFyYW1ldGVySW5PdXQgfHxcblx0XHRcdFx0KHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlOYW1lICYmIHBhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eSA9PT0gdmFsdWVIZWxwUHJvcGVydHkpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcblx0XHRcdGxldCBmaWx0ZXJWYWx1ZTtcblx0XHRcdGlmIChwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGtleVZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZWhlbHBQYXlsb2FkPy5pc0FjdGlvblBhcmFtZXRlckRpYWxvZyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBhcGRGaWVsZFBhdGggPSBgQVBEXzo6JHtwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGh9YDtcblx0XHRcdFx0Y29uc3QgYXBkRmllbGQgPSBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGFwZEZpZWxkUGF0aCkgYXMgRmllbGQ7XG5cdFx0XHRcdGZpbHRlclZhbHVlID0gYXBkRmllbGQ/LmdldFZhbHVlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBzb3VyY2VQYXRoID0gcGFyYW1ldGVyLlZhbHVlTGlzdFByb3BlcnR5O1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkID0gdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZD8uWzBdO1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IHNvdXJjZVBhdGggJiYgY29uZGl0aW9uUGF5bG9hZD8uW3NvdXJjZVBhdGhdO1xuXHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHQvLyBpZiB0aGUgdmFsdWUgaGVscCBpcyBub3QgdXNlZCB0cnkgZ2V0dGluZyB0aGUgZmlsdGVyIHZhbHVlIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dFxuXHRcdFx0XHRjb25zdCBzb3VyY2VQYXRoID0gcGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5Py4kUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRmaWx0ZXJWYWx1ZSA9IGJpbmRpbmdDb250ZXh0LmdldE9iamVjdChzb3VyY2VQYXRoKTtcblx0XHRcdH1cblx0XHRcdC8qIEFkZCB2YWx1ZSB0byB0aGUgZmlsdGVyIGZvciB0aGUgdGV4dCBkZXRlcm1pbmF0aW9uICovXG5cdFx0XHRpZiAoZmlsdGVyVmFsdWUgIT09IG51bGwgJiYgZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IHBhcmFtZXRlci5WYWx1ZUxpc3RQcm9wZXJ0eSwgb3BlcmF0b3I6IFwiRVFcIiwgdmFsdWUxOiBmaWx0ZXJWYWx1ZSB9KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh2YWx1ZWhlbHBDb25kaXRpb25QYXlsb2FkPy5bMF0pIHtcblx0XHRcdC8vIEluIGNhc2Ugb2YgbXVsdGlwbGUga2V5cyBmb3IgdGhlIHZhbHVlbGlzdCBjb2xsZWN0aW9uLCB0aGUgbWFpbiBWYWx1ZUxpc3RQcm9wZXJ0eSBtaWdodCBub3QgYmUgdW5pcXVlIHRvIGdldCBleGFjdCB2YWx1ZSBsaXN0IHNlbGVjdGlvbi5cblx0XHRcdC8vIFNvLCB3ZSBhZGQgZmlsdGVycyBmb3Iga2V5IHByb3BlcnRpZXMgaWYgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZC5cblx0XHRcdGZpbHRlcnMgPSBmaWx0ZXJzLmNvbmNhdCh0aGlzLl9nZXRSZW1haW5pbmdLZXlWYWx1ZUZpbHRlcnModmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZFswXSwgdmFsdWVMaXN0KSk7XG5cdFx0fVxuXHRcdHJldHVybiBmaWx0ZXJzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgbW9kZWwgZmlsdGVycyB0byBlbnN1cmUgYSBwcmVjaXNlIHNlbGVjdGlvbiBmcm9tIHRoZSBjb25kaXRpb24gcGF5bG9hZC5cblx0ICogQHBhcmFtIGNvbmRpdGlvblBheWxvYWQgQWRkaXRpb25hbCBjb25kaXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMga2V5XG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3QgVmFsdWUgbGlzdCBpbmZvcm1hdGlvblxuXHQgKiBAcmV0dXJucyBMaXN0IG9mIGZpbHRlcnNcblx0ICovXG5cdF9nZXRSZW1haW5pbmdLZXlWYWx1ZUZpbHRlcnMoY29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGUsIHZhbHVlTGlzdDogQW5ub3RhdGlvblZhbHVlTGlzdFR5cGUpOiBGaWx0ZXJbXSB7XG5cdFx0Y29uc3QgeyAkbW9kZWw6IHZhbHVlTGlzdE1vZGVsLCBDb2xsZWN0aW9uUGF0aDogY29sbGVjdGlvblBhdGgsIFBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfSA9IHZhbHVlTGlzdDtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IHZhbHVlTGlzdE1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGAvJHtjb2xsZWN0aW9uUGF0aH1gKTtcblx0XHRjb25zdCBlbnRpdHlUeXBlID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGFsbExvY2FsRGF0YVByb3BlcnRpZXMgPSBwYXJhbWV0ZXJzLnJlZHVjZSgoYXJyLCBwYXJhbWV0ZXIpID0+IHtcblx0XHRcdGlmIChwYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHk/LiRQcm9wZXJ0eVBhdGgpIHtcblx0XHRcdFx0YXJyLnB1c2gocGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFycjtcblx0XHR9LCBbXSBhcyBzdHJpbmdbXSk7XG5cdFx0Y29uc3QgYWxsUmVtYWluaW5nS2V5cyA9IGVudGl0eVR5cGUua2V5cy5yZWR1Y2UoKGFyciwgeyBuYW1lOiBrZXlOYW1lIH0pID0+IHtcblx0XHRcdGlmICghYWxsTG9jYWxEYXRhUHJvcGVydGllcy5pbmNsdWRlcyhrZXlOYW1lKSAmJiBjb25kaXRpb25QYXlsb2FkLmhhc093blByb3BlcnR5KGtleU5hbWUpKSB7XG5cdFx0XHRcdGFyci5wdXNoKGtleU5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFycjtcblx0XHR9LCBbXSBhcyBzdHJpbmdbXSk7XG5cdFx0aWYgKGFsbFJlbWFpbmluZ0tleXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIGFsbFJlbWFpbmluZ0tleXMucmVkdWNlKChmaWx0ZXJzOiBGaWx0ZXJbXSwga2V5OiBzdHJpbmcpOiBGaWx0ZXJbXSA9PiB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSBtZXRhbW9kZWwgb3BlcmF0aW9uLiBUaGUgb3JpZ2luYWwgaXNQcm9wZXJ0eUZpbHRlcmFibGUgbmVlZHMgdG8gYmUgY29udmVydGVkIGxhdGVyLlxuXHRcdFx0XHRjb25zdCBrZXlDb250ZXh0ID0gdmFsdWVMaXN0TW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQoYC8ke2NvbGxlY3Rpb25QYXRofS8ke2tleX1gKTtcblx0XHRcdFx0aWYgKENvbW1vbkhlbHBlci5pc1Byb3BlcnR5RmlsdGVyYWJsZShrZXlDb250ZXh0KSkge1xuXHRcdFx0XHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDoga2V5LCBvcGVyYXRvcjogXCJFUVwiLCB2YWx1ZTE6IGNvbmRpdGlvblBheWxvYWRba2V5XSB9KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZpbHRlcnM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB0aGUga2V5LCBkZXNjcmlwdGlvbiwgYW5kIHBheWxvYWQgb2YgYSB1c2VyIGlucHV0LlxuXHQgKiBAcGFyYW0gZmllbGQgVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFZhbHVlIGhlbHAgaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIE9iamVjdFxuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkZXNjcmlwdGlvbiwga2V5LCBhbmQgcGF5bG9hZC4gSWYgaXQgaXMgbm90IGF2YWlsYWJsZSByaWdodCBub3cgKG11c3QgYmUgcmVxdWVzdGVkKSwgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBpcyByZXR1cm5lZFxuXHQgKi9cblx0Z2V0SXRlbUZvclZhbHVlOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCB2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29uZmlnOiBJdGVtRm9yVmFsdWVDb25maWd1cmF0aW9uKSB7XG5cdFx0Ly9CQ1A6IDIyNzAxNjI4ODcgLiBUaGUgTURDIGZpZWxkIHNob3VsZCBub3QgdHJ5IHRvIGdldCB0aGUgaXRlbSB3aGVuIHRoZSBmaWVsZCBpcyBlbXB0aWVkXG5cdFx0Ly8gSklSQTogRklPUklURUNIUDEtMjUzNjEgLSBJbXByb3ZlIHRoZSB0eXBlLWFoZWFkIGJlaGF2aW9yIGZvciBtaXNzaW5uZyB0ZXh0IGFubm90YXRpb24gb3IgY29uc3RyYWludHMgdmlvbGF0aW9ucyBvZiB0aGUgZXhpc3RpbmcgdGV4dCBhbm5vdGF0aW9uXG5cdFx0aWYgKGNvbmZpZy52YWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb25maWcuY2hlY2tEZXNjcmlwdGlvbikge1xuXHRcdFx0Y29uc3QgdmFsdWVoZWxwUGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uUGF0aCA9IHZhbHVlaGVscFBheWxvYWQudmFsdWVIZWxwRGVzY3JpcHRpb25QYXRoO1xuXHRcdFx0Y29uc3QgbWF4TGVuZ3RoID0gdmFsdWVoZWxwUGF5bG9hZD8ubWF4TGVuZ3RoO1xuXHRcdFx0Y29uc3QgdmFsdWVMZW5ndGggPSBjb25maWcudmFsdWUgIT09IG51bGwgJiYgY29uZmlnLnZhbHVlICE9PSB1bmRlZmluZWQgPyBjb25maWcudmFsdWUudG9TdHJpbmcoKS5sZW5ndGggOiAwO1xuXHRcdFx0aWYgKGRlc2NyaXB0aW9uUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBoZWxwIGNvbGxlY3Rpb24gaGFzIG5vIHRleHQgYW5ub3RhdGlvbiAoZGVzY3JpcHRpb25QYXRoIGlzIGVtcHR5KSB0aGUgZGVzY3JpcHRpb24gY2hlY2sgc2hvdWxkbsK0dCBvY2N1ci5cblx0XHRcdFx0Ly8gSW4gc3VjaCBhIGNhc2UgdGhlIG1ldGhvZCBnZXREZXNjcmlwdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBNREMgYW5kIHdpdGhpbiB0aGlzIG1ldGhvZCBhIFNpZGVFZmZlY3QgaXMgcmVxdWVzdGVkIHRvIHJldHJpZXZlIHRoZSB0ZXh0IGZyb20gdGhlIHRleHQgcHJvcGVydHkgb2YgdGhlIG1haW4gZW50aXR5XG5cdFx0XHRcdGNvbmZpZy5jaGVja0Rlc2NyaXB0aW9uID0gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKG1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG5cdFx0XHRcdC8vdmFsdWUgbGVuZ3RoIGlzID4gdGV4dCBwcm9lcGVydHkgbGVuZ3RoIGNvbnN0cmFpbnRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gRmllbGRCYXNlRGVsZWdhdGUuZ2V0SXRlbUZvclZhbHVlKGZpZWxkLCB2YWx1ZUhlbHAsIGNvbmZpZyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgdGhlIGRlc2NyaXB0aW9uIGZvciBhIGdpdmVuIGtleS5cblx0ICogQHBhcmFtIGZpZWxkIFRoZSA8Y29kZT5GaWVsZDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIHZhbHVlSGVscCBGaWVsZCBoZWxwIGFzc2lnbmVkIHRvIHRoZSA8Y29kZT5GaWVsZDwvY29kZT4gb3IgPGNvZGU+RmlsdGVyRmllbGQ8L2NvZGU+IGNvbnRyb2xcblx0ICogQHBhcmFtIGtleSBLZXkgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBfY29uZGl0aW9uSW4gSW4gcGFyYW1ldGVycyBmb3IgdGhlIGtleSAobm8gbG9uZ2VyIHN1cHBvcnRlZClcblx0ICogQHBhcmFtIF9jb25kaXRpb25PdXQgT3V0IHBhcmFtZXRlcnMgZm9yIHRoZSBrZXkgKG5vIGxvbmdlciBzdXBwb3J0ZWQpXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nQ29udGV4dCA8Y29kZT5CaW5kaW5nQ29udGV4dDwvY29kZT4gb2YgdGhlIGNoZWNrZWQgZmllbGQuIEluc2lkZSBhIHRhYmxlLCB0aGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBlbGVtZW50IGNhbiBiZSBjb25uZWN0ZWQgdG8gYSBkaWZmZXJlbnQgcm93XG5cdCAqIEBwYXJhbSBfQ29uZGl0aW9uTW9kZWwgQ29uZGl0aW9uTW9kZWw8L2NvZGU+LCBpZiBib3VuZCB0byBvbmVcblx0ICogQHBhcmFtIF9jb25kaXRpb25Nb2RlbE5hbWUgTmFtZSBvZiB0aGUgPGNvZGU+Q29uZGl0aW9uTW9kZWw8L2NvZGU+LCBpZiBib3VuZCB0byBvbmVcblx0ICogQHBhcmFtIGNvbmRpdGlvblBheWxvYWQgQWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGZvciB0aGlzIGtleVxuXHQgKiBAcGFyYW0gY29udHJvbCBJbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEBwYXJhbSBfdHlwZSBUeXBlIG9mIHRoZSB2YWx1ZVxuXHQgKiBAcmV0dXJucyBEZXNjcmlwdGlvbiBmb3IgdGhlIGtleSBvciBvYmplY3QgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uLCBrZXkgYW5kIHBheWxvYWQuIElmIHRoZSBkZXNjcmlwdGlvbiBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IGF3YXkgKGl0IG11c3QgYmUgcmVxdWVzdGVkKSwgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBpcyByZXR1cm5lZFxuXHQgKi9cblx0Z2V0RGVzY3JpcHRpb246IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRmaWVsZDogRmllbGQgfCBudWxsLFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdF9jb25kaXRpb25Jbjogb2JqZWN0LFxuXHRcdF9jb25kaXRpb25PdXQ6IG9iamVjdCxcblx0XHRiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRfQ29uZGl0aW9uTW9kZWw6IENvbmRpdGlvbk1vZGVsLFxuXHRcdF9jb25kaXRpb25Nb2RlbE5hbWU6IHN0cmluZyxcblx0XHRjb25kaXRpb25QYXlsb2FkOiBDb25kaXRpb25QYXlsb2FkTWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0X3R5cGU6IHVua25vd25cblx0KSB7XG5cdFx0Ly9KSVJBOiBGSU9SSVRFQ0hQMS0yMjAyMiAuIFRoZSBNREMgZmllbGQgc2hvdWxkIG5vdCAgdHJpZXMgdG8gZGV0ZXJtaW5lIGRlc2NyaXB0aW9uIHdpdGggdGhlIGluaXRpYWwgR0VUIG9mIHRoZSBkYXRhLlxuXHRcdC8vIGl0IHNob3VsZCByZWx5IG9uIHRoZSBkYXRhIHdlIGFscmVhZHkgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZFxuXHRcdC8vIEJ1dCBUaGUgZ2V0RGVzY3JpcHRpb24gZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgaW4gdGhlIEZpbHRlckZpZWxkIGNhc2UgaWYgYSB2YXJpYW50IGlzIGxvYWRlZC5cblx0XHQvLyBBcyB0aGUgZGVzY3JpcHRpb24gdGV4dCBjb3VsZCBiZSBsYW5ndWFnZSBkZXBlbmRlbnQgaXQgaXMgbm90IHN0b3JlZCBpbiB0aGUgdmFyaWFudCwgc28gaXQgbmVlZHMgdG8gYmUgcmVhZCBvbiByZW5kZXJpbmcuXG5cblx0XHRsZXQgcGF5bG9hZCA9IGZpZWxkPy5nZXRQYXlsb2FkKCkgYXMgRmllbGRQYXlsb2FkO1xuXG5cdFx0LyogUmV0cmlldmUgdGV4dCBmcm9tIHZhbHVlIGhlbHAsIGlmIHZhbHVlIHdhcyBzZXQgYnkgb3V0LXBhcmFtZXRlciAoQkNQIDIyNzAxNjA2MzMpICovXG5cdFx0aWYgKCFwYXlsb2FkICYmIChjb250cm9sIGFzIEZpZWxkQmFzZSk/LmdldERpc3BsYXkoKS5pbmNsdWRlcyhcIkRlc2NyaXB0aW9uXCIpKSB7XG5cdFx0XHRwYXlsb2FkID0ge1xuXHRcdFx0XHRyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0OiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChwYXlsb2FkPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ID09PSB0cnVlIHx8IHBheWxvYWQ/LmlzRmlsdGVyRmllbGQgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IGRhdGFNb2RlbCA9IHZhbHVlSGVscC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBkYXRhTW9kZWxcblx0XHRcdFx0PyBkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0OiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmFsdWVIZWxwIGFzIHVua25vd24gYXMgQ29udHJvbClcblx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCB2YWx1ZWhlbHBQYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0Y29uc3QgdmFsdWVoZWxwQ29uZGl0aW9uUGF5bG9hZCA9IGNvbmRpdGlvblBheWxvYWQ/Llt2YWx1ZWhlbHBQYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSB2YWx1ZWhlbHBQYXlsb2FkLnByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGVzY3JpcHRpb25QYXRoID0gdmFsdWVoZWxwUGF5bG9hZD8ucHJvcGVydHlEZXNjcmlwdGlvblBhdGg7XG5cdFx0XHRsZXQgdGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8qIFJlcXVlc3QgdmFsdWUgaGVscCBtZXRhZGF0YSAqL1xuXHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gYXdhaXQgbWV0YU1vZGVsLnJlcXVlc3RWYWx1ZUxpc3RJbmZvKHByb3BlcnR5UGF0aCwgdHJ1ZSwgYmluZGluZ0NvbnRleHQpO1xuXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7cHJvcGVydHlQYXRofUBzYXB1aS5uYW1lYCkgYXMgc3RyaW5nO1xuXHRcdFx0XHQvLyB0YWtlIHRoZSBmaXJzdCB2YWx1ZSBsaXN0IGFubm90YXRpb24gLSBhbHRlcm5hdGl2ZWx5IHRha2UgdGhlIG9uZSB3aXRob3V0IHF1YWxpZmllciBvciB0aGUgZmlyc3Qgb25lXG5cdFx0XHRcdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlTGlzdEluZm9bT2JqZWN0LmtleXModmFsdWVMaXN0SW5mbylbMF1dO1xuXHRcdFx0XHRjb25zdCB2YWx1ZUhlbHBQYXJhbWV0ZXJzID0gdGhpcy5fZ2V0VmFsdWVMaXN0UGFyYW1ldGVyKHZhbHVlTGlzdCwgcHJvcGVydHlOYW1lKTtcblx0XHRcdFx0Y29uc3QgdmFsdWVIZWxwUHJvcGVydHkgPSB2YWx1ZUhlbHBQYXJhbWV0ZXJzPy5bMF0/LlZhbHVlTGlzdFByb3BlcnR5O1xuXHRcdFx0XHRpZiAoIXZhbHVlSGVscFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0dGhyb3cgRXJyb3IoYEluY29uc2lzdGVudCB2YWx1ZSBoZWxwIGFubm90YXRpb24gZm9yICR7cHJvcGVydHlOYW1lfWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGdldCB0ZXh0IGFubm90YXRpb24gZm9yIHRoaXMgdmFsdWUgbGlzdCBwcm9wZXJ0eVxuXHRcdFx0XHRjb25zdCB2YWx1ZUxpc3RNb2RlbCA9IHZhbHVlTGlzdC4kbW9kZWw7XG5cdFx0XHRcdGNvbnN0IHRleHRBbm5vdGF0aW9uID0gdmFsdWVMaXN0TW9kZWxcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KGAvJHt2YWx1ZUxpc3QuQ29sbGVjdGlvblBhdGh9LyR7dmFsdWVIZWxwUHJvcGVydHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YCk7XG5cdFx0XHRcdGlmICh0ZXh0QW5ub3RhdGlvbiAmJiB0ZXh0QW5ub3RhdGlvbi4kUGF0aCkge1xuXHRcdFx0XHRcdHRleHRQcm9wZXJ0eSA9IHRleHRBbm5vdGF0aW9uLiRQYXRoO1xuXHRcdFx0XHRcdC8qIEJ1aWxkIHRoZSBmaWx0ZXIgZm9yIHRoZSByZWxldmFudCBwYXJhbWV0ZXJzICovXG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVycyA9IHRoaXMuX2dldEZpbHRlcihcblx0XHRcdFx0XHRcdHZhbHVlTGlzdCxcblx0XHRcdFx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdHZhbHVlSGVscFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdFx0dmFsdWVoZWxwUGF5bG9hZCxcblx0XHRcdFx0XHRcdHZhbHVlaGVscENvbmRpdGlvblBheWxvYWQsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB2YWx1ZUxpc3RNb2RlbC5iaW5kTGlzdChgLyR7dmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXJzLCB7XG5cdFx0XHRcdFx0XHQkc2VsZWN0OiB0ZXh0UHJvcGVydHlcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvKiBSZXF1ZXN0IGRlc2NyaXB0aW9uIGZvciBnaXZlbiBrZXkgZnJvbSB2YWx1ZSBsaXN0IGVudGl0eSAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIDIpO1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5sZW5ndGggPyBjb250ZXh0c1swXS5nZXRPYmplY3QodGV4dFByb3BlcnR5KSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nQ29udGV4dCAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5RGVzY3JpcHRpb25QYXRoKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gcHJvcGVydHlEZXNjcmlwdGlvblBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHByb3BlcnR5RGVzY3JpcHRpb25QYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogcHJvcGVydHlEZXNjcmlwdGlvblBhdGg7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNTZXJ2aWNlID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZhbHVlSGVscCBhcyB1bmtub3duIGFzIENvbnRyb2wpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdFx0XHRcdGF3YWl0IHNpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSwgYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKFxuXHRcdFx0XHRcdFx0YFJlcXVlc3RTaWRlRWZmZWN0cyBpcyB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgdGV4dCBhbm5vdGF0aW9uIGZvciAke3ZhbHVlSGVscFByb3BlcnR5fSBpcyBub3QgZGVmaW5lZCBhdCB0aGUgQ29sbGVjdGlvblBhdGggb2YgdGhlIHZhbHVlIGhlbHBgXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qIEVYVEVSTkFsSUQgKi9cblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUGF0aCA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0YCR7dmFsdWVoZWxwUGF5bG9hZC5wcm9wZXJ0eVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5FeHRlcm5hbElEYFxuXHRcdFx0XHRcdCk/LiRQYXRoO1xuXHRcdFx0XHRcdGlmIChleHRlcm5hbElkUGF0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZEZ1bGxQYXRoID0gdmFsdWVoZWxwUGF5bG9hZC5wcm9wZXJ0eVBhdGgucmVwbGFjZShwcm9wZXJ0eU5hbWUsIGV4dGVybmFsSWRQYXRoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWROYW1lID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtleHRlcm5hbElkRnVsbFBhdGh9QHNhcHVpLm5hbWVgKTtcblx0XHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWREZXNjcmlwdGlvblBhdGggPSBtZXRhTW9kZWw/LmdldE9iamVjdChgJHtleHRlcm5hbElkRnVsbFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YClcblx0XHRcdFx0XHRcdFx0Py4kUGF0aDtcblx0XHRcdFx0XHRcdGNvbnN0IGZpbHRlcnMgPSBbXTtcblx0XHRcdFx0XHRcdGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgcGF0aDogZXh0ZXJuYWxJZE5hbWUsIG9wZXJhdG9yOiBcIkVRXCIsIHZhbHVlMToga2V5IH0pKTtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gdmFsdWVMaXN0TW9kZWwuYmluZExpc3QoYC8ke3ZhbHVlTGlzdC5Db2xsZWN0aW9uUGF0aH1gLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmlsdGVycywge1xuXHRcdFx0XHRcdFx0XHQkc2VsZWN0OiBgJHtleHRlcm5hbElkTmFtZX0sJHtleHRlcm5hbElkRGVzY3JpcHRpb25QYXRofWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0XHRpZiAoY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0c1swXS5nZXRPYmplY3QoZXh0ZXJuYWxJZERlc2NyaXB0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdExvZy5lcnJvcihgVGV4dCBBbm5vdGF0aW9uIGZvciAke3ZhbHVlSGVscFByb3BlcnR5fSBpcyBub3QgZGVmaW5lZGApO1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IHN0YXR1cyA9IGVycm9yID8gKGVycm9yIGFzIFhNTEh0dHBSZXF1ZXN0KS5zdGF0dXMgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRcdGNvbnN0IG1zZyA9IHN0YXR1cyA9PT0gNDA0ID8gYE1ldGFkYXRhIG5vdCBmb3VuZCAoJHtzdGF0dXN9KSBmb3IgdmFsdWUgaGVscCBvZiBwcm9wZXJ0eSAke3Byb3BlcnR5UGF0aH1gIDogbWVzc2FnZTtcblx0XHRcdFx0TG9nLmVycm9yKG1zZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztTQTJDZUEsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGlCQUFpQixFQUFFO0lBQ25EQyxVQUFVLEVBQUUsQ0FBQztJQUViO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx5QkFBeUIsRUFBRSxTQUFBQSxDQUFVQyxLQUFZLEVBQUVDLElBQTRCLEVBQUVDLEtBQXNCLEVBQUU7TUFDeEc7TUFDQTtNQUNBOztNQUVBLE1BQU1DLE1BQTBCLEdBQUcsQ0FBQyxDQUFDO01BQ3JDLElBQ0NGLElBQUksSUFDSkEsSUFBSSxDQUFDRyxHQUFHLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDLElBQzlFQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0osS0FBSyxDQUFDLElBQ3BCQSxLQUFLLENBQUNLLE1BQU0sR0FBRyxDQUFDLElBQ2hCTCxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUtNLFNBQVMsRUFDckI7UUFDRDtRQUNBUCxJQUFJLENBQUNRLFdBQVcsQ0FBQ1AsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqQ0MsTUFBTSxDQUFDTyxnQkFBZ0IsR0FBRyxJQUFJO1FBQzlCUCxNQUFNLENBQUNRLFlBQVksR0FBR1QsS0FBSyxDQUFDLENBQUMsQ0FBVyxDQUFDLENBQUM7TUFDM0M7TUFFQSxPQUFPQyxNQUFNO0lBQ2QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CommonAnnotationTypes } from "@sap-ux/vocabularies-types/vocabularies/Common";
|
|
2
2
|
import Log from "sap/base/Log";
|
|
3
3
|
import CommonUtils from "sap/fe/core/CommonUtils";
|
|
4
|
+
import { getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
|
|
4
5
|
import type { AnnotationValueListType, ValueHelpPayload } from "sap/fe/macros/internal/valuehelp/ValueListHelper";
|
|
5
6
|
import type Control from "sap/ui/core/Control";
|
|
6
7
|
import Element from "sap/ui/core/Element";
|
|
@@ -15,6 +16,7 @@ import Filter from "sap/ui/model/Filter";
|
|
|
15
16
|
import type SimpleType from "sap/ui/model/SimpleType";
|
|
16
17
|
import type Context from "sap/ui/model/odata/v4/Context";
|
|
17
18
|
import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
|
|
19
|
+
import CommonHelper from "../CommonHelper";
|
|
18
20
|
import type { ConditionPayloadMap, ConditionPayloadType } from "../valuehelp/ValueHelpDelegate";
|
|
19
21
|
export type FieldPayload = {
|
|
20
22
|
retrieveTextFromValueList?: boolean;
|
|
@@ -155,7 +157,7 @@ export default Object.assign({}, FieldBaseDelegate, {
|
|
|
155
157
|
valuehelpConditionPayload: ConditionPayloadType[] | undefined,
|
|
156
158
|
bindingContext?: Context
|
|
157
159
|
) {
|
|
158
|
-
|
|
160
|
+
let filters: Filter[] = [];
|
|
159
161
|
const parameters = valueList.Parameters.filter(function (parameter) {
|
|
160
162
|
return (
|
|
161
163
|
parameter.$Type === CommonAnnotationTypes.ValueListParameterIn ||
|
|
@@ -172,7 +174,7 @@ export default Object.assign({}, FieldBaseDelegate, {
|
|
|
172
174
|
const apdField = Element.getElementById(apdFieldPath) as Field;
|
|
173
175
|
filterValue = apdField?.getValue();
|
|
174
176
|
} else if (valuehelpConditionPayload !== undefined) {
|
|
175
|
-
const sourcePath = parameter.
|
|
177
|
+
const sourcePath = parameter.ValueListProperty;
|
|
176
178
|
const conditionPayload = valuehelpConditionPayload?.[0];
|
|
177
179
|
filterValue = sourcePath && conditionPayload?.[sourcePath];
|
|
178
180
|
} else if (bindingContext) {
|
|
@@ -185,9 +187,49 @@ export default Object.assign({}, FieldBaseDelegate, {
|
|
|
185
187
|
filters.push(new Filter({ path: parameter.ValueListProperty, operator: "EQ", value1: filterValue }));
|
|
186
188
|
}
|
|
187
189
|
}
|
|
190
|
+
if (valuehelpConditionPayload?.[0]) {
|
|
191
|
+
// In case of multiple keys for the valuelist collection, the main ValueListProperty might not be unique to get exact value list selection.
|
|
192
|
+
// So, we add filters for key properties if they are present in the valuehelpConditionPayload.
|
|
193
|
+
filters = filters.concat(this._getRemainingKeyValueFilters(valuehelpConditionPayload[0], valueList));
|
|
194
|
+
}
|
|
188
195
|
return filters;
|
|
189
196
|
},
|
|
190
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Get model filters to ensure a precise selection from the condition payload.
|
|
200
|
+
* @param conditionPayload Additional condition information for this key
|
|
201
|
+
* @param valueList Value list information
|
|
202
|
+
* @returns List of filters
|
|
203
|
+
*/
|
|
204
|
+
_getRemainingKeyValueFilters(conditionPayload: ConditionPayloadType, valueList: AnnotationValueListType): Filter[] {
|
|
205
|
+
const { $model: valueListModel, CollectionPath: collectionPath, Parameters: parameters } = valueList;
|
|
206
|
+
const metaContext = valueListModel.getMetaModel().getMetaContext(`/${collectionPath}`);
|
|
207
|
+
const entityType = getInvolvedDataModelObjects(metaContext).targetEntityType;
|
|
208
|
+
const allLocalDataProperties = parameters.reduce((arr, parameter) => {
|
|
209
|
+
if (parameter.LocalDataProperty?.$PropertyPath) {
|
|
210
|
+
arr.push(parameter.LocalDataProperty.$PropertyPath);
|
|
211
|
+
}
|
|
212
|
+
return arr;
|
|
213
|
+
}, [] as string[]);
|
|
214
|
+
const allRemainingKeys = entityType.keys.reduce((arr, { name: keyName }) => {
|
|
215
|
+
if (!allLocalDataProperties.includes(keyName) && conditionPayload.hasOwnProperty(keyName)) {
|
|
216
|
+
arr.push(keyName);
|
|
217
|
+
}
|
|
218
|
+
return arr;
|
|
219
|
+
}, [] as string[]);
|
|
220
|
+
if (allRemainingKeys.length > 0) {
|
|
221
|
+
return allRemainingKeys.reduce((filters: Filter[], key: string): Filter[] => {
|
|
222
|
+
// This is a metamodel operation. The original isPropertyFilterable needs to be converted later.
|
|
223
|
+
const keyContext = valueListModel.getMetaModel().getMetaContext(`/${collectionPath}/${key}`);
|
|
224
|
+
if (CommonHelper.isPropertyFilterable(keyContext)) {
|
|
225
|
+
filters.push(new Filter({ path: key, operator: "EQ", value1: conditionPayload[key] }));
|
|
226
|
+
}
|
|
227
|
+
return filters;
|
|
228
|
+
}, []);
|
|
229
|
+
}
|
|
230
|
+
return [];
|
|
231
|
+
},
|
|
232
|
+
|
|
191
233
|
/**
|
|
192
234
|
* Determines the key, description, and payload of a user input.
|
|
193
235
|
* @param field The <code>Field</code> instance
|