@sapui5/sap.fe.core 1.136.10 → 1.136.11
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/core/.library +1 -1
- package/src/sap/fe/core/PageController.controller.js +10 -0
- package/src/sap/fe/core/PageController.controller.ts +3 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +23 -13
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +34 -13
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +1 -0
- package/src/sap/fe/core/converters/controls/Common/Action.js +15 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +21 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +54 -46
- package/src/sap/fe/core/converters/controls/Common/Table.ts +65 -45
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +26 -6
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +32 -10
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +75 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +79 -25
- package/src/sap/fe/core/helpers/MetaModelFunction.js +10 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +9 -3
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle_es.properties +1 -1
- package/src/sap/fe/core/messagebundle_fr.properties +1 -1
- package/src/sap/fe/core/messagebundle_ko.properties +1 -1
- package/src/sap/fe/core/messagebundle_no.properties +2 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +4 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +5 -2
- package/ui5.yaml +1 -0
|
@@ -90,36 +90,89 @@ sap.ui.define(["sap/ui/model/Filter", "sap/ui/model/FilterOperator", "../convert
|
|
|
90
90
|
});
|
|
91
91
|
},
|
|
92
92
|
/**
|
|
93
|
-
*
|
|
94
|
-
* @param
|
|
95
|
-
* @param
|
|
93
|
+
* Load contexts for a list of Page infos, based on their respective keys.
|
|
94
|
+
* @param startupPages
|
|
95
|
+
* @param model
|
|
96
96
|
* @returns A Promise for all contexts
|
|
97
97
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const entityType = oModel.getMetaModel().getObject(`${pageInfo.contextPath}/`);
|
|
98
|
+
_getContextsFromPages: async function (startupPages, model) {
|
|
99
|
+
return Promise.all(startupPages.map(async pageInfo => {
|
|
100
|
+
const entityType = model.getMetaModel().getObject(`${pageInfo.contextPath}/`);
|
|
102
101
|
if (pageInfo.technicalKeys) {
|
|
103
102
|
this._sanitizeKeys(pageInfo.technicalKeys, entityType);
|
|
104
103
|
// Create a context with the proper path
|
|
105
104
|
const path = `${pageInfo.contextPath}(${SemanticKeyHelper.getPathContent(pageInfo.technicalKeys, entityType)})`;
|
|
106
|
-
const context =
|
|
105
|
+
const context = model.bindContext(path).getBoundContext();
|
|
107
106
|
return Promise.resolve([context]);
|
|
108
107
|
} else {
|
|
109
|
-
const
|
|
110
|
-
this._sanitizeKeys(
|
|
111
|
-
const
|
|
108
|
+
const keys = pageInfo.semanticKeys ?? [];
|
|
109
|
+
this._sanitizeKeys(keys, entityType);
|
|
110
|
+
const filter = this._createFilterFromKeys(keys, pageInfo.draftMode, model.getMetaModel());
|
|
112
111
|
|
|
113
112
|
// only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
// IsActiveEntity is needed to distinguish between draft and active entities
|
|
114
|
+
const selectedFields = keys.map(key => key.name);
|
|
115
|
+
if (pageInfo.draftMode && !selectedFields.includes("IsActiveEntity")) {
|
|
116
|
+
selectedFields.push("IsActiveEntity");
|
|
117
|
+
}
|
|
118
|
+
const oListBind = model.bindList(pageInfo.contextPath, undefined, undefined, filter, {
|
|
119
|
+
$select: selectedFields.join(",")
|
|
118
120
|
});
|
|
119
121
|
return oListBind.requestContexts(0, 2);
|
|
120
122
|
}
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
+
}));
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Loads all contexts for a list of page infos.
|
|
127
|
+
* @param aStartupPages The list of page infos
|
|
128
|
+
* @param oModel The model used to load the contexts
|
|
129
|
+
* @returns A Promise for all contexts
|
|
130
|
+
*/
|
|
131
|
+
_requestObjectsFromParameters: async function (aStartupPages, oModel) {
|
|
132
|
+
// We don't want to mix active and draft in the returned contexts,
|
|
133
|
+
// So if the first page uses technical keys + draft + contains IsActiveEntity, add IsActiveEntity everywhere.
|
|
134
|
+
if (aStartupPages[0].draftMode && aStartupPages[0].technicalKeys !== undefined) {
|
|
135
|
+
const isActiveKey = aStartupPages[0].technicalKeys?.find(key => key.name === "IsActiveEntity");
|
|
136
|
+
if (isActiveKey) {
|
|
137
|
+
for (const pageInfo of aStartupPages) {
|
|
138
|
+
if (pageInfo.draftMode && pageInfo.semanticKeys?.some(key => key.name === "IsActiveEntity") === false) {
|
|
139
|
+
pageInfo.semanticKeys.push({
|
|
140
|
+
name: "IsActiveEntity",
|
|
141
|
+
value: isActiveKey.value
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
let contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
148
|
+
if (contexts.some(ctx => ctx.length !== 1)) {
|
|
149
|
+
return contexts; // failed to load some contexts, return as is
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// We don't want to mix active and draft in the returned contexts.
|
|
153
|
+
// --> Check if all contexts are either all drafts or all active entities. If not, rerun the requests by
|
|
154
|
+
// forcing IsActiveEntity = true (this case can happen if a draft sub-object has been deleted but exists
|
|
155
|
+
// in the active object graph). We cannot load draft + active in a single request (CAP limitation)
|
|
156
|
+
const containsActive = contexts.some(ctx => ctx[0].getObject()?.["IsActiveEntity"] === true);
|
|
157
|
+
const containsDraft = contexts.some(ctx => ctx[0].getObject()?.["IsActiveEntity"] === false);
|
|
158
|
+
if (containsActive && containsDraft) {
|
|
159
|
+
for (const pageInfo of aStartupPages) {
|
|
160
|
+
if (pageInfo.draftMode) {
|
|
161
|
+
const keys = pageInfo.semanticKeys ?? pageInfo.technicalKeys;
|
|
162
|
+
const isActiveKey = keys.find(key => key.name === "IsActiveEntity");
|
|
163
|
+
if (isActiveKey) {
|
|
164
|
+
isActiveKey.value = "true";
|
|
165
|
+
} else {
|
|
166
|
+
keys.push({
|
|
167
|
+
name: "IsActiveEntity",
|
|
168
|
+
value: "true"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
174
|
+
}
|
|
175
|
+
return contexts;
|
|
123
176
|
},
|
|
124
177
|
/**
|
|
125
178
|
* Returns the rightmost target name for a given route.
|
|
@@ -325,6 +378,10 @@ sap.ui.define(["sap/ui/model/Filter", "sap/ui/model/FilterOperator", "../convert
|
|
|
325
378
|
|
|
326
379
|
// Check if semantic keys are present in url parameters for every object page at each level
|
|
327
380
|
const startupPages = this._getStartupPagesFromStartupParams(oManifestRouting, oStartupParameters, oModel.getMetaModel());
|
|
381
|
+
if (startupPages.length === 0) {
|
|
382
|
+
// No deeplink possible
|
|
383
|
+
return {};
|
|
384
|
+
}
|
|
328
385
|
|
|
329
386
|
// Load the contexts
|
|
330
387
|
const allContexts = await this._requestObjectsFromParameters(startupPages, oModel);
|
|
@@ -417,4 +474,4 @@ sap.ui.define(["sap/ui/model/Filter", "sap/ui/model/FilterOperator", "../convert
|
|
|
417
474
|
};
|
|
418
475
|
return AppStartupHelper;
|
|
419
476
|
}, false);
|
|
420
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBcHBTdGFydHVwSGVscGVyIiwiX2dldEtleXNGcm9tU3RhcnR1cFBhcmFtcyIsImFLZXlOYW1lcyIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJBbGxGb3VuZCIsImFLZXlzIiwibWFwIiwibmFtZSIsImxlbmd0aCIsInZhbHVlIiwidW5kZWZpbmVkIiwiX2NyZWF0ZUZpbHRlckZyb21LZXlzIiwiYkRyYWZ0TW9kZSIsIm9NZXRhTW9kZWwiLCJiRmlsdGVyQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYkZpbHRlck9uQWN0aXZlRW50aXR5IiwiYUZpbHRlcnMiLCJrZXkiLCJGaWx0ZXIiLCJwYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwiX3Nhbml0aXplS2V5cyIsImtleXMiLCJlbnRpdHlUeXBlIiwiZm9yRWFjaCIsInByb3BlcnR5VHlwZSIsIiRUeXBlIiwidHJpbSIsIm1hdGNoIiwiZXhlYyIsIl9yZXF1ZXN0T2JqZWN0c0Zyb21QYXJhbWV0ZXJzIiwiYVN0YXJ0dXBQYWdlcyIsIm9Nb2RlbCIsImFDb250ZXh0UHJvbWlzZXMiLCJwYWdlSW5mbyIsImdldE1ldGFNb2RlbCIsImdldE9iamVjdCIsImNvbnRleHRQYXRoIiwidGVjaG5pY2FsS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0UGF0aENvbnRlbnQiLCJjb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNlbWFudGljS2V5cyIsIm9GaWx0ZXIiLCJkcmFmdE1vZGUiLCJvTGlzdEJpbmQiLCJiaW5kTGlzdCIsIiRzZWxlY3QiLCJqb2luIiwicmVxdWVzdENvbnRleHRzIiwiYWxsIiwiX2dldFJpZ2h0TW9zdFRhcmdldE5hbWUiLCJyb3V0ZSIsIm1hbmlmZXN0Um91dGluZyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInJldmVyc2VUYXJnZXRzIiwicmV2ZXJzZSIsImZpbmQiLCJ0YXJnZXRJRCIsImN1cnJlbnRUYXJnZXQiLCJ0YXJnZXRzIiwiaW5jbHVkZXMiLCJfZ2V0UmVhY2hhYmxlUGFnZUluZm9Gcm9tUm91dGUiLCJvUm91dGUiLCJvTWFuaWZlc3RSb3V0aW5nIiwic1BhdHRlcm4iLCJwYXR0ZXJuIiwicmVwbGFjZSIsImVuZHNXaXRoIiwic1RhcmdldE5hbWUiLCJvVGFyZ2V0IiwiYVBhdHRlcm5TZWdtZW50cyIsInNwbGl0IiwicGFnZUxldmVsIiwib3B0aW9ucyIsInNldHRpbmdzIiwiYWxsb3dEZWVwTGlua2luZyIsInNDb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1ldGFDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwidGFyZ2V0RW50aXR5U2V0Iiwib0VudGl0eVR5cGUiLCJzZW1hbnRpY0tleU5hbWVzIiwic2VtS2V5IiwiJFByb3BlcnR5UGF0aCIsInRlY2huaWNhbEtleU5hbWVzIiwiZXZlcnkiLCJhU2VtYW50aWNrS2V5cyIsImFUZWNobmljYWxLZXlzIiwiX2dldFJlYWNoYWJsZVBhZ2VzIiwiYVJvdXRlcyIsInJvdXRlcyIsIm1QYWdlc0J5TGV2ZWwiLCJvUGFnZUluZm8iLCJhUmVhY2hhYmxlUGFnZXMiLCJsZXZlbCIsIl9nZXRTdGFydHVwUGFnZXNGcm9tU3RhcnR1cFBhcmFtcyIsInJlc3VsdCIsImN1cnJlbnQiLCJmaW5kUmVjdXJzaXZlIiwiYUN1cnJlbnRMZXZlbFBhZ2VzIiwibGFzdFBhZ2UiLCJuZXh0UGFnZSIsImluZGV4T2YiLCJwb3AiLCJzbGljZSIsIl9nZXREZWVwTGlua09iamVjdCIsImFDb250ZXh0cyIsImhhc2giLCJvQ29udGV4dCIsImdldFBhdGgiLCJnZXREZWVwTGlua1N0YXJ0dXBIYXNoIiwicmVxdWVzdE9iamVjdCIsInN0YXJ0dXBQYWdlcyIsImFsbENvbnRleHRzIiwiY29udGV4dHNGb3JTdGFydHVwIiwiZm91bmRDb250ZXh0cyIsImdldENyZWF0ZVN0YXJ0dXBIYXNoIiwib1JvdXRlciIsInRoZW4iLCJvRW50aXR5U2V0QW5ub3RhdGlvbnMiLCJzTWV0YVBhdGgiLCJiQ3JlYXRhYmxlIiwiYk5ld0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSIsIm9JbnNlcnRSZXN0cmljdGlvbnMiLCJJbnNlcnRhYmxlIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJzRGVmYXVsdENyZWF0ZUhhc2giLCJwcmVmZXJyZWRNb2RlIiwic0hhc2giLCJzdWJzdHJpbmciLCJnZXRSb3V0ZUluZm9CeUhhc2giLCJFcnJvciIsInZlcmlmeUVkaXRBbm5vdGF0aW9ucyIsIm1ldGFNb2RlbCIsImVudGl0eVNldEFubm90YXRpb25zIiwidXBkYXRlSGlkZGVuIiwib3BlcmF0aW9uQXZhaWxhYmxlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJBcHBTdGFydHVwSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXJ0dXBQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nQ29uZmlndXJhdGlvbiwgUm91dGluZ1JvdXRlIH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEV4cGFuZFBhdGhUeXBlLCBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcIi4vTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwiLi9TZW1hbnRpY0tleUhlbHBlclwiO1xuXG50eXBlIFZhbHVlZEtleSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHR2YWx1ZTogc3RyaW5nO1xufTtcblxudHlwZSBQYWdlSW5mbyA9IHtcblx0cGF0dGVybjogc3RyaW5nO1xuXHRjb250ZXh0UGF0aDogc3RyaW5nO1xuXHRkcmFmdE1vZGU6IGJvb2xlYW47XG5cdHRlY2huaWNhbEtleXM6IFZhbHVlZEtleVtdIHwgdW5kZWZpbmVkO1xuXHRzZW1hbnRpY0tleXM6IFZhbHVlZEtleVtdIHwgdW5kZWZpbmVkO1xuXHR0YXJnZXQ6IHN0cmluZztcblx0cGFnZUxldmVsOiBudW1iZXI7XG59O1xuXG5jb25zdCBBcHBTdGFydHVwSGVscGVyID0ge1xuXHQvKipcblx0ICogUmV0cmlldmVzIGEgc2V0IG9mIGtleSB2YWx1ZXMgZnJvbSBzdGFydHVwIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBhS2V5TmFtZXMgVGhlIGFycmF5IG9mIGtleSBuYW1lc1xuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgcGFpcnMgXFx7bmFtZSwgdmFsdWVcXH0gaWYgYWxsIGtleSB2YWx1ZXMgY291bGQgYmUgZm91bmQgaW4gdGhlIHN0YXJ0dXAgcGFyYW1ldGVycywgdW5kZWZpbmVkIG90aGVyd2lzZVxuXHQgKi9cblx0X2dldEtleXNGcm9tU3RhcnR1cFBhcmFtczogZnVuY3Rpb24gKGFLZXlOYW1lczogc3RyaW5nW10sIG9TdGFydHVwUGFyYW1ldGVyczogU3RhcnR1cFBhcmFtZXRlcnMgfCBudWxsKTogVmFsdWVkS2V5W10gfCB1bmRlZmluZWQge1xuXHRcdGxldCBiQWxsRm91bmQgPSB0cnVlO1xuXHRcdGNvbnN0IGFLZXlzID0gYUtleU5hbWVzLm1hcCgobmFtZSkgPT4ge1xuXHRcdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycz8uW25hbWVdICYmIG9TdGFydHVwUGFyYW1ldGVyc1tuYW1lXS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIHsgbmFtZSwgdmFsdWU6IG9TdGFydHVwUGFyYW1ldGVyc1tuYW1lXVswXSBhcyBzdHJpbmcgfTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEEgdW5pcXVlIGtleSB2YWx1ZSBjb3VsZG4ndCBiZSBmb3VuZCBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdFx0XHRcdGJBbGxGb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4geyBuYW1lLCB2YWx1ZTogXCJcIiB9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGJBbGxGb3VuZCA/IGFLZXlzIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZmlsdGVyIGZyb20gYSBsaXN0IG9mIGtleSB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBhS2V5cyBBcnJheSBvZiBzZW1hbnRpYyBrZXlzIG9yIHRlY2huaWNhbCBrZXlzICh3aXRoIHZhbHVlcylcblx0ICogQHBhcmFtIGJEcmFmdE1vZGUgVHJ1ZSBpZiB0aGUgZW50aXR5IHN1cHBvcnRzIGRyYWZ0IG1vZGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIG1ldGFtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyXG5cdCAqL1xuXHRfY3JlYXRlRmlsdGVyRnJvbUtleXM6IGZ1bmN0aW9uIChhS2V5czogVmFsdWVkS2V5W10sIGJEcmFmdE1vZGU6IEJvb2xlYW4sIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogRmlsdGVyIHtcblx0XHRjb25zdCBiRmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShvTWV0YU1vZGVsKTtcblxuXHRcdGxldCBiRmlsdGVyT25BY3RpdmVFbnRpdHkgPSBmYWxzZTtcblx0XHRjb25zdCBhRmlsdGVycyA9IGFLZXlzLm1hcCgoa2V5KSA9PiB7XG5cdFx0XHRpZiAoa2V5Lm5hbWUgPT09IFwiSXNBY3RpdmVFbnRpdHlcIikge1xuXHRcdFx0XHRiRmlsdGVyT25BY3RpdmVFbnRpdHkgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRwYXRoOiBrZXkubmFtZSxcblx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHR2YWx1ZTE6IGtleS52YWx1ZSxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlckNhc2VTZW5zaXRpdmVcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdGlmIChiRHJhZnRNb2RlICYmICFiRmlsdGVyT25BY3RpdmVFbnRpdHkpIHtcblx0XHRcdGNvbnN0IG9EcmFmdEZpbHRlciA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0XHRhRmlsdGVycy5wdXNoKG9EcmFmdEZpbHRlcik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoYUZpbHRlcnMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNYWtlcyBzdXJlIGtleSB2YWx1ZXMgaGF2ZSB0aGUgY29ycmVjdCBmb3JtYXQuXG5cdCAqIFRoaXMgaXMgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZXMsIGZvciBleGFtcGxlLCB3aGVyZSBCb29sZWFuIHZhbHVlcyBhcmUgJ1gnIG9yICcnLCBvciBndWlkIHZhbHVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBndWlkJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcuXCIuXG5cdCAqIEBwYXJhbSBrZXlzXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlXG5cdCAqL1xuXHRfc2FuaXRpemVLZXlzOiBmdW5jdGlvbiAoa2V5czogVmFsdWVkS2V5W10sIGVudGl0eVR5cGU6IFJlY29yZDxzdHJpbmcsIHsgJFR5cGU6IHN0cmluZyB9Pik6IHZvaWQge1xuXHRcdGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSBlbnRpdHlUeXBlW2tleS5uYW1lXS4kVHlwZTtcblx0XHRcdHN3aXRjaCAocHJvcGVydHlUeXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0XHRcdGlmIChrZXkudmFsdWUgIT09IFwidHJ1ZVwiICYmIGtleS52YWx1ZSAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGUgdmFsdWUgaXMgbmVpdGhlciBcInRydWVcIiBub3IgXCJmYWxzZVwiLCBpdCdzIGNvbnNpZGVyZWQgYXMgZmFsc2UgaWYgaXQgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcyAoZS5nLiB0byBoYW5kbGUgJ1gnLycnIGZvciB0cnVlL2ZhbHNlIHZhbHVlcylcblx0XHRcdFx0XHRcdGtleS52YWx1ZSA9IGtleS52YWx1ZS50cmltKCkubGVuZ3RoID8gXCJ0cnVlXCIgOiBcImZhbHNlXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJFZG0uR3VpZFwiOiB7XG5cdFx0XHRcdFx0Y29uc3QgbWF0Y2ggPSAvWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9Ly5leGVjKGtleS52YWx1ZSk7XG5cdFx0XHRcdFx0a2V5LnZhbHVlID0gbWF0Y2ggPyBtYXRjaFswXSA6IGtleS52YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogTG9hZHMgYWxsIGNvbnRleHRzIGZvciBhIGxpc3Qgb2YgcGFnZSBpbmZvcy5cblx0ICogQHBhcmFtIGFTdGFydHVwUGFnZXMgVGhlIGxpc3Qgb2YgcGFnZSBpbmZvc1xuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIGxvYWQgdGhlIGNvbnRleHRzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYWxsIGNvbnRleHRzXG5cdCAqL1xuXHRfcmVxdWVzdE9iamVjdHNGcm9tUGFyYW1ldGVyczogYXN5bmMgZnVuY3Rpb24gKGFTdGFydHVwUGFnZXM6IFBhZ2VJbmZvW10sIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8Q29udGV4dFtdW10+IHtcblx0XHQvLyBMb2FkIHRoZSByZXNwZWN0aXZlIG9iamVjdHMgZm9yIGFsbCBvYmplY3QgcGFnZXMgZm91bmQgaW4gYUV4dGVybmFsbHlOYXZpZ2FibGVQYWdlc1xuXHRcdGNvbnN0IGFDb250ZXh0UHJvbWlzZXMgPSBhU3RhcnR1cFBhZ2VzLm1hcChhc3luYyAocGFnZUluZm8pID0+IHtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KGAke3BhZ2VJbmZvLmNvbnRleHRQYXRofS9gKTtcblx0XHRcdGlmIChwYWdlSW5mby50ZWNobmljYWxLZXlzKSB7XG5cdFx0XHRcdHRoaXMuX3Nhbml0aXplS2V5cyhwYWdlSW5mby50ZWNobmljYWxLZXlzLCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgcGF0aFxuXHRcdFx0XHRjb25zdCBwYXRoID0gYCR7cGFnZUluZm8uY29udGV4dFBhdGh9KCR7U2VtYW50aWNLZXlIZWxwZXIuZ2V0UGF0aENvbnRlbnQocGFnZUluZm8udGVjaG5pY2FsS2V5cywgZW50aXR5VHlwZSl9KWA7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQocGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW2NvbnRleHRdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFLZXlzID0gcGFnZUluZm8uc2VtYW50aWNLZXlzID8/IFtdO1xuXHRcdFx0XHR0aGlzLl9zYW5pdGl6ZUtleXMoYUtleXMsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRjb25zdCBvRmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbUtleXMoYUtleXMsIHBhZ2VJbmZvLmRyYWZ0TW9kZSwgb01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblxuXHRcdFx0XHQvLyBvbmx5IHJlcXVlc3QgYSBtaW5pbXVtIG9mIGZpZWxkcyB0byBib29zdCBiYWNrZW5kIHBlcmZvcm1hbmNlIHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBleGlzdHNcblx0XHRcdFx0Y29uc3Qgb0xpc3RCaW5kID0gb01vZGVsLmJpbmRMaXN0KHBhZ2VJbmZvLmNvbnRleHRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XHRcdCRzZWxlY3Q6IGFLZXlzXG5cdFx0XHRcdFx0XHQubWFwKChrZXkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGtleS5uYW1lO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5qb2luKFwiLFwiKVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG9MaXN0QmluZC5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYUNvbnRleHRQcm9taXNlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJpZ2h0bW9zdCB0YXJnZXQgbmFtZSBmb3IgYSBnaXZlbiByb3V0ZS5cblx0ICogQHBhcmFtIHJvdXRlXG5cdCAqIEBwYXJhbSBtYW5pZmVzdFJvdXRpbmdcblx0ICogQHJldHVybnMgVGhlIHRhcmdldCBuYW1lIChvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgdGFyZ2V0IHdhcyBmb3VuZClcblx0ICovXG5cdF9nZXRSaWdodE1vc3RUYXJnZXROYW1lKHJvdXRlOiBSb3V0aW5nUm91dGUsIG1hbmlmZXN0Um91dGluZzogUm91dGluZ0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHJvdXRlLnRhcmdldCkpIHtcblx0XHRcdC8vIEdldCB0aGUgcmlnaHRtb3N0IHRhcmdldCBmb3IgdGhpcyByb3V0ZSAoaWdub3JlIHRhcmdldHMgY29ycmVzcG9uZGluZyB0byByZXVzZSBjb21wb25lbnRzKVxuXHRcdFx0Y29uc3QgcmV2ZXJzZVRhcmdldHMgPSBbLi4ucm91dGUudGFyZ2V0XS5yZXZlcnNlKCk7XG5cdFx0XHRyZXR1cm4gcmV2ZXJzZVRhcmdldHMuZmluZCgodGFyZ2V0SUQpID0+IHtcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhcmdldCA9IG1hbmlmZXN0Um91dGluZz8udGFyZ2V0cz8uW3RhcmdldElEXTtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRjdXJyZW50VGFyZ2V0Py5uYW1lICYmXG5cdFx0XHRcdFx0W1wic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0XCIsIFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlXCIsIFwic2FwLmZlLmNvcmUuZnBtXCJdLmluY2x1ZGVzKGN1cnJlbnRUYXJnZXQubmFtZSlcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcm91dGUudGFyZ2V0O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIFBhZ2VJbmZvIGZyb20gYSByb3V0ZSBpZiBpdCdzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBvUm91dGUgVGhlIHJvdXRlXG5cdCAqIEBwYXJhbSBvTWFuaWZlc3RSb3V0aW5nIFRoZSBhcHAgbWFuaWZlc3Qgcm91dGluZyBzZWN0aW9uXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgYXBwIG1ldGFtb2RlbFxuXHQgKiBAcmV0dXJucyBBIHBhZ2UgaW5mbyBpZiB0aGUgcGFnZSBpcyByZWFjaGFibGUsIHVuZGVmaW5lZCBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRSZWFjaGFibGVQYWdlSW5mb0Zyb21Sb3V0ZTogZnVuY3Rpb24gKFxuXHRcdG9Sb3V0ZTogUm91dGluZ1JvdXRlLFxuXHRcdG9NYW5pZmVzdFJvdXRpbmc6IFJvdXRpbmdDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczogU3RhcnR1cFBhcmFtZXRlcnMgfCBudWxsLFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdCk6IFBhZ2VJbmZvIHwgdW5kZWZpbmVkIHtcblx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgJzo/cXVlcnk6JyBhbmQgJy8nXG5cdFx0bGV0IHNQYXR0ZXJuOiBzdHJpbmcgPSBvUm91dGUucGF0dGVybiEucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdHNQYXR0ZXJuID0gc1BhdHRlcm4ucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG5cdFx0aWYgKCFzUGF0dGVybiB8fCAhc1BhdHRlcm4uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBJZ25vcmUgbGV2ZWwtMCByb3V0ZXMgKExpc3RSZXBvcnQpIG9yIHJvdXRlcyBjb3JyZXNwb25kaW5nIHRvIGEgMS0xIHJlbGF0aW9uIChubyBrZXlzIGluIHRoZSBVUkwgaW4gdGhpcyBjYXNlKVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UoL1xcKFxce1tefV0qXFx9XFwpL2csIFwiKCMpXCIpOyAvLyBSZXBsYWNlIGtleXMgd2l0aCAjXG5cblx0XHRjb25zdCBzVGFyZ2V0TmFtZSA9IHRoaXMuX2dldFJpZ2h0TW9zdFRhcmdldE5hbWUob1JvdXRlLCBvTWFuaWZlc3RSb3V0aW5nKTtcblx0XHRpZiAoIXNUYXJnZXROYW1lKSB7XG5cdFx0XHQvLyBObyB0YXJnZXQgZm91bmQgZm9yIHRoaXMgcm91dGVcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1RhcmdldCA9IG9NYW5pZmVzdFJvdXRpbmc/LnRhcmdldHM/LltzVGFyZ2V0TmFtZV07XG5cblx0XHRjb25zdCBhUGF0dGVyblNlZ21lbnRzID0gc1BhdHRlcm4uc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IHBhZ2VMZXZlbCA9IGFQYXR0ZXJuU2VnbWVudHMubGVuZ3RoIC0gMTtcblxuXHRcdGlmIChwYWdlTGV2ZWwgIT09IDAgJiYgb1RhcmdldD8ub3B0aW9ucz8uc2V0dGluZ3M/LmFsbG93RGVlcExpbmtpbmcgIT09IHRydWUpIHtcblx0XHRcdC8vIFRoZSBmaXJzdCBsZXZlbCBvZiBvYmplY3QgcGFnZSBhbGxvd3MgZGVlcCBsaW5raW5nIGJ5IGRlZmF1bHQuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHRoZSB0YXJnZXQgbXVzdCBhbGxvdyBkZWVwIGxpbmtpbmcgZXhwbGljaXRlbHkgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGxldCBzQ29udGV4dFBhdGggPSBcIlwiO1xuXHRcdGlmIChvVGFyZ2V0Py5vcHRpb25zPy5zZXR0aW5ncz8uZW50aXR5U2V0KSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBgLyR7b1RhcmdldC5vcHRpb25zLnNldHRpbmdzLmVudGl0eVNldH1gO1xuXHRcdH0gZWxzZSBpZiAob1RhcmdldD8ub3B0aW9ucz8uc2V0dGluZ3M/LmNvbnRleHRQYXRoKSB7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQob1RhcmdldC5vcHRpb25zLnNldHRpbmdzLmNvbnRleHRQYXRoKSE7XG5cdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0XHRcdGlmIChvYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0XHRzQ29udGV4dFBhdGggPSBgLyR7b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZX1gO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBvRW50aXR5VHlwZSA9IHNDb250ZXh0UGF0aCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChgLyRFbnRpdHlDb250YWluZXIke3NDb250ZXh0UGF0aH0vYCk7XG5cblx0XHRpZiAoIW9FbnRpdHlUeXBlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0aGUgc2VtYW50aWMga2V5IHZhbHVlcyBmb3IgdGhlIGVudGl0eVxuXHRcdGxldCBzZW1hbnRpY0tleU5hbWVzID0gKFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYC8kRW50aXR5Q29udGFpbmVyJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlgKSBhc1xuXHRcdFx0XHR8IEV4cGFuZFBhdGhUeXBlPFByb3BlcnR5UGF0aD5bXVxuXHRcdFx0XHR8IHVuZGVmaW5lZFxuXHRcdCk/Lm1hcCgoc2VtS2V5KSA9PiB7XG5cdFx0XHRyZXR1cm4gc2VtS2V5LiRQcm9wZXJ0eVBhdGg7XG5cdFx0fSk7XG5cblx0XHQvLyBJZiB3ZSdyZSBvbiBhIGZpcnN0IGxldmVsIG9iamVjdCBwYWdlIGFuZCB0aGUgc2VtYW50aWMga2V5cyBhcmUgdGhlIHNhbWUgYXMgdGhlIHRlY2huaWNhbCBrZXlzLCB3ZSB1c2UgdGVjaG5pY2FsIGtleXMgZGlyZWN0bHksXG5cdFx0Ly8gdG8gYXZvaWQgdGhlIGFkZGl0aW9uYWwgcXVlcnkgdXNlZCB0byBsb2FkIHRoZSBvYmplY3QgZnJvbSBpdHMgc2VtYW50aWMga2V5cyBpbiBfcmVxdWVzdE9iamVjdHNGcm9tUGFyYW1ldGVyc1xuXHRcdGNvbnN0IHRlY2huaWNhbEtleU5hbWVzID0gb0VudGl0eVR5cGVbXCIkS2V5XCJdO1xuXHRcdGlmIChcblx0XHRcdHBhZ2VMZXZlbCA9PT0gMCAmJlxuXHRcdFx0c2VtYW50aWNLZXlOYW1lcyAmJlxuXHRcdFx0c2VtYW50aWNLZXlOYW1lcy5sZW5ndGggPT09IHRlY2huaWNhbEtleU5hbWVzLmxlbmd0aCAmJlxuXHRcdFx0c2VtYW50aWNLZXlOYW1lcy5ldmVyeSgoa2V5KSA9PiB0ZWNobmljYWxLZXlOYW1lcy5pbmNsdWRlcyhrZXkpKVxuXHRcdCkge1xuXHRcdFx0c2VtYW50aWNLZXlOYW1lcyA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBhU2VtYW50aWNrS2V5cyA9IHNlbWFudGljS2V5TmFtZXMgPyB0aGlzLl9nZXRLZXlzRnJvbVN0YXJ0dXBQYXJhbXMoc2VtYW50aWNLZXlOYW1lcywgb1N0YXJ0dXBQYXJhbWV0ZXJzKSA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIEdldCB0aGUgdGVjaG5pY2FsIGtleXMgb25seSBpZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBzZW1hbnRpYyBrZXkgdmFsdWVzLCBhbmQgb24gZmlyc3QgbGV2ZWwgT1Bcblx0XHRjb25zdCBhVGVjaG5pY2FsS2V5cyA9XG5cdFx0XHQhYVNlbWFudGlja0tleXMgJiYgcGFnZUxldmVsID09PSAwID8gdGhpcy5fZ2V0S2V5c0Zyb21TdGFydHVwUGFyYW1zKHRlY2huaWNhbEtleU5hbWVzLCBvU3RhcnR1cFBhcmFtZXRlcnMpIDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGFTZW1hbnRpY2tLZXlzID09PSB1bmRlZmluZWQgJiYgYVRlY2huaWNhbEtleXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gV2UgY291bGRuJ3QgZmluZCB0aGUgc2VtYW50aWMvdGVjaG5pY2FsIGtleXMgaW4gdGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzIGNvbnRhaW4gdmFsdWVzIGZvciBhbGwgc2VtYW50aWMga2V5cyAob3IgdGVjaG5pY2FsIGtleXMpIC0tPiB3ZSBjYW4gc3RvcmUgdGhlIHBhZ2UgaW5mbyBpbiB0aGUgY29ycmVzcG9uZGluZyBsZXZlbFxuXHRcdGNvbnN0IGRyYWZ0TW9kZSA9XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyRFbnRpdHlDb250YWluZXIke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApIHx8XG5cdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyRFbnRpdHlDb250YWluZXIke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdHRlcm46IHNQYXR0ZXJuLFxuXHRcdFx0Y29udGV4dFBhdGg6IHNDb250ZXh0UGF0aCxcblx0XHRcdGRyYWZ0TW9kZSxcblx0XHRcdHRlY2huaWNhbEtleXM6IGFUZWNobmljYWxLZXlzLFxuXHRcdFx0c2VtYW50aWNLZXlzOiBhU2VtYW50aWNrS2V5cyxcblx0XHRcdHRhcmdldDogc1RhcmdldE5hbWUsXG5cdFx0XHRwYWdlTGV2ZWxcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYWdlcyB0aGF0IGFsbG93IGRlZXBsaW5rIGFuZCB0aGF0IGNhbiBiZSByZWFjaGVkIHVzaW5nIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBvTWFuaWZlc3RSb3V0aW5nIFRoZSByb3V0aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGFwcCBtYW5pZmVzdFxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIG1ldGFtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgcmVhY2hhYmxlIHBhZ2VzXG5cdCAqL1xuXHRfZ2V0UmVhY2hhYmxlUGFnZXM6IGZ1bmN0aW9uIChcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBSb3V0aW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbFxuXHQpOiBQYWdlSW5mb1tdW10ge1xuXHRcdGNvbnN0IGFSb3V0ZXM6IFJvdXRpbmdSb3V0ZVtdID0gb01hbmlmZXN0Um91dGluZz8ucm91dGVzID8/IFtdO1xuXHRcdGNvbnN0IG1QYWdlc0J5TGV2ZWw6IFJlY29yZDxudW1iZXIsIFBhZ2VJbmZvW10+ID0ge307XG5cblx0XHRhUm91dGVzLmZvckVhY2goKG9Sb3V0ZSkgPT4ge1xuXHRcdFx0Y29uc3Qgb1BhZ2VJbmZvID0gdGhpcy5fZ2V0UmVhY2hhYmxlUGFnZUluZm9Gcm9tUm91dGUob1JvdXRlLCBvTWFuaWZlc3RSb3V0aW5nLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG9NZXRhTW9kZWwpO1xuXG5cdFx0XHRpZiAob1BhZ2VJbmZvKSB7XG5cdFx0XHRcdGlmICghbVBhZ2VzQnlMZXZlbFtvUGFnZUluZm8ucGFnZUxldmVsXSkge1xuXHRcdFx0XHRcdG1QYWdlc0J5TGV2ZWxbb1BhZ2VJbmZvLnBhZ2VMZXZlbF0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtUGFnZXNCeUxldmVsW29QYWdlSW5mby5wYWdlTGV2ZWxdLnB1c2gob1BhZ2VJbmZvKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEEgcGFnZSBpcyByZWFjaGFibGUgb25seSBpZiBhbGwgaXRzIHBhcmVudHMgYXJlIGFsc28gcmVhY2hhYmxlXG5cdFx0Ly8gU28gaWYgd2UgY291bGRuJ3QgZmluZCBhbnkgcGFnZXMgZm9yIGEgZ2l2ZW4gbGV2ZWwsIGFsbCBwYWdlcyB3aXRoIGEgaGlnaGVyIGxldmVsIHdvbid0IGJlIHJlYWNoYWJsZSBhbnl3YXlcblx0XHRjb25zdCBhUmVhY2hhYmxlUGFnZXM6IFBhZ2VJbmZvW11bXSA9IFtdO1xuXHRcdGxldCBsZXZlbCA9IDA7XG5cdFx0d2hpbGUgKG1QYWdlc0J5TGV2ZWxbbGV2ZWxdKSB7XG5cdFx0XHRhUmVhY2hhYmxlUGFnZXMucHVzaChtUGFnZXNCeUxldmVsW2xldmVsXSk7XG5cdFx0XHRsZXZlbCsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBhUmVhY2hhYmxlUGFnZXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbGlzdCBvZiBzdGFydHVwIHBhZ2VzLlxuXHQgKiBAcGFyYW0gb01hbmlmZXN0Um91dGluZyBUaGUgcm91dGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcHAgbWFuaWZlc3Rcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RhcnR1cCBwYWdlIGluZm9zXG5cdCAqL1xuXHRfZ2V0U3RhcnR1cFBhZ2VzRnJvbVN0YXJ0dXBQYXJhbXM6IGZ1bmN0aW9uIChcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBSb3V0aW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbFxuXHQpOiBQYWdlSW5mb1tdIHtcblx0XHQvLyBGaW5kIGFsbCBwYWdlcyB0aGF0IGNhbiBiZSByZWFjaGVkIHdpdGggdGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHRcdGNvbnN0IGFSZWFjaGFibGVQYWdlcyA9IHRoaXMuX2dldFJlYWNoYWJsZVBhZ2VzKG9NYW5pZmVzdFJvdXRpbmcsIG9TdGFydHVwUGFyYW1ldGVycywgb01ldGFNb2RlbCk7XG5cblx0XHRpZiAoYVJlYWNoYWJsZVBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdC8vIEZpbmQgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgcGFnZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCAocmVjdXJzaXZlbHkpXG5cdFx0bGV0IHJlc3VsdDogUGFnZUluZm9bXSA9IFtdO1xuXHRcdGNvbnN0IGN1cnJlbnQ6IFBhZ2VJbmZvW10gPSBbXTtcblxuXHRcdGZ1bmN0aW9uIGZpbmRSZWN1cnNpdmUobGV2ZWw6IG51bWJlcik6IHZvaWQge1xuXHRcdFx0Y29uc3QgYUN1cnJlbnRMZXZlbFBhZ2VzID0gYVJlYWNoYWJsZVBhZ2VzW2xldmVsXTtcblx0XHRcdGNvbnN0IGxhc3RQYWdlID0gY3VycmVudC5sZW5ndGggPyBjdXJyZW50W2N1cnJlbnQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChhQ3VycmVudExldmVsUGFnZXMpIHtcblx0XHRcdFx0YUN1cnJlbnRMZXZlbFBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG5leHRQYWdlKSB7XG5cdFx0XHRcdFx0aWYgKCFsYXN0UGFnZSB8fCBuZXh0UGFnZS5wYXR0ZXJuLmluZGV4T2YobGFzdFBhZ2UucGF0dGVybikgPT09IDApIHtcblx0XHRcdFx0XHRcdC8vIFdlIG9ubHkgY29uc2lkZXIgcGFnZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHRoZSBwYWdlIGF0IHRoZSBwcmV2aW91cyBsZXZlbCxcblx0XHRcdFx0XHRcdC8vIC0tPiB0aGVpciBwYXR0ZXJuIG11c3QgYmUgdGhlIHBhdHRlcm4gb2YgdGhlIHByZXZpb3VzIHBhZ2Ugd2l0aCBhbm90aGVyIHNlZ21lbnQgYXBwZW5kZWRcblx0XHRcdFx0XHRcdGN1cnJlbnQucHVzaChuZXh0UGFnZSk7XG5cdFx0XHRcdFx0XHRmaW5kUmVjdXJzaXZlKGxldmVsICsgMSk7XG5cdFx0XHRcdFx0XHRjdXJyZW50LnBvcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY3VycmVudC5sZW5ndGggPiByZXN1bHQubGVuZ3RoKSB7XG5cdFx0XHRcdHJlc3VsdCA9IGN1cnJlbnQuc2xpY2UoKTsgLy8gV2UgaGF2ZSBmb3VuZCBhIHNlcXVlbmNlIGxvbmdlciB0aGFuIG91ciBwcmV2aW91cyBiZXN0IC0tPiBzdG9yZSBpdCBhcyB0aGUgbmV3IGxvbmdlc3Rcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmaW5kUmVjdXJzaXZlKDApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgc3RhcnR1cCBvYmplY3QgZnJvbSB0aGUgbGlzdCBvZiBwYWdlcyBhbmQgY29udGV4dHMuXG5cdCAqIEBwYXJhbSBhU3RhcnR1cFBhZ2VzIFRoZSBwYWdlc1xuXHQgKiBAcGFyYW0gYUNvbnRleHRzIFRoZSBjb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyBlaXRoZXIgYSBoYXNoIG9yIGEgY29udGV4dCB0byBuYXZpZ2F0ZSB0bywgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vIGRlZXAgbGluayB3YXMgZm91bmRcblx0ICovXG5cdF9nZXREZWVwTGlua09iamVjdDogZnVuY3Rpb24gKGFTdGFydHVwUGFnZXM6IFBhZ2VJbmZvW10sIGFDb250ZXh0czogQ29udGV4dFtdKTogeyBoYXNoPzogc3RyaW5nOyBjb250ZXh0PzogQ29udGV4dCB9IHtcblx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIHsgY29udGV4dDogYUNvbnRleHRzWzBdIH07XG5cdFx0fSBlbHNlIGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gTmF2aWdhdGlvbiB0byBhIGRlZXBlciBsZXZlbCAtLT4gdXNlIHRoZSBwYXR0ZXJuIG9mIHRoZSBkZWVwZXN0IG9iamVjdCBwYWdlXG5cdFx0XHQvLyBhbmQgcmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGUgSUQgZnJvbSB0aGUgY29udGV4dHNcblx0XHRcdGxldCBoYXNoID0gYVN0YXJ0dXBQYWdlc1thU3RhcnR1cFBhZ2VzLmxlbmd0aCAtIDFdLnBhdHRlcm47XG5cdFx0XHRhQ29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAob0NvbnRleHQpIHtcblx0XHRcdFx0aGFzaCA9IGhhc2gucmVwbGFjZShcIigjKVwiLCBgKCR7b0NvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiKFwiKVsxXX1gKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4geyBoYXNoIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgc3RhcnR1cCBwYXJhbWV0ZXJzIGZvciBhIGRlZXBsaW5rIGNhc2UsIGZyb20gc3RhcnR1cCBwYXJhbWV0ZXJzIGFuZCByb3V0aW5nIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gb01hbmlmZXN0Um91dGluZyBUaGUgcm91dGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcHAgbWFuaWZlc3Rcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGVpdGhlciBhIGhhc2ggb3IgYSBjb250ZXh0IHRvIG5hdmlnYXRlIHRvLCBvciBhbiBlbXB0eSBvYmplY3QgaWYgbm8gZGVlcCBsaW5rIHdhcyBmb3VuZFxuXHQgKi9cblx0Z2V0RGVlcExpbmtTdGFydHVwSGFzaDogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdG9NYW5pZmVzdFJvdXRpbmc6IFJvdXRpbmdDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczogU3RhcnR1cFBhcmFtZXRlcnMgfCBudWxsLFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbFxuXHQpOiBQcm9taXNlPHsgaGFzaD86IHN0cmluZzsgY29udGV4dD86IENvbnRleHQgfT4ge1xuXHRcdGF3YWl0IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKS5yZXF1ZXN0T2JqZWN0KFwiLyRFbnRpdHlDb250YWluZXIvXCIpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgc2VtYW50aWMga2V5cyBhcmUgcHJlc2VudCBpbiB1cmwgcGFyYW1ldGVycyBmb3IgZXZlcnkgb2JqZWN0IHBhZ2UgYXQgZWFjaCBsZXZlbFxuXHRcdGNvbnN0IHN0YXJ0dXBQYWdlcyA9IHRoaXMuX2dldFN0YXJ0dXBQYWdlc0Zyb21TdGFydHVwUGFyYW1zKG9NYW5pZmVzdFJvdXRpbmcsIG9TdGFydHVwUGFyYW1ldGVycywgb01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblxuXHRcdC8vIExvYWQgdGhlIGNvbnRleHRzXG5cdFx0Y29uc3QgYWxsQ29udGV4dHMgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0T2JqZWN0c0Zyb21QYXJhbWV0ZXJzKHN0YXJ0dXBQYWdlcywgb01vZGVsKTtcblx0XHRpZiAoYWxsQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugb25seSBnZXQgMSBjb250ZXh0IHBlciBwcm9taXNlLCBhbmQgZmxhdHRlbiB0aGUgYXJyYXlcblx0XHRcdGNvbnN0IGNvbnRleHRzRm9yU3RhcnR1cDogQ29udGV4dFtdID0gW107XG5cdFx0XHRhbGxDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3VuZENvbnRleHRzKSB7XG5cdFx0XHRcdGlmIChmb3VuZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGNvbnRleHRzRm9yU3RhcnR1cC5wdXNoKGZvdW5kQ29udGV4dHNbMF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGNvbnRleHRzRm9yU3RhcnR1cC5sZW5ndGggPT09IGFsbENvbnRleHRzLmxlbmd0aCA/IHRoaXMuX2dldERlZXBMaW5rT2JqZWN0KHN0YXJ0dXBQYWdlcywgY29udGV4dHNGb3JTdGFydHVwKSA6IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBuZXcgaGFzaCBiYXNlZCBvbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlciB2YWx1ZXMgKG1hcCBwYXJhbWV0ZXIgbmFtZSAtPiBhcnJheSBvZiB2YWx1ZXMpXG5cdCAqIEBwYXJhbSBzQ29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCBmb3IgdGhlIHN0YXJ0dXAgb2YgdGhlIGFwcCAoZ2VuZXJhbGx5IHRoZSBwYXRoIHRvIHRoZSBtYWluIGVudGl0eSBzZXQpXG5cdCAqIEBwYXJhbSBvUm91dGVyIFRoZSByb3V0ZXIgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIG1ldGEgbW9kZWxcblx0ICogQHJldHVybnMgQSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGhhc2ggdG8gbmF2aWdhdGUgdG8sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSdzIG5vIG5lZWQgdG8gbmF2aWdhdGVcblx0ICovXG5cdGdldENyZWF0ZVN0YXJ0dXBIYXNoOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBTdGFydHVwUGFyYW1ldGVycyxcblx0XHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0XHRvUm91dGVyOiBSb3V0ZXIsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gb01ldGFNb2RlbC5yZXF1ZXN0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AYCkudGhlbigob0VudGl0eVNldEFubm90YXRpb25zOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uKSA9PiB7XG5cdFx0XHRsZXQgc01ldGFQYXRoID0gXCJcIjtcblx0XHRcdGxldCBiQ3JlYXRhYmxlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRvRW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdFx0XHRvRW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXVtcIk5ld0FjdGlvblwiXVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlYDtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIl0gJiZcblx0XHRcdFx0b0VudGl0eVNldEFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiXVtcIk5ld0FjdGlvblwiXVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbkBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVgO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc01ldGFQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IGJOZXdBY3Rpb25PcGVyYXRpb25BdmFpbGFibGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGgpO1xuXHRcdFx0XHRpZiAoYk5ld0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRiQ3JlYXRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9JbnNlcnRSZXN0cmljdGlvbnMgPSBvRW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5JbnNlcnRSZXN0cmljdGlvbnNcIl07XG5cdFx0XHRcdGlmIChvSW5zZXJ0UmVzdHJpY3Rpb25zICYmIG9JbnNlcnRSZXN0cmljdGlvbnMuSW5zZXJ0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHRiQ3JlYXRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChiQ3JlYXRhYmxlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldERlZmF1bHRDcmVhdGVIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgc0NvbnRleHRQYXRoLCBvUm91dGVyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBcIlwiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBoYXNoIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QuXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyIHZhbHVlcyAobWFwIHBhcmFtZXRlciBuYW1lIC0+IGFycmF5IG9mIHZhbHVlcylcblx0ICogQHBhcmFtIHNDb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBlbnRpdHkgc2V0IHRvIGJlIHVzZWQgZm9yIHRoZSBjcmVhdGlvblxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIFRoZSBoYXNoXG5cdCAqL1xuXHRnZXREZWZhdWx0Q3JlYXRlSGFzaDogZnVuY3Rpb24gKFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczogU3RhcnR1cFBhcmFtZXRlcnMgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNDb250ZXh0UGF0aDogc3RyaW5nLFxuXHRcdG9Sb3V0ZXI6IFJvdXRlclxuXHQpOiBzdHJpbmcge1xuXHRcdGxldCBzRGVmYXVsdENyZWF0ZUhhc2ggPSBvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgPyBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXSA6IFwiY3JlYXRlXCI7XG5cdFx0bGV0IHNIYXNoID0gXCJcIjtcblxuXHRcdHNEZWZhdWx0Q3JlYXRlSGFzaCA9XG5cdFx0XHRzRGVmYXVsdENyZWF0ZUhhc2guaW5jbHVkZXMoXCI6XCIpICYmIHNEZWZhdWx0Q3JlYXRlSGFzaC5sZW5ndGggPiBzRGVmYXVsdENyZWF0ZUhhc2guaW5kZXhPZihcIjpcIikgKyAxXG5cdFx0XHRcdD8gc0RlZmF1bHRDcmVhdGVIYXNoLnN1YnN0cmluZygwLCBzRGVmYXVsdENyZWF0ZUhhc2guaW5kZXhPZihcIjpcIikpXG5cdFx0XHRcdDogXCJjcmVhdGVcIjtcblx0XHRzSGFzaCA9IGAke3NDb250ZXh0UGF0aC5zdWJzdHJpbmcoMSl9KC4uLik/aS1hY3Rpb249JHtzRGVmYXVsdENyZWF0ZUhhc2h9YDtcblx0XHRpZiAob1JvdXRlci5nZXRSb3V0ZUluZm9CeUhhc2goc0hhc2gpKSB7XG5cdFx0XHRyZXR1cm4gc0hhc2g7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcm91dGUgbWF0Y2ggZm9yIGNyZWF0aW5nIGEgbmV3ICR7c0NvbnRleHRQYXRoLnN1YnN0cmluZygxKX1gKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFZlcmlmaWVzIHdoZXRoZXIgdGhlIGVudGl0eSBpbiB0aGUgZ2l2ZW4gY29udGV4dCBwYXRoIGlzIGVkaXRhYmxlIGJ5IGxvb2tpbmcgYXQgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9uczpcblx0ICpcblx0ICogLSBAQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgb2YgdGhlIGVkaXQgYWN0aW9uXG5cdCAqIC0gQFVJLlVwZGF0ZUhpZGRlblxuXHQgKlxuXHQgKiBPbmx5IHN0YXRpYyB2YWx1ZXMgKHRydWUvZmFsc2UpIGFyZSBjb25zaWRlcmVkIGhlcmUgYXMgd2UgZG9uJ3QgaGF2ZSB0aGUgYWN0dWFsIGJpbmRpbmcgY29udGV4dCB0byBldmFsdWF0ZSBkeW5hbWljIGJpbmRpbmdzLlxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGhcblx0ICogQHBhcmFtIG1ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgZWRpdGFibGUgb3Igbm90XG5cdCAqL1xuXHR2ZXJpZnlFZGl0QW5ub3RhdGlvbnM6IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgZW50aXR5U2V0QW5ub3RhdGlvbnM6IE1ldGFNb2RlbEVudGl0eVNldEFubm90YXRpb24gPSBhd2FpdCBtZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtjb250ZXh0UGF0aH1AYCk7XG5cdFx0Y29uc3QgdXBkYXRlSGlkZGVuID0gZW50aXR5U2V0QW5ub3RhdGlvbnM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5VcGRhdGVIaWRkZW5cIl07XG5cdFx0bGV0IG9wZXJhdGlvbkF2YWlsYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoZW50aXR5U2V0QW5ub3RhdGlvbnM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdPy5bXCJFZGl0QWN0aW9uXCJdKSB7XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtjb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uQE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWBcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gZmFsc2UgJiYgdXBkYXRlSGlkZGVuICE9PSB0cnVlO1xuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBcHBTdGFydHVwSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQTZCQSxNQUFNQSxnQkFBZ0IsR0FBRztJQUN4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MseUJBQXlCLEVBQUUsU0FBQUEsQ0FBVUMsU0FBbUIsRUFBRUMsa0JBQTRDLEVBQTJCO01BQ2hJLElBQUlDLFNBQVMsR0FBRyxJQUFJO01BQ3BCLE1BQU1DLEtBQUss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
|
|
477
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBcHBTdGFydHVwSGVscGVyIiwiX2dldEtleXNGcm9tU3RhcnR1cFBhcmFtcyIsImFLZXlOYW1lcyIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJBbGxGb3VuZCIsImFLZXlzIiwibWFwIiwibmFtZSIsImxlbmd0aCIsInZhbHVlIiwidW5kZWZpbmVkIiwiX2NyZWF0ZUZpbHRlckZyb21LZXlzIiwiYkRyYWZ0TW9kZSIsIm9NZXRhTW9kZWwiLCJiRmlsdGVyQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYkZpbHRlck9uQWN0aXZlRW50aXR5IiwiYUZpbHRlcnMiLCJrZXkiLCJGaWx0ZXIiLCJwYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm9EcmFmdEZpbHRlciIsImZpbHRlcnMiLCJhbmQiLCJwdXNoIiwiX3Nhbml0aXplS2V5cyIsImtleXMiLCJlbnRpdHlUeXBlIiwiZm9yRWFjaCIsInByb3BlcnR5VHlwZSIsIiRUeXBlIiwidHJpbSIsIm1hdGNoIiwiZXhlYyIsIl9nZXRDb250ZXh0c0Zyb21QYWdlcyIsInN0YXJ0dXBQYWdlcyIsIm1vZGVsIiwiUHJvbWlzZSIsImFsbCIsInBhZ2VJbmZvIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0T2JqZWN0IiwiY29udGV4dFBhdGgiLCJ0ZWNobmljYWxLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRQYXRoQ29udGVudCIsImNvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInJlc29sdmUiLCJzZW1hbnRpY0tleXMiLCJmaWx0ZXIiLCJkcmFmdE1vZGUiLCJzZWxlY3RlZEZpZWxkcyIsImluY2x1ZGVzIiwib0xpc3RCaW5kIiwiYmluZExpc3QiLCIkc2VsZWN0Iiwiam9pbiIsInJlcXVlc3RDb250ZXh0cyIsIl9yZXF1ZXN0T2JqZWN0c0Zyb21QYXJhbWV0ZXJzIiwiYVN0YXJ0dXBQYWdlcyIsIm9Nb2RlbCIsImlzQWN0aXZlS2V5IiwiZmluZCIsInNvbWUiLCJjb250ZXh0cyIsImN0eCIsImNvbnRhaW5zQWN0aXZlIiwiY29udGFpbnNEcmFmdCIsIl9nZXRSaWdodE1vc3RUYXJnZXROYW1lIiwicm91dGUiLCJtYW5pZmVzdFJvdXRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXQiLCJyZXZlcnNlVGFyZ2V0cyIsInJldmVyc2UiLCJ0YXJnZXRJRCIsImN1cnJlbnRUYXJnZXQiLCJ0YXJnZXRzIiwiX2dldFJlYWNoYWJsZVBhZ2VJbmZvRnJvbVJvdXRlIiwib1JvdXRlIiwib01hbmlmZXN0Um91dGluZyIsInNQYXR0ZXJuIiwicGF0dGVybiIsInJlcGxhY2UiLCJlbmRzV2l0aCIsInNUYXJnZXROYW1lIiwib1RhcmdldCIsImFQYXR0ZXJuU2VnbWVudHMiLCJzcGxpdCIsInBhZ2VMZXZlbCIsIm9wdGlvbnMiLCJzZXR0aW5ncyIsImFsbG93RGVlcExpbmtpbmciLCJzQ29udGV4dFBhdGgiLCJlbnRpdHlTZXQiLCJtZXRhQ29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInRhcmdldEVudGl0eVNldCIsIm9FbnRpdHlUeXBlIiwic2VtYW50aWNLZXlOYW1lcyIsInNlbUtleSIsIiRQcm9wZXJ0eVBhdGgiLCJ0ZWNobmljYWxLZXlOYW1lcyIsImV2ZXJ5IiwiYVNlbWFudGlja0tleXMiLCJhVGVjaG5pY2FsS2V5cyIsIl9nZXRSZWFjaGFibGVQYWdlcyIsImFSb3V0ZXMiLCJyb3V0ZXMiLCJtUGFnZXNCeUxldmVsIiwib1BhZ2VJbmZvIiwiYVJlYWNoYWJsZVBhZ2VzIiwibGV2ZWwiLCJfZ2V0U3RhcnR1cFBhZ2VzRnJvbVN0YXJ0dXBQYXJhbXMiLCJyZXN1bHQiLCJjdXJyZW50IiwiZmluZFJlY3Vyc2l2ZSIsImFDdXJyZW50TGV2ZWxQYWdlcyIsImxhc3RQYWdlIiwibmV4dFBhZ2UiLCJpbmRleE9mIiwicG9wIiwic2xpY2UiLCJfZ2V0RGVlcExpbmtPYmplY3QiLCJhQ29udGV4dHMiLCJoYXNoIiwib0NvbnRleHQiLCJnZXRQYXRoIiwiZ2V0RGVlcExpbmtTdGFydHVwSGFzaCIsInJlcXVlc3RPYmplY3QiLCJhbGxDb250ZXh0cyIsImNvbnRleHRzRm9yU3RhcnR1cCIsImZvdW5kQ29udGV4dHMiLCJnZXRDcmVhdGVTdGFydHVwSGFzaCIsIm9Sb3V0ZXIiLCJ0aGVuIiwib0VudGl0eVNldEFubm90YXRpb25zIiwic01ldGFQYXRoIiwiYkNyZWF0YWJsZSIsImJOZXdBY3Rpb25PcGVyYXRpb25BdmFpbGFibGUiLCJvSW5zZXJ0UmVzdHJpY3Rpb25zIiwiSW5zZXJ0YWJsZSIsImdldERlZmF1bHRDcmVhdGVIYXNoIiwic0RlZmF1bHRDcmVhdGVIYXNoIiwicHJlZmVycmVkTW9kZSIsInNIYXNoIiwic3Vic3RyaW5nIiwiZ2V0Um91dGVJbmZvQnlIYXNoIiwiRXJyb3IiLCJ2ZXJpZnlFZGl0QW5ub3RhdGlvbnMiLCJtZXRhTW9kZWwiLCJlbnRpdHlTZXRBbm5vdGF0aW9ucyIsInVwZGF0ZUhpZGRlbiIsIm9wZXJhdGlvbkF2YWlsYWJsZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQXBwU3RhcnR1cEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTdGFydHVwUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ0NvbmZpZ3VyYXRpb24sIFJvdXRpbmdSb3V0ZSB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBFeHBhbmRQYXRoVHlwZSwgTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbiB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcIi4vU2VtYW50aWNLZXlIZWxwZXJcIjtcblxudHlwZSBWYWx1ZWRLZXkgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0dmFsdWU6IHN0cmluZztcbn07XG5cbnR5cGUgUGFnZUluZm8gPSB7XG5cdHBhdHRlcm46IHN0cmluZztcblx0Y29udGV4dFBhdGg6IHN0cmluZztcblx0ZHJhZnRNb2RlOiBib29sZWFuO1xuXHR0ZWNobmljYWxLZXlzOiBWYWx1ZWRLZXlbXSB8IHVuZGVmaW5lZDtcblx0c2VtYW50aWNLZXlzOiBWYWx1ZWRLZXlbXSB8IHVuZGVmaW5lZDtcblx0dGFyZ2V0OiBzdHJpbmc7XG5cdHBhZ2VMZXZlbDogbnVtYmVyO1xufTtcblxuY29uc3QgQXBwU3RhcnR1cEhlbHBlciA9IHtcblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhIHNldCBvZiBrZXkgdmFsdWVzIGZyb20gc3RhcnR1cCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gYUtleU5hbWVzIFRoZSBhcnJheSBvZiBrZXkgbmFtZXNcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHBhaXJzIFxce25hbWUsIHZhbHVlXFx9IGlmIGFsbCBrZXkgdmFsdWVzIGNvdWxkIGJlIGZvdW5kIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIHVuZGVmaW5lZCBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRLZXlzRnJvbVN0YXJ0dXBQYXJhbXM6IGZ1bmN0aW9uIChhS2V5TmFtZXM6IHN0cmluZ1tdLCBvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCk6IFZhbHVlZEtleVtdIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgYkFsbEZvdW5kID0gdHJ1ZTtcblx0XHRjb25zdCBhS2V5cyA9IGFLZXlOYW1lcy5tYXAoKG5hbWUpID0+IHtcblx0XHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnM/LltuYW1lXSAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbbmFtZV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiB7IG5hbWUsIHZhbHVlOiBvU3RhcnR1cFBhcmFtZXRlcnNbbmFtZV1bMF0gYXMgc3RyaW5nIH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBIHVuaXF1ZSBrZXkgdmFsdWUgY291bGRuJ3QgYmUgZm91bmQgaW4gdGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHRcdFx0XHRiQWxsRm91bmQgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIHsgbmFtZSwgdmFsdWU6IFwiXCIgfTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBiQWxsRm91bmQgPyBhS2V5cyA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGZpbHRlciBmcm9tIGEgbGlzdCBvZiBrZXkgdmFsdWVzLlxuXHQgKiBAcGFyYW0gYUtleXMgQXJyYXkgb2Ygc2VtYW50aWMga2V5cyBvciB0ZWNobmljYWwga2V5cyAod2l0aCB2YWx1ZXMpXG5cdCAqIEBwYXJhbSBiRHJhZnRNb2RlIFRydWUgaWYgdGhlIGVudGl0eSBzdXBwb3J0cyBkcmFmdCBtb2RlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGZpbHRlclxuXHQgKi9cblx0X2NyZWF0ZUZpbHRlckZyb21LZXlzOiBmdW5jdGlvbiAoYUtleXM6IFZhbHVlZEtleVtdLCBiRHJhZnRNb2RlOiBCb29sZWFuLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IEZpbHRlciB7XG5cdFx0Y29uc3QgYkZpbHRlckNhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRsZXQgYkZpbHRlck9uQWN0aXZlRW50aXR5ID0gZmFsc2U7XG5cdFx0Y29uc3QgYUZpbHRlcnMgPSBhS2V5cy5tYXAoKGtleSkgPT4ge1xuXHRcdFx0aWYgKGtleS5uYW1lID09PSBcIklzQWN0aXZlRW50aXR5XCIpIHtcblx0XHRcdFx0YkZpbHRlck9uQWN0aXZlRW50aXR5ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDoga2V5Lm5hbWUsXG5cdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0dmFsdWUxOiBrZXkudmFsdWUsXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGJGaWx0ZXJDYXNlU2Vuc2l0aXZlXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0XHRpZiAoYkRyYWZ0TW9kZSAmJiAhYkZpbHRlck9uQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRjb25zdCBvRHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdFx0ZmlsdGVyczogW25ldyBGaWx0ZXIoXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIGZhbHNlKSwgbmV3IEZpbHRlcihcIlNpYmxpbmdFbnRpdHkvSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBudWxsKV0sXG5cdFx0XHRcdGFuZDogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdFx0YUZpbHRlcnMucHVzaChvRHJhZnRGaWx0ZXIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgRmlsdGVyKGFGaWx0ZXJzLCB0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogTWFrZXMgc3VyZSBrZXkgdmFsdWVzIGhhdmUgdGhlIGNvcnJlY3QgZm9ybWF0LlxuXHQgKiBUaGlzIGlzIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzLCBmb3IgZXhhbXBsZSwgd2hlcmUgQm9vbGVhbiB2YWx1ZXMgYXJlICdYJyBvciAnJywgb3IgZ3VpZCB2YWx1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDogZ3VpZCcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnLlwiLlxuXHQgKiBAcGFyYW0ga2V5c1xuXHQgKiBAcGFyYW0gZW50aXR5VHlwZVxuXHQgKi9cblx0X3Nhbml0aXplS2V5czogZnVuY3Rpb24gKGtleXM6IFZhbHVlZEtleVtdLCBlbnRpdHlUeXBlOiBSZWNvcmQ8c3RyaW5nLCB7ICRUeXBlOiBzdHJpbmcgfT4pOiB2b2lkIHtcblx0XHRrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gZW50aXR5VHlwZVtrZXkubmFtZV0uJFR5cGU7XG5cdFx0XHRzd2l0Y2ggKHByb3BlcnR5VHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0XHRpZiAoa2V5LnZhbHVlICE9PSBcInRydWVcIiAmJiBrZXkudmFsdWUgIT09IFwiZmFsc2VcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHZhbHVlIGlzIG5laXRoZXIgXCJ0cnVlXCIgbm9yIFwiZmFsc2VcIiwgaXQncyBjb25zaWRlcmVkIGFzIGZhbHNlIGlmIGl0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMgKGUuZy4gdG8gaGFuZGxlICdYJy8nJyBmb3IgdHJ1ZS9mYWxzZSB2YWx1ZXMpXG5cdFx0XHRcdFx0XHRrZXkudmFsdWUgPSBrZXkudmFsdWUudHJpbSgpLmxlbmd0aCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRWRtLkd1aWRcIjoge1xuXHRcdFx0XHRcdGNvbnN0IG1hdGNoID0gL1swLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfS8uZXhlYyhrZXkudmFsdWUpO1xuXHRcdFx0XHRcdGtleS52YWx1ZSA9IG1hdGNoID8gbWF0Y2hbMF0gOiBrZXkudmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIExvYWQgY29udGV4dHMgZm9yIGEgbGlzdCBvZiBQYWdlIGluZm9zLCBiYXNlZCBvbiB0aGVpciByZXNwZWN0aXZlIGtleXMuXG5cdCAqIEBwYXJhbSBzdGFydHVwUGFnZXNcblx0ICogQHBhcmFtIG1vZGVsXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYWxsIGNvbnRleHRzXG5cdCAqL1xuXHRfZ2V0Q29udGV4dHNGcm9tUGFnZXM6IGFzeW5jIGZ1bmN0aW9uIChzdGFydHVwUGFnZXM6IFBhZ2VJbmZvW10sIG1vZGVsOiBPRGF0YU1vZGVsKTogUHJvbWlzZTxDb250ZXh0W11bXT4ge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdHN0YXJ0dXBQYWdlcy5tYXAoYXN5bmMgKHBhZ2VJbmZvKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoYCR7cGFnZUluZm8uY29udGV4dFBhdGh9L2ApO1xuXHRcdFx0XHRpZiAocGFnZUluZm8udGVjaG5pY2FsS2V5cykge1xuXHRcdFx0XHRcdHRoaXMuX3Nhbml0aXplS2V5cyhwYWdlSW5mby50ZWNobmljYWxLZXlzLCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHQvLyBDcmVhdGUgYSBjb250ZXh0IHdpdGggdGhlIHByb3BlciBwYXRoXG5cdFx0XHRcdFx0Y29uc3QgcGF0aCA9IGAke3BhZ2VJbmZvLmNvbnRleHRQYXRofSgke1NlbWFudGljS2V5SGVscGVyLmdldFBhdGhDb250ZW50KHBhZ2VJbmZvLnRlY2huaWNhbEtleXMsIGVudGl0eVR5cGUpfSlgO1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtjb250ZXh0XSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IHBhZ2VJbmZvLnNlbWFudGljS2V5cyA/PyBbXTtcblx0XHRcdFx0XHR0aGlzLl9zYW5pdGl6ZUtleXMoa2V5cywgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbUtleXMoa2V5cywgcGFnZUluZm8uZHJhZnRNb2RlLCBtb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cblx0XHRcdFx0XHQvLyBvbmx5IHJlcXVlc3QgYSBtaW5pbXVtIG9mIGZpZWxkcyB0byBib29zdCBiYWNrZW5kIHBlcmZvcm1hbmNlIHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBleGlzdHNcblx0XHRcdFx0XHQvLyBJc0FjdGl2ZUVudGl0eSBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGVudGl0aWVzXG5cdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSBrZXlzLm1hcCgoa2V5KSA9PiBrZXkubmFtZSk7XG5cdFx0XHRcdFx0aWYgKHBhZ2VJbmZvLmRyYWZ0TW9kZSAmJiAhc2VsZWN0ZWRGaWVsZHMuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWRGaWVsZHMucHVzaChcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmQgPSBtb2RlbC5iaW5kTGlzdChwYWdlSW5mby5jb250ZXh0UGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZpbHRlciwge1xuXHRcdFx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRGaWVsZHMuam9pbihcIixcIilcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gb0xpc3RCaW5kLnJlcXVlc3RDb250ZXh0cygwLCAyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBMb2FkcyBhbGwgY29udGV4dHMgZm9yIGEgbGlzdCBvZiBwYWdlIGluZm9zLlxuXHQgKiBAcGFyYW0gYVN0YXJ0dXBQYWdlcyBUaGUgbGlzdCBvZiBwYWdlIGluZm9zXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gbG9hZCB0aGUgY29udGV4dHNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhbGwgY29udGV4dHNcblx0ICovXG5cdF9yZXF1ZXN0T2JqZWN0c0Zyb21QYXJhbWV0ZXJzOiBhc3luYyBmdW5jdGlvbiAoYVN0YXJ0dXBQYWdlczogUGFnZUluZm9bXSwgb01vZGVsOiBPRGF0YU1vZGVsKTogUHJvbWlzZTxDb250ZXh0W11bXT4ge1xuXHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWl4IGFjdGl2ZSBhbmQgZHJhZnQgaW4gdGhlIHJldHVybmVkIGNvbnRleHRzLFxuXHRcdC8vIFNvIGlmIHRoZSBmaXJzdCBwYWdlIHVzZXMgdGVjaG5pY2FsIGtleXMgKyBkcmFmdCArIGNvbnRhaW5zIElzQWN0aXZlRW50aXR5LCBhZGQgSXNBY3RpdmVFbnRpdHkgZXZlcnl3aGVyZS5cblx0XHRpZiAoYVN0YXJ0dXBQYWdlc1swXS5kcmFmdE1vZGUgJiYgYVN0YXJ0dXBQYWdlc1swXS50ZWNobmljYWxLZXlzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGlzQWN0aXZlS2V5ID0gYVN0YXJ0dXBQYWdlc1swXS50ZWNobmljYWxLZXlzPy5maW5kKChrZXkpID0+IGtleS5uYW1lID09PSBcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0aWYgKGlzQWN0aXZlS2V5KSB7XG5cdFx0XHRcdGZvciAoY29uc3QgcGFnZUluZm8gb2YgYVN0YXJ0dXBQYWdlcykge1xuXHRcdFx0XHRcdGlmIChwYWdlSW5mby5kcmFmdE1vZGUgJiYgcGFnZUluZm8uc2VtYW50aWNLZXlzPy5zb21lKChrZXkpID0+IGtleS5uYW1lID09PSBcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0cGFnZUluZm8uc2VtYW50aWNLZXlzLnB1c2goeyBuYW1lOiBcIklzQWN0aXZlRW50aXR5XCIsIHZhbHVlOiBpc0FjdGl2ZUtleS52YWx1ZSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGV4dHMgPSBhd2FpdCB0aGlzLl9nZXRDb250ZXh0c0Zyb21QYWdlcyhhU3RhcnR1cFBhZ2VzLCBvTW9kZWwpO1xuXHRcdGlmIChjb250ZXh0cy5zb21lKChjdHgpID0+IGN0eC5sZW5ndGggIT09IDEpKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dHM7IC8vIGZhaWxlZCB0byBsb2FkIHNvbWUgY29udGV4dHMsIHJldHVybiBhcyBpc1xuXHRcdH1cblxuXHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWl4IGFjdGl2ZSBhbmQgZHJhZnQgaW4gdGhlIHJldHVybmVkIGNvbnRleHRzLlxuXHRcdC8vIC0tPiAgQ2hlY2sgaWYgYWxsIGNvbnRleHRzIGFyZSBlaXRoZXIgYWxsIGRyYWZ0cyBvciBhbGwgYWN0aXZlIGVudGl0aWVzLiBJZiBub3QsIHJlcnVuIHRoZSByZXF1ZXN0cyBieVxuXHRcdC8vIGZvcmNpbmcgSXNBY3RpdmVFbnRpdHkgPSB0cnVlICh0aGlzIGNhc2UgY2FuIGhhcHBlbiBpZiBhIGRyYWZ0IHN1Yi1vYmplY3QgaGFzIGJlZW4gZGVsZXRlZCBidXQgZXhpc3RzXG5cdFx0Ly8gaW4gdGhlIGFjdGl2ZSBvYmplY3QgZ3JhcGgpLiBXZSBjYW5ub3QgbG9hZCBkcmFmdCArIGFjdGl2ZSBpbiBhIHNpbmdsZSByZXF1ZXN0IChDQVAgbGltaXRhdGlvbilcblx0XHRjb25zdCBjb250YWluc0FjdGl2ZSA9IGNvbnRleHRzLnNvbWUoKGN0eCkgPT4gY3R4WzBdLmdldE9iamVjdCgpPy5bXCJJc0FjdGl2ZUVudGl0eVwiXSA9PT0gdHJ1ZSk7XG5cdFx0Y29uc3QgY29udGFpbnNEcmFmdCA9IGNvbnRleHRzLnNvbWUoKGN0eCkgPT4gY3R4WzBdLmdldE9iamVjdCgpPy5bXCJJc0FjdGl2ZUVudGl0eVwiXSA9PT0gZmFsc2UpO1xuXHRcdGlmIChjb250YWluc0FjdGl2ZSAmJiBjb250YWluc0RyYWZ0KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2VJbmZvIG9mIGFTdGFydHVwUGFnZXMpIHtcblx0XHRcdFx0aWYgKHBhZ2VJbmZvLmRyYWZ0TW9kZSkge1xuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBwYWdlSW5mby5zZW1hbnRpY0tleXMgPz8gcGFnZUluZm8udGVjaG5pY2FsS2V5cztcblx0XHRcdFx0XHRjb25zdCBpc0FjdGl2ZUtleSA9IGtleXMhLmZpbmQoKGtleSkgPT4ga2V5Lm5hbWUgPT09IFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0aWYgKGlzQWN0aXZlS2V5KSB7XG5cdFx0XHRcdFx0XHRpc0FjdGl2ZUtleS52YWx1ZSA9IFwidHJ1ZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrZXlzIS5wdXNoKHsgbmFtZTogXCJJc0FjdGl2ZUVudGl0eVwiLCB2YWx1ZTogXCJ0cnVlXCIgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250ZXh0cyA9IGF3YWl0IHRoaXMuX2dldENvbnRleHRzRnJvbVBhZ2VzKGFTdGFydHVwUGFnZXMsIG9Nb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRleHRzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSByaWdodG1vc3QgdGFyZ2V0IG5hbWUgZm9yIGEgZ2l2ZW4gcm91dGUuXG5cdCAqIEBwYXJhbSByb3V0ZVxuXHQgKiBAcGFyYW0gbWFuaWZlc3RSb3V0aW5nXG5cdCAqIEByZXR1cm5zIFRoZSB0YXJnZXQgbmFtZSAob3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIHRhcmdldCB3YXMgZm91bmQpXG5cdCAqL1xuXHRfZ2V0UmlnaHRNb3N0VGFyZ2V0TmFtZShyb3V0ZTogUm91dGluZ1JvdXRlLCBtYW5pZmVzdFJvdXRpbmc6IFJvdXRpbmdDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyb3V0ZS50YXJnZXQpKSB7XG5cdFx0XHQvLyBHZXQgdGhlIHJpZ2h0bW9zdCB0YXJnZXQgZm9yIHRoaXMgcm91dGUgKGlnbm9yZSB0YXJnZXRzIGNvcnJlc3BvbmRpbmcgdG8gcmV1c2UgY29tcG9uZW50cylcblx0XHRcdGNvbnN0IHJldmVyc2VUYXJnZXRzID0gWy4uLnJvdXRlLnRhcmdldF0ucmV2ZXJzZSgpO1xuXHRcdFx0cmV0dXJuIHJldmVyc2VUYXJnZXRzLmZpbmQoKHRhcmdldElEKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBtYW5pZmVzdFJvdXRpbmc/LnRhcmdldHM/Llt0YXJnZXRJRF07XG5cdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldD8ubmFtZSAmJlxuXHRcdFx0XHRcdFtcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiLCBcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZVwiLCBcInNhcC5mZS5jb3JlLmZwbVwiXS5pbmNsdWRlcyhjdXJyZW50VGFyZ2V0Lm5hbWUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHJvdXRlLnRhcmdldDtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBQYWdlSW5mbyBmcm9tIGEgcm91dGUgaWYgaXQncyByZWFjaGFibGUgZnJvbSB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gb1JvdXRlIFRoZSByb3V0ZVxuXHQgKiBAcGFyYW0gb01hbmlmZXN0Um91dGluZyBUaGUgYXBwIG1hbmlmZXN0IHJvdXRpbmcgc2VjdGlvblxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGFwcCBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgQSBwYWdlIGluZm8gaWYgdGhlIHBhZ2UgaXMgcmVhY2hhYmxlLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0UmVhY2hhYmxlUGFnZUluZm9Gcm9tUm91dGU6IGZ1bmN0aW9uIChcblx0XHRvUm91dGU6IFJvdXRpbmdSb3V0ZSxcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBSb3V0aW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbFxuXHQpOiBQYWdlSW5mbyB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICc6P3F1ZXJ5OicgYW5kICcvJ1xuXHRcdGxldCBzUGF0dGVybjogc3RyaW5nID0gb1JvdXRlLnBhdHRlcm4hLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblxuXHRcdGlmICghc1BhdHRlcm4gfHwgIXNQYXR0ZXJuLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gSWdub3JlIGxldmVsLTAgcm91dGVzIChMaXN0UmVwb3J0KSBvciByb3V0ZXMgY29ycmVzcG9uZGluZyB0byBhIDEtMSByZWxhdGlvbiAobm8ga2V5cyBpbiB0aGUgVVJMIGluIHRoaXMgY2FzZSlcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKC9cXChcXHtbXn1dKlxcfVxcKS9nLCBcIigjKVwiKTsgLy8gUmVwbGFjZSBrZXlzIHdpdGggI1xuXG5cdFx0Y29uc3Qgc1RhcmdldE5hbWUgPSB0aGlzLl9nZXRSaWdodE1vc3RUYXJnZXROYW1lKG9Sb3V0ZSwgb01hbmlmZXN0Um91dGluZyk7XG5cdFx0aWYgKCFzVGFyZ2V0TmFtZSkge1xuXHRcdFx0Ly8gTm8gdGFyZ2V0IGZvdW5kIGZvciB0aGlzIHJvdXRlXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9UYXJnZXQgPSBvTWFuaWZlc3RSb3V0aW5nPy50YXJnZXRzPy5bc1RhcmdldE5hbWVdO1xuXG5cdFx0Y29uc3QgYVBhdHRlcm5TZWdtZW50cyA9IHNQYXR0ZXJuLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBwYWdlTGV2ZWwgPSBhUGF0dGVyblNlZ21lbnRzLmxlbmd0aCAtIDE7XG5cblx0XHRpZiAocGFnZUxldmVsICE9PSAwICYmIG9UYXJnZXQ/Lm9wdGlvbnM/LnNldHRpbmdzPy5hbGxvd0RlZXBMaW5raW5nICE9PSB0cnVlKSB7XG5cdFx0XHQvLyBUaGUgZmlyc3QgbGV2ZWwgb2Ygb2JqZWN0IHBhZ2UgYWxsb3dzIGRlZXAgbGlua2luZyBieSBkZWZhdWx0LlxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IG11c3QgYWxsb3cgZGVlcCBsaW5raW5nIGV4cGxpY2l0ZWx5IGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRsZXQgc0NvbnRleHRQYXRoID0gXCJcIjtcblx0XHRpZiAob1RhcmdldD8ub3B0aW9ucz8uc2V0dGluZ3M/LmVudGl0eVNldCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYC8ke29UYXJnZXQub3B0aW9ucy5zZXR0aW5ncy5lbnRpdHlTZXR9YDtcblx0XHR9IGVsc2UgaWYgKG9UYXJnZXQ/Lm9wdGlvbnM/LnNldHRpbmdzPy5jb250ZXh0UGF0aCkge1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG9UYXJnZXQub3B0aW9ucy5zZXR0aW5ncy5jb250ZXh0UGF0aCkhO1xuXHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0XHRpZiAob2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQpIHtcblx0XHRcdFx0c0NvbnRleHRQYXRoID0gYC8ke29iamVjdFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWV9YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXNDb250ZXh0UGF0aCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3Qgb0VudGl0eVR5cGUgPSBzQ29udGV4dFBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYC8kRW50aXR5Q29udGFpbmVyJHtzQ29udGV4dFBhdGh9L2ApO1xuXG5cdFx0aWYgKCFvRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHNlbWFudGljIGtleSB2YWx1ZXMgZm9yIHRoZSBlbnRpdHlcblx0XHRsZXQgc2VtYW50aWNLZXlOYW1lcyA9IChcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJEVudGl0eUNvbnRhaW5lciR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljS2V5YCkgYXNcblx0XHRcdFx0fCBFeHBhbmRQYXRoVHlwZTxQcm9wZXJ0eVBhdGg+W11cblx0XHRcdFx0fCB1bmRlZmluZWRcblx0XHQpPy5tYXAoKHNlbUtleSkgPT4ge1xuXHRcdFx0cmV0dXJuIHNlbUtleS4kUHJvcGVydHlQYXRoO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSWYgd2UncmUgb24gYSBmaXJzdCBsZXZlbCBvYmplY3QgcGFnZSBhbmQgdGhlIHNlbWFudGljIGtleXMgYXJlIHRoZSBzYW1lIGFzIHRoZSB0ZWNobmljYWwga2V5cywgd2UgdXNlIHRlY2huaWNhbCBrZXlzIGRpcmVjdGx5LFxuXHRcdC8vIHRvIGF2b2lkIHRoZSBhZGRpdGlvbmFsIHF1ZXJ5IHVzZWQgdG8gbG9hZCB0aGUgb2JqZWN0IGZyb20gaXRzIHNlbWFudGljIGtleXMgaW4gX3JlcXVlc3RPYmplY3RzRnJvbVBhcmFtZXRlcnNcblx0XHRjb25zdCB0ZWNobmljYWxLZXlOYW1lcyA9IG9FbnRpdHlUeXBlW1wiJEtleVwiXTtcblx0XHRpZiAoXG5cdFx0XHRwYWdlTGV2ZWwgPT09IDAgJiZcblx0XHRcdHNlbWFudGljS2V5TmFtZXMgJiZcblx0XHRcdHNlbWFudGljS2V5TmFtZXMubGVuZ3RoID09PSB0ZWNobmljYWxLZXlOYW1lcy5sZW5ndGggJiZcblx0XHRcdHNlbWFudGljS2V5TmFtZXMuZXZlcnkoKGtleSkgPT4gdGVjaG5pY2FsS2V5TmFtZXMuaW5jbHVkZXMoa2V5KSlcblx0XHQpIHtcblx0XHRcdHNlbWFudGljS2V5TmFtZXMgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYVNlbWFudGlja0tleXMgPSBzZW1hbnRpY0tleU5hbWVzID8gdGhpcy5fZ2V0S2V5c0Zyb21TdGFydHVwUGFyYW1zKHNlbWFudGljS2V5TmFtZXMsIG9TdGFydHVwUGFyYW1ldGVycykgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBHZXQgdGhlIHRlY2huaWNhbCBrZXlzIG9ubHkgaWYgd2UgY291bGRuJ3QgZmluZCB0aGUgc2VtYW50aWMga2V5IHZhbHVlcywgYW5kIG9uIGZpcnN0IGxldmVsIE9QXG5cdFx0Y29uc3QgYVRlY2huaWNhbEtleXMgPVxuXHRcdFx0IWFTZW1hbnRpY2tLZXlzICYmIHBhZ2VMZXZlbCA9PT0gMCA/IHRoaXMuX2dldEtleXNGcm9tU3RhcnR1cFBhcmFtcyh0ZWNobmljYWxLZXlOYW1lcywgb1N0YXJ0dXBQYXJhbWV0ZXJzKSA6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChhU2VtYW50aWNrS2V5cyA9PT0gdW5kZWZpbmVkICYmIGFUZWNobmljYWxLZXlzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIHNlbWFudGljL3RlY2huaWNhbCBrZXlzIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHN0YXJ0dXAgcGFyYW1ldGVycyBjb250YWluIHZhbHVlcyBmb3IgYWxsIHNlbWFudGljIGtleXMgKG9yIHRlY2huaWNhbCBrZXlzKSAtLT4gd2UgY2FuIHN0b3JlIHRoZSBwYWdlIGluZm8gaW4gdGhlIGNvcnJlc3BvbmRpbmcgbGV2ZWxcblx0XHRjb25zdCBkcmFmdE1vZGUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYC8kRW50aXR5Q29udGFpbmVyJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSB8fFxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYC8kRW50aXR5Q29udGFpbmVyJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBmYWxzZTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwYXR0ZXJuOiBzUGF0dGVybixcblx0XHRcdGNvbnRleHRQYXRoOiBzQ29udGV4dFBhdGgsXG5cdFx0XHRkcmFmdE1vZGUsXG5cdFx0XHR0ZWNobmljYWxLZXlzOiBhVGVjaG5pY2FsS2V5cyxcblx0XHRcdHNlbWFudGljS2V5czogYVNlbWFudGlja0tleXMsXG5cdFx0XHR0YXJnZXQ6IHNUYXJnZXROYW1lLFxuXHRcdFx0cGFnZUxldmVsXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGFnZXMgdGhhdCBhbGxvdyBkZWVwbGluayBhbmQgdGhhdCBjYW4gYmUgcmVhY2hlZCB1c2luZyB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gb01hbmlmZXN0Um91dGluZyBUaGUgcm91dGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcHAgbWFuaWZlc3Rcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgVGhlIHJlYWNoYWJsZSBwYWdlc1xuXHQgKi9cblx0X2dldFJlYWNoYWJsZVBhZ2VzOiBmdW5jdGlvbiAoXG5cdFx0b01hbmlmZXN0Um91dGluZzogUm91dGluZ0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBTdGFydHVwUGFyYW1ldGVycyB8IG51bGwsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0KTogUGFnZUluZm9bXVtdIHtcblx0XHRjb25zdCBhUm91dGVzOiBSb3V0aW5nUm91dGVbXSA9IG9NYW5pZmVzdFJvdXRpbmc/LnJvdXRlcyA/PyBbXTtcblx0XHRjb25zdCBtUGFnZXNCeUxldmVsOiBSZWNvcmQ8bnVtYmVyLCBQYWdlSW5mb1tdPiA9IHt9O1xuXG5cdFx0YVJvdXRlcy5mb3JFYWNoKChvUm91dGUpID0+IHtcblx0XHRcdGNvbnN0IG9QYWdlSW5mbyA9IHRoaXMuX2dldFJlYWNoYWJsZVBhZ2VJbmZvRnJvbVJvdXRlKG9Sb3V0ZSwgb01hbmlmZXN0Um91dGluZywgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBvTWV0YU1vZGVsKTtcblxuXHRcdFx0aWYgKG9QYWdlSW5mbykge1xuXHRcdFx0XHRpZiAoIW1QYWdlc0J5TGV2ZWxbb1BhZ2VJbmZvLnBhZ2VMZXZlbF0pIHtcblx0XHRcdFx0XHRtUGFnZXNCeUxldmVsW29QYWdlSW5mby5wYWdlTGV2ZWxdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhZ2VzQnlMZXZlbFtvUGFnZUluZm8ucGFnZUxldmVsXS5wdXNoKG9QYWdlSW5mbyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBBIHBhZ2UgaXMgcmVhY2hhYmxlIG9ubHkgaWYgYWxsIGl0cyBwYXJlbnRzIGFyZSBhbHNvIHJlYWNoYWJsZVxuXHRcdC8vIFNvIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IHBhZ2VzIGZvciBhIGdpdmVuIGxldmVsLCBhbGwgcGFnZXMgd2l0aCBhIGhpZ2hlciBsZXZlbCB3b24ndCBiZSByZWFjaGFibGUgYW55d2F5XG5cdFx0Y29uc3QgYVJlYWNoYWJsZVBhZ2VzOiBQYWdlSW5mb1tdW10gPSBbXTtcblx0XHRsZXQgbGV2ZWwgPSAwO1xuXHRcdHdoaWxlIChtUGFnZXNCeUxldmVsW2xldmVsXSkge1xuXHRcdFx0YVJlYWNoYWJsZVBhZ2VzLnB1c2gobVBhZ2VzQnlMZXZlbFtsZXZlbF0pO1xuXHRcdFx0bGV2ZWwrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gYVJlYWNoYWJsZVBhZ2VzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2Ygc3RhcnR1cCBwYWdlcy5cblx0ICogQHBhcmFtIG9NYW5pZmVzdFJvdXRpbmcgVGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBwIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgbWV0YW1vZGVsXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0YXJ0dXAgcGFnZSBpbmZvc1xuXHQgKi9cblx0X2dldFN0YXJ0dXBQYWdlc0Zyb21TdGFydHVwUGFyYW1zOiBmdW5jdGlvbiAoXG5cdFx0b01hbmlmZXN0Um91dGluZzogUm91dGluZ0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBTdGFydHVwUGFyYW1ldGVycyB8IG51bGwsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0KTogUGFnZUluZm9bXSB7XG5cdFx0Ly8gRmluZCBhbGwgcGFnZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCB3aXRoIHRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0XHRjb25zdCBhUmVhY2hhYmxlUGFnZXMgPSB0aGlzLl9nZXRSZWFjaGFibGVQYWdlcyhvTWFuaWZlc3RSb3V0aW5nLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG9NZXRhTW9kZWwpO1xuXG5cdFx0aWYgKGFSZWFjaGFibGVQYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHQvLyBGaW5kIHRoZSBsb25nZXN0IHNlcXVlbmNlIG9mIHBhZ2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgKHJlY3Vyc2l2ZWx5KVxuXHRcdGxldCByZXN1bHQ6IFBhZ2VJbmZvW10gPSBbXTtcblx0XHRjb25zdCBjdXJyZW50OiBQYWdlSW5mb1tdID0gW107XG5cblx0XHRmdW5jdGlvbiBmaW5kUmVjdXJzaXZlKGxldmVsOiBudW1iZXIpOiB2b2lkIHtcblx0XHRcdGNvbnN0IGFDdXJyZW50TGV2ZWxQYWdlcyA9IGFSZWFjaGFibGVQYWdlc1tsZXZlbF07XG5cdFx0XHRjb25zdCBsYXN0UGFnZSA9IGN1cnJlbnQubGVuZ3RoID8gY3VycmVudFtjdXJyZW50Lmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoYUN1cnJlbnRMZXZlbFBhZ2VzKSB7XG5cdFx0XHRcdGFDdXJyZW50TGV2ZWxQYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZXh0UGFnZSkge1xuXHRcdFx0XHRcdGlmICghbGFzdFBhZ2UgfHwgbmV4dFBhZ2UucGF0dGVybi5pbmRleE9mKGxhc3RQYWdlLnBhdHRlcm4pID09PSAwKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBvbmx5IGNvbnNpZGVyIHBhZ2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgcGFnZSBhdCB0aGUgcHJldmlvdXMgbGV2ZWwsXG5cdFx0XHRcdFx0XHQvLyAtLT4gdGhlaXIgcGF0dGVybiBtdXN0IGJlIHRoZSBwYXR0ZXJuIG9mIHRoZSBwcmV2aW91cyBwYWdlIHdpdGggYW5vdGhlciBzZWdtZW50IGFwcGVuZGVkXG5cdFx0XHRcdFx0XHRjdXJyZW50LnB1c2gobmV4dFBhZ2UpO1xuXHRcdFx0XHRcdFx0ZmluZFJlY3Vyc2l2ZShsZXZlbCArIDEpO1xuXHRcdFx0XHRcdFx0Y3VycmVudC5wb3AoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnQubGVuZ3RoID4gcmVzdWx0Lmxlbmd0aCkge1xuXHRcdFx0XHRyZXN1bHQgPSBjdXJyZW50LnNsaWNlKCk7IC8vIFdlIGhhdmUgZm91bmQgYSBzZXF1ZW5jZSBsb25nZXIgdGhhbiBvdXIgcHJldmlvdXMgYmVzdCAtLT4gc3RvcmUgaXQgYXMgdGhlIG5ldyBsb25nZXN0XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZmluZFJlY3Vyc2l2ZSgwKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIHN0YXJ0dXAgb2JqZWN0IGZyb20gdGhlIGxpc3Qgb2YgcGFnZXMgYW5kIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gYVN0YXJ0dXBQYWdlcyBUaGUgcGFnZXNcblx0ICogQHBhcmFtIGFDb250ZXh0cyBUaGUgY29udGV4dHNcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZWl0aGVyIGEgaGFzaCBvciBhIGNvbnRleHQgdG8gbmF2aWdhdGUgdG8sIG9yIGFuIGVtcHR5IG9iamVjdCBpZiBubyBkZWVwIGxpbmsgd2FzIGZvdW5kXG5cdCAqL1xuXHRfZ2V0RGVlcExpbmtPYmplY3Q6IGZ1bmN0aW9uIChhU3RhcnR1cFBhZ2VzOiBQYWdlSW5mb1tdLCBhQ29udGV4dHM6IENvbnRleHRbXSk6IHsgaGFzaD86IHN0cmluZzsgY29udGV4dD86IENvbnRleHQgfSB7XG5cdFx0aWYgKGFDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHJldHVybiB7IGNvbnRleHQ6IGFDb250ZXh0c1swXSB9O1xuXHRcdH0gZWxzZSBpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdC8vIE5hdmlnYXRpb24gdG8gYSBkZWVwZXIgbGV2ZWwgLS0+IHVzZSB0aGUgcGF0dGVybiBvZiB0aGUgZGVlcGVzdCBvYmplY3QgcGFnZVxuXHRcdFx0Ly8gYW5kIHJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlIElEIGZyb20gdGhlIGNvbnRleHRzXG5cdFx0XHRsZXQgaGFzaCA9IGFTdGFydHVwUGFnZXNbYVN0YXJ0dXBQYWdlcy5sZW5ndGggLSAxXS5wYXR0ZXJuO1xuXHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9Db250ZXh0KSB7XG5cdFx0XHRcdGhhc2ggPSBoYXNoLnJlcGxhY2UoXCIoIylcIiwgYCgke29Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIihcIilbMV19YCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHsgaGFzaCB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHN0YXJ0dXAgcGFyYW1ldGVycyBmb3IgYSBkZWVwbGluayBjYXNlLCBmcm9tIHN0YXJ0dXAgcGFyYW1ldGVycyBhbmQgcm91dGluZyBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIG9NYW5pZmVzdFJvdXRpbmcgVGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBwIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyBlaXRoZXIgYSBoYXNoIG9yIGEgY29udGV4dCB0byBuYXZpZ2F0ZSB0bywgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vIGRlZXAgbGluayB3YXMgZm91bmRcblx0ICovXG5cdGdldERlZXBMaW5rU3RhcnR1cEhhc2g6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBSb3V0aW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCxcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWxcblx0KTogUHJvbWlzZTx7IGhhc2g/OiBzdHJpbmc7IGNvbnRleHQ/OiBDb250ZXh0IH0+IHtcblx0XHRhd2FpdCBvTW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdE9iamVjdChcIi8kRW50aXR5Q29udGFpbmVyL1wiKTtcblxuXHRcdC8vIENoZWNrIGlmIHNlbWFudGljIGtleXMgYXJlIHByZXNlbnQgaW4gdXJsIHBhcmFtZXRlcnMgZm9yIGV2ZXJ5IG9iamVjdCBwYWdlIGF0IGVhY2ggbGV2ZWxcblx0XHRjb25zdCBzdGFydHVwUGFnZXMgPSB0aGlzLl9nZXRTdGFydHVwUGFnZXNGcm9tU3RhcnR1cFBhcmFtcyhvTWFuaWZlc3RSb3V0aW5nLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cblx0XHRpZiAoc3RhcnR1cFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gZGVlcGxpbmsgcG9zc2libGVcblx0XHRcdHJldHVybiB7fTtcblx0XHR9XG5cblx0XHQvLyBMb2FkIHRoZSBjb250ZXh0c1xuXHRcdGNvbnN0IGFsbENvbnRleHRzID0gYXdhaXQgdGhpcy5fcmVxdWVzdE9iamVjdHNGcm9tUGFyYW1ldGVycyhzdGFydHVwUGFnZXMsIG9Nb2RlbCk7XG5cdFx0aWYgKGFsbENvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIG9ubHkgZ2V0IDEgY29udGV4dCBwZXIgcHJvbWlzZSwgYW5kIGZsYXR0ZW4gdGhlIGFycmF5XG5cdFx0XHRjb25zdCBjb250ZXh0c0ZvclN0YXJ0dXA6IENvbnRleHRbXSA9IFtdO1xuXHRcdFx0YWxsQ29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoZm91bmRDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoZm91bmRDb250ZXh0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRjb250ZXh0c0ZvclN0YXJ0dXAucHVzaChmb3VuZENvbnRleHRzWzBdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBjb250ZXh0c0ZvclN0YXJ0dXAubGVuZ3RoID09PSBhbGxDb250ZXh0cy5sZW5ndGggPyB0aGlzLl9nZXREZWVwTGlua09iamVjdChzdGFydHVwUGFnZXMsIGNvbnRleHRzRm9yU3RhcnR1cCkgOiB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgbmV3IGhhc2ggYmFzZWQgb24gdGhlIHN0YXJ0dXAgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXIgdmFsdWVzIChtYXAgcGFyYW1ldGVyIG5hbWUgLT4gYXJyYXkgb2YgdmFsdWVzKVxuXHQgKiBAcGFyYW0gc0NvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggZm9yIHRoZSBzdGFydHVwIG9mIHRoZSBhcHAgKGdlbmVyYWxseSB0aGUgcGF0aCB0byB0aGUgbWFpbiBlbnRpdHkgc2V0KVxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBoYXNoIHRvIG5hdmlnYXRlIHRvLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUncyBubyBuZWVkIHRvIG5hdmlnYXRlXG5cdCAqL1xuXHRnZXRDcmVhdGVTdGFydHVwSGFzaDogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczogU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0c0NvbnRleHRQYXRoOiBzdHJpbmcsXG5cdFx0b1JvdXRlcjogUm91dGVyLFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGApLnRoZW4oKG9FbnRpdHlTZXRBbm5vdGF0aW9uczogTWV0YU1vZGVsRW50aXR5U2V0QW5ub3RhdGlvbikgPT4ge1xuXHRcdFx0bGV0IHNNZXRhUGF0aCA9IFwiXCI7XG5cdFx0XHRsZXQgYkNyZWF0YWJsZSA9IHRydWU7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0b0VudGl0eVNldEFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gJiZcblx0XHRcdFx0b0VudGl0eVNldEFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl1bXCJOZXdBY3Rpb25cIl1cblx0XHRcdCkge1xuXHRcdFx0XHRzTWV0YVBhdGggPSBgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uQE9yZy5PRGF0YS5Db3JlLlYxLk9wZXJhdGlvbkF2YWlsYWJsZWA7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCJdICYmXG5cdFx0XHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIl1bXCJOZXdBY3Rpb25cIl1cblx0XHRcdCkge1xuXHRcdFx0XHRzTWV0YVBhdGggPSBgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlYDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNNZXRhUGF0aCkge1xuXHRcdFx0XHRjb25zdCBiTmV3QWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKTtcblx0XHRcdFx0aWYgKGJOZXdBY3Rpb25PcGVyYXRpb25BdmFpbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0YkNyZWF0YWJsZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvSW5zZXJ0UmVzdHJpY3Rpb25zID0gb0VudGl0eVNldEFubm90YXRpb25zW1wiQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuSW5zZXJ0UmVzdHJpY3Rpb25zXCJdO1xuXHRcdFx0XHRpZiAob0luc2VydFJlc3RyaWN0aW9ucyAmJiBvSW5zZXJ0UmVzdHJpY3Rpb25zLkluc2VydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0YkNyZWF0YWJsZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoYkNyZWF0YWJsZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXREZWZhdWx0Q3JlYXRlSGFzaChvU3RhcnR1cFBhcmFtZXRlcnMsIHNDb250ZXh0UGF0aCwgb1JvdXRlcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgaGFzaCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlciB2YWx1ZXMgKG1hcCBwYXJhbWV0ZXIgbmFtZSAtPiBhcnJheSBvZiB2YWx1ZXMpXG5cdCAqIEBwYXJhbSBzQ29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgZW50aXR5IHNldCB0byBiZSB1c2VkIGZvciB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIG9Sb3V0ZXIgVGhlIHJvdXRlciBpbnN0YW5jZVxuXHQgKiBAcmV0dXJucyBUaGUgaGFzaFxuXHQgKi9cblx0Z2V0RGVmYXVsdENyZWF0ZUhhc2g6IGZ1bmN0aW9uIChcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFN0YXJ0dXBQYXJhbWV0ZXJzIHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzQ29udGV4dFBhdGg6IHN0cmluZyxcblx0XHRvUm91dGVyOiBSb3V0ZXJcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc0RlZmF1bHRDcmVhdGVIYXNoID0gb1N0YXJ0dXBQYXJhbWV0ZXJzICYmIG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlID8gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF0gOiBcImNyZWF0ZVwiO1xuXHRcdGxldCBzSGFzaCA9IFwiXCI7XG5cblx0XHRzRGVmYXVsdENyZWF0ZUhhc2ggPVxuXHRcdFx0c0RlZmF1bHRDcmVhdGVIYXNoLmluY2x1ZGVzKFwiOlwiKSAmJiBzRGVmYXVsdENyZWF0ZUhhc2gubGVuZ3RoID4gc0RlZmF1bHRDcmVhdGVIYXNoLmluZGV4T2YoXCI6XCIpICsgMVxuXHRcdFx0XHQ/IHNEZWZhdWx0Q3JlYXRlSGFzaC5zdWJzdHJpbmcoMCwgc0RlZmF1bHRDcmVhdGVIYXNoLmluZGV4T2YoXCI6XCIpKVxuXHRcdFx0XHQ6IFwiY3JlYXRlXCI7XG5cdFx0c0hhc2ggPSBgJHtzQ29udGV4dFBhdGguc3Vic3RyaW5nKDEpfSguLi4pP2ktYWN0aW9uPSR7c0RlZmF1bHRDcmVhdGVIYXNofWA7XG5cdFx0aWYgKG9Sb3V0ZXIuZ2V0Um91dGVJbmZvQnlIYXNoKHNIYXNoKSkge1xuXHRcdFx0cmV0dXJuIHNIYXNoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIHJvdXRlIG1hdGNoIGZvciBjcmVhdGluZyBhIG5ldyAke3NDb250ZXh0UGF0aC5zdWJzdHJpbmcoMSl9YCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBlbnRpdHkgaW4gdGhlIGdpdmVuIGNvbnRleHQgcGF0aCBpcyBlZGl0YWJsZSBieSBsb29raW5nIGF0IHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnM6XG5cdCAqXG5cdCAqIC0gQENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIG9mIHRoZSBlZGl0IGFjdGlvblxuXHQgKiAtIEBVSS5VcGRhdGVIaWRkZW5cblx0ICpcblx0ICogT25seSBzdGF0aWMgdmFsdWVzICh0cnVlL2ZhbHNlKSBhcmUgY29uc2lkZXJlZCBoZXJlIGFzIHdlIGRvbid0IGhhdmUgdGhlIGFjdHVhbCBiaW5kaW5nIGNvbnRleHQgdG8gZXZhbHVhdGUgZHluYW1pYyBiaW5kaW5ncy5cblx0ICogQHBhcmFtIGNvbnRleHRQYXRoXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgZW50aXR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuXHQgKi9cblx0dmVyaWZ5RWRpdEFubm90YXRpb25zOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGVudGl0eVNldEFubm90YXRpb25zOiBNZXRhTW9kZWxFbnRpdHlTZXRBbm5vdGF0aW9uID0gYXdhaXQgbWV0YU1vZGVsLnJlcXVlc3RPYmplY3QoYCR7Y29udGV4dFBhdGh9QGApO1xuXHRcdGNvbnN0IHVwZGF0ZUhpZGRlbiA9IGVudGl0eVNldEFubm90YXRpb25zPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVXBkYXRlSGlkZGVuXCJdO1xuXHRcdGxldCBvcGVyYXRpb25BdmFpbGFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKGVudGl0eVNldEFubm90YXRpb25zPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXT8uW1wiRWRpdEFjdGlvblwiXSkge1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlID0gbWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0YCR7Y29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvRWRpdEFjdGlvbkBPcmcuT0RhdGEuQ29yZS5WMS5PcGVyYXRpb25BdmFpbGFibGVgXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvcGVyYXRpb25BdmFpbGFibGUgIT09IGZhbHNlICYmIHVwZGF0ZUhpZGRlbiAhPT0gdHJ1ZTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwU3RhcnR1cEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7RUE2QkEsTUFBTUEsZ0JBQWdCLEdBQUc7SUFDeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHlCQUF5QixFQUFFLFNBQUFBLENBQVVDLFNBQW1CLEVBQUVDLGtCQUE0QyxFQUEyQjtNQUNoSSxJQUFJQyxTQUFT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
|
|
@@ -111,6 +111,42 @@ const AppStartupHelper = {
|
|
|
111
111
|
});
|
|
112
112
|
},
|
|
113
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Load contexts for a list of Page infos, based on their respective keys.
|
|
116
|
+
* @param startupPages
|
|
117
|
+
* @param model
|
|
118
|
+
* @returns A Promise for all contexts
|
|
119
|
+
*/
|
|
120
|
+
_getContextsFromPages: async function (startupPages: PageInfo[], model: ODataModel): Promise<Context[][]> {
|
|
121
|
+
return Promise.all(
|
|
122
|
+
startupPages.map(async (pageInfo) => {
|
|
123
|
+
const entityType = model.getMetaModel().getObject(`${pageInfo.contextPath}/`);
|
|
124
|
+
if (pageInfo.technicalKeys) {
|
|
125
|
+
this._sanitizeKeys(pageInfo.technicalKeys, entityType);
|
|
126
|
+
// Create a context with the proper path
|
|
127
|
+
const path = `${pageInfo.contextPath}(${SemanticKeyHelper.getPathContent(pageInfo.technicalKeys, entityType)})`;
|
|
128
|
+
const context = model.bindContext(path).getBoundContext();
|
|
129
|
+
return Promise.resolve([context]);
|
|
130
|
+
} else {
|
|
131
|
+
const keys = pageInfo.semanticKeys ?? [];
|
|
132
|
+
this._sanitizeKeys(keys, entityType);
|
|
133
|
+
const filter = this._createFilterFromKeys(keys, pageInfo.draftMode, model.getMetaModel());
|
|
134
|
+
|
|
135
|
+
// only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
136
|
+
// IsActiveEntity is needed to distinguish between draft and active entities
|
|
137
|
+
const selectedFields = keys.map((key) => key.name);
|
|
138
|
+
if (pageInfo.draftMode && !selectedFields.includes("IsActiveEntity")) {
|
|
139
|
+
selectedFields.push("IsActiveEntity");
|
|
140
|
+
}
|
|
141
|
+
const oListBind = model.bindList(pageInfo.contextPath, undefined, undefined, filter, {
|
|
142
|
+
$select: selectedFields.join(",")
|
|
143
|
+
});
|
|
144
|
+
return oListBind.requestContexts(0, 2);
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
},
|
|
149
|
+
|
|
114
150
|
/**
|
|
115
151
|
* Loads all contexts for a list of page infos.
|
|
116
152
|
* @param aStartupPages The list of page infos
|
|
@@ -118,33 +154,46 @@ const AppStartupHelper = {
|
|
|
118
154
|
* @returns A Promise for all contexts
|
|
119
155
|
*/
|
|
120
156
|
_requestObjectsFromParameters: async function (aStartupPages: PageInfo[], oModel: ODataModel): Promise<Context[][]> {
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const aKeys = pageInfo.semanticKeys ?? [];
|
|
132
|
-
this._sanitizeKeys(aKeys, entityType);
|
|
133
|
-
const oFilter = this._createFilterFromKeys(aKeys, pageInfo.draftMode, oModel.getMetaModel());
|
|
134
|
-
|
|
135
|
-
// only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
136
|
-
const oListBind = oModel.bindList(pageInfo.contextPath, undefined, undefined, oFilter, {
|
|
137
|
-
$select: aKeys
|
|
138
|
-
.map((key) => {
|
|
139
|
-
return key.name;
|
|
140
|
-
})
|
|
141
|
-
.join(",")
|
|
142
|
-
});
|
|
143
|
-
return oListBind.requestContexts(0, 2);
|
|
157
|
+
// We don't want to mix active and draft in the returned contexts,
|
|
158
|
+
// So if the first page uses technical keys + draft + contains IsActiveEntity, add IsActiveEntity everywhere.
|
|
159
|
+
if (aStartupPages[0].draftMode && aStartupPages[0].technicalKeys !== undefined) {
|
|
160
|
+
const isActiveKey = aStartupPages[0].technicalKeys?.find((key) => key.name === "IsActiveEntity");
|
|
161
|
+
if (isActiveKey) {
|
|
162
|
+
for (const pageInfo of aStartupPages) {
|
|
163
|
+
if (pageInfo.draftMode && pageInfo.semanticKeys?.some((key) => key.name === "IsActiveEntity") === false) {
|
|
164
|
+
pageInfo.semanticKeys.push({ name: "IsActiveEntity", value: isActiveKey.value });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
144
167
|
}
|
|
145
|
-
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
let contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
171
|
+
if (contexts.some((ctx) => ctx.length !== 1)) {
|
|
172
|
+
return contexts; // failed to load some contexts, return as is
|
|
173
|
+
}
|
|
146
174
|
|
|
147
|
-
|
|
175
|
+
// We don't want to mix active and draft in the returned contexts.
|
|
176
|
+
// --> Check if all contexts are either all drafts or all active entities. If not, rerun the requests by
|
|
177
|
+
// forcing IsActiveEntity = true (this case can happen if a draft sub-object has been deleted but exists
|
|
178
|
+
// in the active object graph). We cannot load draft + active in a single request (CAP limitation)
|
|
179
|
+
const containsActive = contexts.some((ctx) => ctx[0].getObject()?.["IsActiveEntity"] === true);
|
|
180
|
+
const containsDraft = contexts.some((ctx) => ctx[0].getObject()?.["IsActiveEntity"] === false);
|
|
181
|
+
if (containsActive && containsDraft) {
|
|
182
|
+
for (const pageInfo of aStartupPages) {
|
|
183
|
+
if (pageInfo.draftMode) {
|
|
184
|
+
const keys = pageInfo.semanticKeys ?? pageInfo.technicalKeys;
|
|
185
|
+
const isActiveKey = keys!.find((key) => key.name === "IsActiveEntity");
|
|
186
|
+
if (isActiveKey) {
|
|
187
|
+
isActiveKey.value = "true";
|
|
188
|
+
} else {
|
|
189
|
+
keys!.push({ name: "IsActiveEntity", value: "true" });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
contexts = await this._getContextsFromPages(aStartupPages, oModel);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return contexts;
|
|
148
197
|
},
|
|
149
198
|
|
|
150
199
|
/**
|
|
@@ -407,6 +456,11 @@ const AppStartupHelper = {
|
|
|
407
456
|
// Check if semantic keys are present in url parameters for every object page at each level
|
|
408
457
|
const startupPages = this._getStartupPagesFromStartupParams(oManifestRouting, oStartupParameters, oModel.getMetaModel());
|
|
409
458
|
|
|
459
|
+
if (startupPages.length === 0) {
|
|
460
|
+
// No deeplink possible
|
|
461
|
+
return {};
|
|
462
|
+
}
|
|
463
|
+
|
|
410
464
|
// Load the contexts
|
|
411
465
|
const allContexts = await this._requestObjectsFromParameters(startupPages, oModel);
|
|
412
466
|
if (allContexts.length) {
|