@sapui5/sap.fe.base 1.125.0 → 1.126.1

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.
@@ -2,10 +2,13 @@
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/fe/core/helpers/BindingToolkit"], function (BindingToolkit) {
5
+ sap.ui.define(["sap/fe/base/BindingToolkit"], function (BindingToolkit) {
6
6
  "use strict";
7
7
 
8
- var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
8
+ var compileExpression = BindingToolkit.compileExpression;
9
+ function isBindingToolkitExpression(expression) {
10
+ return (expression === null || expression === void 0 ? void 0 : expression._type) !== undefined;
11
+ }
9
12
  const writeChildren = function (val) {
10
13
  if (Array.isArray(val)) {
11
14
  return val.join("");
@@ -48,6 +51,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
48
51
  return !!(children !== null && children !== void 0 && children.getMetadata);
49
52
  };
50
53
  const FL_DELEGATE = "fl:delegate";
54
+ const DT_DESIGNTIME = "dt:designtime";
51
55
  const CORE_REQUIRE = "core:require";
52
56
  const LOG_SOURCEPATH = "log:sourcePath";
53
57
  const CUSTOM_LOADVALUE = "customData:loadValue";
@@ -60,18 +64,27 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
60
64
  const childValue = childrenObject[subPropName];
61
65
  if (childValue !== undefined) {
62
66
  if (typeof childValue === "object") {
63
- // if the property is a value it needs to be serialized as a children
64
- // <myObjectProp prop1='xxx', prop2='xxt'/>
65
- aggregationChildren.push(processObjectPropertyValue(childValue, namespaceAlias, subPropName));
67
+ if (Array.isArray(childValue)) {
68
+ aggregationChildren.push(`<${subPropName}>`);
69
+ for (const childrenObjectElement of childValue) {
70
+ aggregationChildren.push(processObjectPropertyValue(childrenObjectElement, namespaceAlias, subPropName));
71
+ }
72
+ aggregationChildren.push(`</${subPropName}>`);
73
+ } else {
74
+ // if the property is a value it needs to be serialized as a children
75
+ // <myObjectProp prop1='xxx', prop2='xxt'/>
76
+ aggregationChildren.push(processObjectPropertyValue(childValue, namespaceAlias, subPropName));
77
+ }
66
78
  } else {
67
79
  // Otherwise it's part of the main object just as another property
68
80
  aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
69
81
  }
70
82
  }
71
83
  });
72
- return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespaceAlias}:${propertyName}>`;
84
+ const namespacedProperty = namespaceAlias ? `${namespaceAlias}:${propertyName}` : propertyName;
85
+ return `<${namespacedProperty} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespacedProperty}>`;
73
86
  }
74
- function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString) {
87
+ function processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl) {
75
88
  Object.keys(metadataProperties).forEach(propertyName => {
76
89
  var _mSettings$children, _mSettings$children2;
77
90
  if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
@@ -79,6 +92,12 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
79
92
  if (propertyName === CORE_REQUIRE) {
80
93
  propertiesString.push(`xmlns:core="sap.ui.core"`);
81
94
  }
95
+ if (propertyName === FL_DELEGATE) {
96
+ propertiesString.push(`xmlns:fl="sap.ui.fl"`);
97
+ }
98
+ if (propertyName === DT_DESIGNTIME) {
99
+ propertiesString.push(`xmlns:dt="sap.ui.dt"`);
100
+ }
82
101
  if (propertyName === LOG_SOURCEPATH) {
83
102
  propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
84
103
  }
@@ -88,23 +107,20 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
88
107
  if (propertyValue && typeof propertyValue === "object") {
89
108
  if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
90
109
  propertiesString.push(`${propertyName}='${propertyValue.getPath()}'`);
91
- } else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
92
- propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
110
+ } else if (isBindingToolkitExpression(propertyValue)) {
111
+ propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(compileExpression(propertyValue))}'`);
93
112
  } else if (Array.isArray(propertyValue)) {
94
113
  if (propertyValue.length === 1) {
95
- propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
114
+ const outValue = typeof propertyValue[0] === "string" ? propertyValue[0] : JSON.stringify(propertyValue[0]);
115
+ propertiesString.push(`${propertyName}='${outValue}'`);
96
116
  } else {
97
- propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
117
+ const outValue = propertyValue.every(val => typeof val === "string") ? propertyValue.join(" ") : JSON.stringify(propertyValue);
118
+ propertiesString.push(`${propertyName}='${outValue}'`);
98
119
  }
120
+ } else if (isControl) {
121
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
99
122
  } else {
100
- const complexProperty = [];
101
- const propertyValueObj = propertyValue;
102
- Object.keys(propertyValueObj).forEach(subPropName => {
103
- if (propertyValueObj[subPropName] !== undefined) {
104
- complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
105
- }
106
- });
107
- aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
123
+ aggregationString.push(processObjectPropertyValue(propertyValue, undefined, propertyName));
108
124
  }
109
125
  } else {
110
126
  const prop = mSettings[propertyName];
@@ -118,6 +134,27 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
118
134
  }
119
135
  });
120
136
  }
137
+
138
+ /**
139
+ * Processes the command.
140
+ *
141
+ * Resolves the command set on the control via the intrinsic class attribute "jsx:command".
142
+ * If no command has been set or the targeted event doesn't exist, no configuration is set.
143
+ *
144
+ * @param settings Metadata of the control
145
+ * @param metadataEvents Settings of the control
146
+ */
147
+ function processCommand(settings, metadataEvents) {
148
+ const commandProperty = settings["jsx:command"];
149
+ if (commandProperty) {
150
+ const [command, eventName] = commandProperty.split("|");
151
+ const event = metadataEvents[eventName];
152
+ if (event && command.startsWith("cmd:")) {
153
+ settings[event.name] = command;
154
+ }
155
+ }
156
+ delete settings["jsx:command"];
157
+ }
121
158
  function processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString) {
122
159
  const aggregationChildren = {};
123
160
  addChildAggregation(aggregationChildren, defaultAggregationName ?? "customData", mSettings.children);
@@ -150,9 +187,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
150
187
  const jsxXml = function (type, mSettings, key, xmlNamespaceMap, overrideNodeName) {
151
188
  let metadata;
152
189
  let metadataProperties;
190
+ let metadataEvents;
153
191
  let controlName;
154
192
  let metadataAggregations;
155
193
  let defaultAggregationName;
194
+ let isControl = false;
156
195
  if (isAControl(type)) {
157
196
  metadata = type.getMetadata();
158
197
  metadataProperties = metadata.getAllProperties();
@@ -161,9 +200,11 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
161
200
  ...metadata.getAllEvents(),
162
201
  ...metadata.getAllAssociations()
163
202
  };
203
+ metadataEvents = metadata.getAllEvents();
164
204
  controlName = metadata.getName();
165
205
  metadataAggregations = metadata.getAllAggregations();
166
206
  defaultAggregationName = metadata.getDefaultAggregationName();
207
+ isControl = true;
167
208
  } else {
168
209
  metadata = type.metadata;
169
210
  metadataProperties = metadata.properties;
@@ -174,6 +215,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
174
215
  },
175
216
  ...metadata.aggregations
176
217
  };
218
+ metadataEvents = {};
177
219
  defaultAggregationName = metadata.defaultAggregation;
178
220
  controlName = metadata.namespace + "." + metadata.name;
179
221
  }
@@ -187,9 +229,15 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
187
229
  metadataProperties["id"] = {
188
230
  name: "id"
189
231
  };
232
+ metadataProperties["binding"] = {
233
+ name: "binding"
234
+ };
190
235
  metadataProperties[FL_DELEGATE] = {
191
236
  name: FL_DELEGATE
192
237
  };
238
+ metadataProperties[DT_DESIGNTIME] = {
239
+ name: DT_DESIGNTIME
240
+ };
193
241
  metadataProperties[CORE_REQUIRE] = {
194
242
  name: CORE_REQUIRE
195
243
  };
@@ -205,6 +253,9 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
205
253
  metadataProperties["xmlns:fl"] = {
206
254
  name: FL_DELEGATE
207
255
  };
256
+ metadataProperties["xmlns:dt"] = {
257
+ name: DT_DESIGNTIME
258
+ };
208
259
  metadataProperties["xmlns:core"] = {
209
260
  name: CORE_REQUIRE
210
261
  };
@@ -225,7 +276,8 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
225
276
  let tagName = `${namespaceAlias}:${name}`;
226
277
  const propertiesString = [];
227
278
  const aggregationString = [];
228
- processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
279
+ processCommand(mSettings, metadataEvents);
280
+ processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl);
229
281
  processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
230
282
  if (overrideNodeName) {
231
283
  tagName = overrideNodeName;
@@ -234,4 +286,4 @@ sap.ui.define(["sap/fe/core/helpers/BindingToolkit"], function (BindingToolkit)
234
286
  };
235
287
  return jsxXml;
236
288
  }, false);
237
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3cml0ZUNoaWxkcmVuIiwidmFsIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsdWUiLCJyZXBsYWNlIiwiYWRkQ2hpbGRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ2hpbGRyZW4iLCJhZ2dyZWdhdGlvbk5hbWUiLCJjaGlsZCIsInVuZGVmaW5lZCIsInRyaW0iLCJsZW5ndGgiLCJwdXNoIiwiZm9yRWFjaCIsInN1YkNoaWxkIiwiY2hpbGRLZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBQ29udHJvbCIsImNoaWxkcmVuIiwiZ2V0TWV0YWRhdGEiLCJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJ0b1N0cmluZyIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb21wbGV4UHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlT2JqIiwicHJvcCIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YUFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJhZ2dyZWdhdGlvbkNoaWxkS2V5cyIsIndyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiIsImpzeFhtbCIsImtleSIsInhtbE5hbWVzcGFjZU1hcCIsIm92ZXJyaWRlTm9kZU5hbWUiLCJtZXRhZGF0YSIsImNvbnRyb2xOYW1lIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldEFsbEV2ZW50cyIsImdldEFsbEFzc29jaWF0aW9ucyIsImdldE5hbWUiLCJnZXRBbGxBZ2dyZWdhdGlvbnMiLCJnZXREZWZhdWx0QWdncmVnYXRpb25OYW1lIiwicHJvcGVydGllcyIsImRlcGVuZGVudHMiLCJjdXN0b21EYXRhIiwiYWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwibmFtZXNwYWNlIiwibmFtZSIsIm5hbWVzU3BsaXQiLCJzcGxpdCIsInNsaWNlIiwidGFnTmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LXhtbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB7IGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmNvbnN0IHdyaXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRyZXR1cm4gdmFsLmpvaW4oXCJcIik7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufTtcblxuLyoqXG4gKiBTb21lIGNoYXJhY3RlcnMgbmVlZHMgdG8gYmUgZXNjYXBlZCB3aGVuIHVzZWQgYXMgWE1MIGF0dHJpYnV0ZSB2YWx1ZSwgb3RoZXJ3aXNlIHRoaXMgcmVzdWx0IGluIGluY29ycmVjdCBYTUwuXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB4bWwgYXR0cmlidXRlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHZhbHVlPy5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKENvbnRyb2wgfCBzdHJpbmcpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoY2hpbGQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkS2V5IG9mIE9iamVjdC5rZXlzKGNoaWxkKSkge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgdHlwZW9mIENvbnRyb2wge1xuXHRyZXR1cm4gISEoY2hpbGRyZW4gYXMgdHlwZW9mIENvbnRyb2wpPy5nZXRNZXRhZGF0YTtcbn07XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IExPR19TT1VSQ0VQQVRIID0gXCJsb2c6c291cmNlUGF0aFwiO1xuY29uc3QgQ1VTVE9NX0xPQURWQUxVRSA9IFwiY3VzdG9tRGF0YTpsb2FkVmFsdWVcIjtcbmNvbnN0IENVU1RPTV9VUkwgPSBcImN1c3RvbURhdGE6dXJsXCI7XG5cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkcmVuT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZXNwYWNlQWxpYXM6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCBpc1xuXHRjb25zdCBhZ2dyZWdhdGlvblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IHN0cmluZ1tdID0gW107XG5cdE9iamVjdC5rZXlzKGNoaWxkcmVuT2JqZWN0KS5mb3JFYWNoKChzdWJQcm9wTmFtZSkgPT4ge1xuXHRcdGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZHJlbk9iamVjdFtzdWJQcm9wTmFtZV07XG5cdFx0aWYgKGNoaWxkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHZhbHVlIGl0IG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYSBjaGlsZHJlblxuXHRcdFx0XHQvLyA8bXlPYmplY3RQcm9wIHByb3AxPSd4eHgnLCBwcm9wMj0neHh0Jy8+XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIHBhcnQgb2YgdGhlIG1haW4gb2JqZWN0IGp1c3QgYXMgYW5vdGhlciBwcm9wZXJ0eVxuXHRcdFx0XHRhZ2dyZWdhdGlvblByb3BlcnRpZXMucHVzaChgJHtzdWJQcm9wTmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY2hpbGRWYWx1ZS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcblx0XHRcIlxcblwiXG5cdCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3Byb3BlcnR5TmFtZX0+YDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXM8VD4oXG5cdG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdFx0dHlwZT86IHN0cmluZztcblx0XHR9XG5cdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdHByb3BlcnRpZXNTdHJpbmc6IHN0cmluZ1tdLFxuXHRhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW11cbik6IHZvaWQge1xuXHRPYmplY3Qua2V5cyhtZXRhZGF0YVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDT1JFX1JFUVVJUkUpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gTE9HX1NPVVJDRVBBVEgpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGB4bWxuczpsb2c9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IENVU1RPTV9VUkwgfHwgcHJvcGVydHlOYW1lID09PSBDVVNUT01fTE9BRFZBTFVFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y3VzdG9tRGF0YT1cImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKG1ldGFkYXRhUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PSckeyhwcm9wZXJ0eVZhbHVlIGFzIENvbnRleHQpLmdldFBhdGgoKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkgfHwgcHJvcGVydHlOYW1lID09PSBcImRlbGVnYXRlXCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtKU09OLnN0cmluZ2lmeShtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydHlWYWx1ZSkpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pfSdgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW3Byb3BlcnR5TmFtZV0pfSdgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFByb3BlcnR5OiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVPYmogPSBwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMocHJvcGVydHlWYWx1ZU9iaikuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXhQcm9wZXJ0eS5wdXNoKGAke3N1YlByb3BOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wZXJ0eVZhbHVlT2JqW3N1YlByb3BOYW1lXS50b1N0cmluZygpKX0nYCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChgPCR7cHJvcGVydHlOYW1lfSAke2NvbXBsZXhQcm9wZXJ0eS5qb2luKFwiIFwiKX0vPmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcm9wID0gbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gYXMgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcjtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUocHJvcC50b1N0cmluZygpKX0nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG1TZXR0aW5ncy5jaGlsZHJlbj8uaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMoKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdID8/IHt9KS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHQvLyBPYmplY3QgLyBBcnJheSBwcm9wZXJ0aWVzIGFyZSBwYXJ0IG9mIHRoZSBgY2hpbGRyZW5gIGFnZ3JlZ2F0aW9uIGFuZCBhcyBzdWNoIHN0aWxsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHByb3BlcnRpZXNcblx0XHRcdGNvbnN0IGNoaWxkcmVuT2JqZWN0ID0gKG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sUHJvcGVydGllczxUPik/Lltwcm9wZXJ0eU5hbWVdIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgb2JqZWN0Pjtcblx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2gocHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3QsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0eU5hbWUpKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YUFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lID8/IFwiY3VzdG9tRGF0YVwiLCBtU2V0dGluZ3MuY2hpbGRyZW4gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzID0gT2JqZWN0LmtleXMoYWdncmVnYXRpb25DaGlsZHJlbik7XG5cdGxldCB3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSBmYWxzZTtcblx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRLZXlzLmxlbmd0aCA9PT0gMSAmJiBhZ2dyZWdhdGlvbkNoaWxkS2V5c1swXSA9PT0gZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdH1cblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkgJiYgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbk5hbWUgPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgJiYgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uKSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goYCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChcblx0XHRcdFx0XHRgPCR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5cblx0XHRcdFx0XHRcdCR7d3JpdGVDaGlsZHJlbihhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pfVxuXHRcdFx0XHRcdDwvJHtuYW1lc3BhY2VBbGlhc306JHthZ2dyZWdhdGlvbk5hbWV9PmBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7SlNPTi5zdHJpbmdpZnkobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0pfSdgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIHNvbWUgY2FzZSB0aGUgYWdncmVnYXRpb24gZXhwZWN0IGEgc3RyaW5nIHZhbHVlIChsaWtlIGZvciB0aGUgdG9vbHRpcCksIGluIHRoaXMgY2FzZSB3ZSBzZXQgaXQgZGlyZWN0bHkgYXMgYSBwcm9wZXJ0eVxuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7YWdncmVnYXRpb25OYW1lfT0nJHttU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXX0nYCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ2hpbGRyZW47XG59XG5cbmNvbnN0IGpzeFhtbCA9IGZ1bmN0aW9uIDxUPihcblx0dHlwZTogdHlwZW9mIENvbnRyb2wgfCB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlLFxuXHRtU2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYgeyBrZXk/OiBzdHJpbmc7IGNoaWxkcmVuPzogVUk1RWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+IH0sXG5cdGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHR4bWxOYW1lc3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdG92ZXJyaWRlTm9kZU5hbWU/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGxldCBtZXRhZGF0YTtcblx0bGV0IG1ldGFkYXRhUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgeyBuYW1lPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nIH0+O1xuXHRsZXQgY29udHJvbE5hbWU7XG5cdGxldCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucztcblx0bGV0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdGNvbnRyb2xOYW1lID0gbWV0YWRhdGEuZ2V0TmFtZSgpO1xuXHRcdG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0fSBlbHNlIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUubWV0YWRhdGE7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0gbWV0YWRhdGEucHJvcGVydGllcztcblx0XHRtZXRhZGF0YUFnZ3JlZ2F0aW9ucyA9IHsgLi4ueyBkZXBlbmRlbnRzOiB7fSwgY3VzdG9tRGF0YToge30gfSwgLi4ubWV0YWRhdGEuYWdncmVnYXRpb25zIH07XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NPUkVfUkVRVUlSRV0gPSB7IG5hbWU6IENPUkVfUkVRVUlSRSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbTE9HX1NPVVJDRVBBVEhdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbQ1VTVE9NX0xPQURWQUxVRV0gPSB7IG5hbWU6IENVU1RPTV9MT0FEVkFMVUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9VUkxdID0geyBuYW1lOiBDVVNUT01fVVJMIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmZsXCJdID0geyBuYW1lOiBGTF9ERUxFR0FURSB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpjb3JlXCJdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6bG9nXCJdID0geyBuYW1lOiBMT0dfU09VUkNFUEFUSCB9O1xuXHRpZiAoY29udHJvbE5hbWUgPT09IFwic2FwLnVpLmNvcmUuRnJhZ21lbnRcIikge1xuXHRcdG1ldGFkYXRhUHJvcGVydGllc1tcImZyYWdtZW50TmFtZVwiXSA9IHsgbmFtZTogXCJmcmFnbWVudE5hbWVcIiB9O1xuXHR9XG5cdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRsZXQgbmFtZXNwYWNlQWxpYXMgPSBuYW1lc3BhY2VbbmFtZXNwYWNlLmxlbmd0aCAtIDFdO1xuXHRpZiAoeG1sTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRuYW1lc3BhY2VBbGlhcyA9IHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildO1xuXHR9XG5cdGxldCB0YWdOYW1lID0gYCR7bmFtZXNwYWNlQWxpYXN9OiR7bmFtZX1gO1xuXHRjb25zdCBwcm9wZXJ0aWVzU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvblN0cmluZzogc3RyaW5nW10gPSBbXTtcblx0cHJvY2Vzc1Byb3BlcnRpZXMobVNldHRpbmdzLCBtZXRhZGF0YVByb3BlcnRpZXMsIG5hbWVzcGFjZUFsaWFzLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdHByb2Nlc3NBZ2dyZWdhdGlvbnMobVNldHRpbmdzLCBtZXRhZGF0YUFnZ3JlZ2F0aW9ucywgbmFtZXNwYWNlQWxpYXMsIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nKTtcblx0aWYgKG92ZXJyaWRlTm9kZU5hbWUpIHtcblx0XHR0YWdOYW1lID0gb3ZlcnJpZGVOb2RlTmFtZTtcblx0fVxuXHRyZXR1cm4gYDwke3RhZ05hbWV9IHhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lc3BhY2Uuam9pbihcIi5cIil9XCIgJHtwcm9wZXJ0aWVzU3RyaW5nLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uU3RyaW5nLmpvaW4oXG5cdFx0XCJcIlxuXHQpfTwvJHt0YWdOYW1lfT5gO1xufTtcbmV4cG9ydCBkZWZhdWx0IGpzeFhtbDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUFPQSxNQUFNQSxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJ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
289
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJfdHlwZSIsInVuZGVmaW5lZCIsIndyaXRlQ2hpbGRyZW4iLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsInJlcGxhY2UiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidHJpbSIsImxlbmd0aCIsInB1c2giLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJjaGlsZEtleSIsIk9iamVjdCIsImtleXMiLCJpc0FDb250cm9sIiwiY2hpbGRyZW4iLCJnZXRNZXRhZGF0YSIsIkZMX0RFTEVHQVRFIiwiRFRfREVTSUdOVElNRSIsIkNPUkVfUkVRVUlSRSIsIkxPR19TT1VSQ0VQQVRIIiwiQ1VTVE9NX0xPQURWQUxVRSIsIkNVU1RPTV9VUkwiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZSIsImNoaWxkcmVuT2JqZWN0IiwibmFtZXNwYWNlQWxpYXMiLCJwcm9wZXJ0eU5hbWUiLCJhZ2dyZWdhdGlvblByb3BlcnRpZXMiLCJzdWJQcm9wTmFtZSIsImNoaWxkVmFsdWUiLCJjaGlsZHJlbk9iamVjdEVsZW1lbnQiLCJ0b1N0cmluZyIsIm5hbWVzcGFjZWRQcm9wZXJ0eSIsInByb2Nlc3NQcm9wZXJ0aWVzIiwibVNldHRpbmdzIiwibWV0YWRhdGFQcm9wZXJ0aWVzIiwicHJvcGVydGllc1N0cmluZyIsImFnZ3JlZ2F0aW9uU3RyaW5nIiwiaXNDb250cm9sIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0eVZhbHVlIiwidHlwZSIsImdldFBhdGgiLCJjb21waWxlRXhwcmVzc2lvbiIsIm91dFZhbHVlIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZXJ5IiwicHJvcCIsInByb2Nlc3NDb21tYW5kIiwic2V0dGluZ3MiLCJtZXRhZGF0YUV2ZW50cyIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50Iiwic3RhcnRzV2l0aCIsIm5hbWUiLCJwcm9jZXNzQWdncmVnYXRpb25zIiwibWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJkZWZhdWx0QWdncmVnYXRpb25OYW1lIiwiYWdncmVnYXRpb25DaGlsZEtleXMiLCJ3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24iLCJqc3hYbWwiLCJrZXkiLCJ4bWxOYW1lc3BhY2VNYXAiLCJvdmVycmlkZU5vZGVOYW1lIiwibWV0YWRhdGEiLCJjb250cm9sTmFtZSIsImdldEFsbFByb3BlcnRpZXMiLCJnZXRBbGxFdmVudHMiLCJnZXRBbGxBc3NvY2lhdGlvbnMiLCJnZXROYW1lIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsInByb3BlcnRpZXMiLCJkZXBlbmRlbnRzIiwiY3VzdG9tRGF0YSIsImFnZ3JlZ2F0aW9ucyIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsIm5hbWVzcGFjZSIsIm5hbWVzU3BsaXQiLCJzbGljZSIsInRhZ05hbWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImpzeC14bWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBOb25Db250cm9sUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbmZ1bmN0aW9uIGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKFxuXHRleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4gfCB1bmtub3duXG4pOiBleHByZXNzaW9uIGlzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB7XG5cdHJldHVybiAoZXhwcmVzc2lvbiBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj4pPy5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCB3cml0ZUNoaWxkcmVuID0gZnVuY3Rpb24gKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcge1xuXHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0cmV0dXJuIHZhbC5qb2luKFwiXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cbn07XG5cbi8qKlxuICogU29tZSBjaGFyYWN0ZXJzIG5lZWRzIHRvIGJlIGVzY2FwZWQgd2hlbiB1c2VkIGFzIFhNTCBhdHRyaWJ1dGUgdmFsdWUsIG90aGVyd2lzZSB0aGlzIHJlc3VsdCBpbiBpbmNvcnJlY3QgWE1MLlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgeG1sIGF0dHJpYnV0ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB2YWx1ZT8ucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImYXBvcztcIik7XG59XG5cbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChDb250cm9sIHwgc3RyaW5nKVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0aWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKCFhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBbXTtcblx0fVxuXHRpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKGNoaWxkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG5cdFx0Y2hpbGQuZm9yRWFjaCgoc3ViQ2hpbGQpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgYWdncmVnYXRpb25OYW1lLCBzdWJDaGlsZCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZEtleSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgY2hpbGRLZXksIGNoaWxkW2NoaWxkS2V5XSk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBpc0FDb250cm9sID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdHlwZW9mIENvbnRyb2wgfCBGdW5jdGlvbik6IGNoaWxkcmVuIGlzIHR5cGVvZiBDb250cm9sIHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5jb25zdCBGTF9ERUxFR0FURSA9IFwiZmw6ZGVsZWdhdGVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IENPUkVfUkVRVUlSRSA9IFwiY29yZTpyZXF1aXJlXCI7XG5jb25zdCBMT0dfU09VUkNFUEFUSCA9IFwibG9nOnNvdXJjZVBhdGhcIjtcbmNvbnN0IENVU1RPTV9MT0FEVkFMVUUgPSBcImN1c3RvbURhdGE6bG9hZFZhbHVlXCI7XG5jb25zdCBDVVNUT01fVVJMID0gXCJjdXN0b21EYXRhOnVybFwiO1xuXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShcblx0Y2hpbGRyZW5PYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRuYW1lc3BhY2VBbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcblx0Ly8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpbGQgaXNcblx0Y29uc3QgYWdncmVnYXRpb25Qcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkcmVuOiBzdHJpbmdbXSA9IFtdO1xuXHRPYmplY3Qua2V5cyhjaGlsZHJlbk9iamVjdCkuZm9yRWFjaCgoc3ViUHJvcE5hbWUpID0+IHtcblx0XHRjb25zdCBjaGlsZFZhbHVlID0gY2hpbGRyZW5PYmplY3Rbc3ViUHJvcE5hbWVdO1xuXHRcdGlmIChjaGlsZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZFZhbHVlKSkge1xuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChgPCR7c3ViUHJvcE5hbWV9PmApO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRyZW5PYmplY3RFbGVtZW50IG9mIGNoaWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5VmFsdWUoY2hpbGRyZW5PYmplY3RFbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lc3BhY2VBbGlhcywgc3ViUHJvcE5hbWUpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuLnB1c2goYDwvJHtzdWJQcm9wTmFtZX0+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlIHByb3BlcnR5IGlzIGEgdmFsdWUgaXQgbmVlZHMgdG8gYmUgc2VyaWFsaXplZCBhcyBhIGNoaWxkcmVuXG5cdFx0XHRcdFx0Ly8gPG15T2JqZWN0UHJvcCBwcm9wMT0neHh4JywgcHJvcDI9J3h4dCcvPlxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW4ucHVzaChcblx0XHRcdFx0XHRcdHByb2Nlc3NPYmplY3RQcm9wZXJ0eVZhbHVlKGNoaWxkVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWVzcGFjZUFsaWFzLCBzdWJQcm9wTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBPdGhlcndpc2UgaXQncyBwYXJ0IG9mIHRoZSBtYWluIG9iamVjdCBqdXN0IGFzIGFub3RoZXIgcHJvcGVydHlcblx0XHRcdFx0YWdncmVnYXRpb25Qcm9wZXJ0aWVzLnB1c2goYCR7c3ViUHJvcE5hbWV9PScke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNoaWxkVmFsdWUudG9TdHJpbmcoKSl9J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgbmFtZXNwYWNlZFByb3BlcnR5ID0gbmFtZXNwYWNlQWxpYXMgPyBgJHtuYW1lc3BhY2VBbGlhc306JHtwcm9wZXJ0eU5hbWV9YCA6IHByb3BlcnR5TmFtZTtcblx0cmV0dXJuIGA8JHtuYW1lc3BhY2VkUHJvcGVydHl9ICR7YWdncmVnYXRpb25Qcm9wZXJ0aWVzLmpvaW4oXCIgXCIpfT4ke2FnZ3JlZ2F0aW9uQ2hpbGRyZW4uam9pbihcIlxcblwiKX08LyR7bmFtZXNwYWNlZFByb3BlcnR5fT5gO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllczxUPihcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFQcm9wZXJ0aWVzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0Pixcblx0bmFtZXNwYWNlQWxpYXM6IHN0cmluZyxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXSxcblx0aXNDb250cm9sOiBib29sZWFuXG4pOiB2b2lkIHtcblx0T2JqZWN0LmtleXMobWV0YWRhdGFQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkgJiYgbVNldHRpbmdzW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gQ09SRV9SRVFVSVJFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IEZMX0RFTEVHQVRFKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6Zmw9XCJzYXAudWkuZmxcImApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gRFRfREVTSUdOVElNRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmR0PVwic2FwLnVpLmR0XCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IExPR19TT1VSQ0VQQVRIKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgeG1sbnM6bG9nPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiYCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lID09PSBDVVNUT01fVVJMIHx8IHByb3BlcnR5TmFtZSA9PT0gQ1VTVE9NX0xPQURWQUxVRSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCJgKTtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChtZXRhZGF0YVByb3BlcnRpZXNbcHJvcGVydHlOYW1lXS50eXBlID09PSBcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHsocHJvcGVydHlWYWx1ZSBhcyBDb250ZXh0KS5nZXRQYXRoKCl9J2ApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7ZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZUV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZSkpfSdgKTtcblx0XHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlWzBdID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZVswXSA6IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWVbMF0pO1xuXHRcdFx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke3Byb3BlcnR5TmFtZX09JyR7b3V0VmFsdWV9J2ApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvdXRWYWx1ZSA9IHByb3BlcnR5VmFsdWUuZXZlcnkoKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdFx0PyBwcm9wZXJ0eVZhbHVlLmpvaW4oXCIgXCIpXG5cdFx0XHRcdFx0XHRcdDogSlNPTi5zdHJpbmdpZnkocHJvcGVydHlWYWx1ZSk7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtvdXRWYWx1ZX0nYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ29udHJvbCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHtwcm9wZXJ0eU5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1twcm9wZXJ0eU5hbWVdKX0nYCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHVuZGVmaW5lZCwgcHJvcGVydHlOYW1lKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHByb3AgPSBtU2V0dGluZ3NbcHJvcGVydHlOYW1lXSBhcyBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyO1xuXHRcdFx0XHRwcm9wZXJ0aWVzU3RyaW5nLnB1c2goYCR7cHJvcGVydHlOYW1lfT0nJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShwcm9wLnRvU3RyaW5nKCkpfSdgKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bVNldHRpbmdzLmNoaWxkcmVuPy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmXG5cdFx0XHRPYmplY3Qua2V5cygobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gPz8ge30pLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdC8vIE9iamVjdCAvIEFycmF5IHByb3BlcnRpZXMgYXJlIHBhcnQgb2YgdGhlIGBjaGlsZHJlbmAgYWdncmVnYXRpb24gYW5kIGFzIHN1Y2ggc3RpbGwgbmVlZCB0byBiZSBwcm9jZXNzZWQgYXMgcHJvcGVydGllc1xuXHRcdFx0Y29uc3QgY2hpbGRyZW5PYmplY3QgPSAobVNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2xQcm9wZXJ0aWVzPFQ+KT8uW3Byb3BlcnR5TmFtZV0gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuXHRcdFx0YWdncmVnYXRpb25TdHJpbmcucHVzaChwcm9jZXNzT2JqZWN0UHJvcGVydHlWYWx1ZShjaGlsZHJlbk9iamVjdCwgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnR5TmFtZSkpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIG1ldGFkYXRhRXZlbnRzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdG5hbWU6IHN0cmluZztcblx0XHR9XG5cdD5cbik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGFFdmVudHNbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBjb21tYW5kO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhcblx0bVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0bWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4sXG5cdG5hbWVzcGFjZUFsaWFzOiBzdHJpbmcsXG5cdGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0cHJvcGVydGllc1N0cmluZzogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uU3RyaW5nOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA/PyBcImN1c3RvbURhdGFcIiwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkNoaWxkS2V5cyA9IE9iamVjdC5rZXlzKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4pO1xuXHRsZXQgd3JpdGVPbmx5RGVmYXVsdEFnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdGlmIChhZ2dyZWdhdGlvbkNoaWxkS2V5cy5sZW5ndGggPT09IDEgJiYgYWdncmVnYXRpb25DaGlsZEtleXNbMF0gPT09IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHR3cml0ZU9ubHlEZWZhdWx0QWdncmVnYXRpb24gPSB0cnVlO1xuXHR9XG5cdE9iamVjdC5rZXlzKG1ldGFkYXRhQWdncmVnYXRpb25zKS5mb3JFYWNoKChhZ2dyZWdhdGlvbk5hbWUpID0+IHtcblx0XHRpZiAoYWdncmVnYXRpb25DaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpICYmIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25OYW1lID09PSBkZWZhdWx0QWdncmVnYXRpb25OYW1lICYmIHdyaXRlT25seURlZmF1bHRBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRhZ2dyZWdhdGlvblN0cmluZy5wdXNoKGAke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFnZ3JlZ2F0aW9uU3RyaW5nLnB1c2goXG5cdFx0XHRcdFx0YDwke25hbWVzcGFjZUFsaWFzfToke2FnZ3JlZ2F0aW9uTmFtZX0+XG5cdFx0XHRcdFx0XHQke3dyaXRlQ2hpbGRyZW4oYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKX1cblx0XHRcdFx0XHQ8LyR7bmFtZXNwYWNlQWxpYXN9OiR7YWdncmVnYXRpb25OYW1lfT5gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChtU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYWdncmVnYXRpb25OYW1lKSAmJiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNTdHJpbmcucHVzaChgJHthZ2dyZWdhdGlvbk5hbWV9PScke0pTT04uc3RyaW5naWZ5KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdKX0nYCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBzb21lIGNhc2UgdGhlIGFnZ3JlZ2F0aW9uIGV4cGVjdCBhIHN0cmluZyB2YWx1ZSAobGlrZSBmb3IgdGhlIHRvb2x0aXApLCBpbiB0aGlzIGNhc2Ugd2Ugc2V0IGl0IGRpcmVjdGx5IGFzIGEgcHJvcGVydHlcblx0XHRcdFx0cHJvcGVydGllc1N0cmluZy5wdXNoKGAke2FnZ3JlZ2F0aW9uTmFtZX09JyR7bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV19J2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBhZ2dyZWdhdGlvbkNoaWxkcmVuO1xufVxuXG5jb25zdCBqc3hYbWwgPSBmdW5jdGlvbiA8VD4oXG5cdHR5cGU6IHR5cGVvZiBDb250cm9sIHwgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSxcblx0bVNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHsga2V5Pzogc3RyaW5nOyBjaGlsZHJlbj86IFVJNUVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPiB9LFxuXHRrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0eG1sTmFtZXNwYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuXHRvdmVycmlkZU5vZGVOYW1lPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuXHRsZXQgbWV0YWRhdGE7XG5cdGxldCBtZXRhZGF0YVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHsgbmFtZT86IHN0cmluZzsgdHlwZT86IHN0cmluZyB9Pjtcblx0bGV0IG1ldGFkYXRhRXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IG5hbWU6IHN0cmluZyB9Pjtcblx0bGV0IGNvbnRyb2xOYW1lO1xuXHRsZXQgbWV0YWRhdGFBZ2dyZWdhdGlvbnM7XG5cdGxldCBkZWZhdWx0QWdncmVnYXRpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBpc0NvbnRyb2wgPSBmYWxzZTtcblx0aWYgKGlzQUNvbnRyb2wodHlwZSkpIHtcblx0XHRtZXRhZGF0YSA9IHR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdFx0bWV0YWRhdGFQcm9wZXJ0aWVzID0geyAuLi5tZXRhZGF0YVByb3BlcnRpZXMsIC4uLm1ldGFkYXRhLmdldEFsbEV2ZW50cygpLCAuLi5tZXRhZGF0YS5nZXRBbGxBc3NvY2lhdGlvbnMoKSB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCk7XG5cdFx0Y29udHJvbE5hbWUgPSBtZXRhZGF0YS5nZXROYW1lKCk7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0XHRkZWZhdWx0QWdncmVnYXRpb25OYW1lID0gbWV0YWRhdGEuZ2V0RGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSgpO1xuXHRcdGlzQ29udHJvbCA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0bWV0YWRhdGEgPSB0eXBlLm1ldGFkYXRhO1xuXHRcdG1ldGFkYXRhUHJvcGVydGllcyA9IG1ldGFkYXRhLnByb3BlcnRpZXM7XG5cdFx0bWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSB7IC4uLnsgZGVwZW5kZW50czoge30sIGN1c3RvbURhdGE6IHt9IH0sIC4uLm1ldGFkYXRhLmFnZ3JlZ2F0aW9ucyB9O1xuXHRcdG1ldGFkYXRhRXZlbnRzID0ge307XG5cdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRjb250cm9sTmFtZSA9IG1ldGFkYXRhLm5hbWVzcGFjZSArIFwiLlwiICsgbWV0YWRhdGEubmFtZTtcblx0fVxuXHRjb25zdCBuYW1lc1NwbGl0ID0gY29udHJvbE5hbWUuc3BsaXQoXCIuXCIpO1xuXHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRtU2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdH1cblxuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJjbGFzc1wiXSA9IHsgbmFtZTogXCJjbGFzc1wiIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcImlkXCJdID0geyBuYW1lOiBcImlkXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wiYmluZGluZ1wiXSA9IHsgbmFtZTogXCJiaW5kaW5nXCIgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0ZMX0RFTEVHQVRFXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0RUX0RFU0lHTlRJTUVdID0geyBuYW1lOiBEVF9ERVNJR05USU1FIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDT1JFX1JFUVVJUkVdID0geyBuYW1lOiBDT1JFX1JFUVVJUkUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0xPR19TT1VSQ0VQQVRIXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW0NVU1RPTV9MT0FEVkFMVUVdID0geyBuYW1lOiBDVVNUT01fTE9BRFZBTFVFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tDVVNUT01fVVJMXSA9IHsgbmFtZTogQ1VTVE9NX1VSTCB9O1xuXHRtZXRhZGF0YVByb3BlcnRpZXNbXCJ4bWxuczpmbFwiXSA9IHsgbmFtZTogRkxfREVMRUdBVEUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6ZHRcIl0gPSB7IG5hbWU6IERUX0RFU0lHTlRJTUUgfTtcblx0bWV0YWRhdGFQcm9wZXJ0aWVzW1wieG1sbnM6Y29yZVwiXSA9IHsgbmFtZTogQ09SRV9SRVFVSVJFIH07XG5cdG1ldGFkYXRhUHJvcGVydGllc1tcInhtbG5zOmxvZ1wiXSA9IHsgbmFtZTogTE9HX1NPVVJDRVBBVEggfTtcblx0aWYgKGNvbnRyb2xOYW1lID09PSBcInNhcC51aS5jb3JlLkZyYWdtZW50XCIpIHtcblx0XHRtZXRhZGF0YVByb3BlcnRpZXNbXCJmcmFnbWVudE5hbWVcIl0gPSB7IG5hbWU6IFwiZnJhZ21lbnROYW1lXCIgfTtcblx0fVxuXHRjb25zdCBuYW1lc3BhY2UgPSBuYW1lc1NwbGl0LnNsaWNlKDAsIC0xKTtcblx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0aWYgKHhtbE5hbWVzcGFjZU1hcFtuYW1lc3BhY2Uuam9pbihcIi5cIildKSB7XG5cdFx0bmFtZXNwYWNlQWxpYXMgPSB4bWxOYW1lc3BhY2VNYXBbbmFtZXNwYWNlLmpvaW4oXCIuXCIpXTtcblx0fVxuXHRsZXQgdGFnTmFtZSA9IGAke25hbWVzcGFjZUFsaWFzfToke25hbWV9YDtcblx0Y29uc3QgcHJvcGVydGllc1N0cmluZzogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25TdHJpbmc6IHN0cmluZ1tdID0gW107XG5cdHByb2Nlc3NDb21tYW5kKG1TZXR0aW5ncywgbWV0YWRhdGFFdmVudHMpO1xuXHRwcm9jZXNzUHJvcGVydGllcyhtU2V0dGluZ3MsIG1ldGFkYXRhUHJvcGVydGllcywgbmFtZXNwYWNlQWxpYXMsIHByb3BlcnRpZXNTdHJpbmcsIGFnZ3JlZ2F0aW9uU3RyaW5nLCBpc0NvbnRyb2wpO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zKG1TZXR0aW5ncywgbWV0YWRhdGFBZ2dyZWdhdGlvbnMsIG5hbWVzcGFjZUFsaWFzLCBkZWZhdWx0QWdncmVnYXRpb25OYW1lLCBwcm9wZXJ0aWVzU3RyaW5nLCBhZ2dyZWdhdGlvblN0cmluZyk7XG5cdGlmIChvdmVycmlkZU5vZGVOYW1lKSB7XG5cdFx0dGFnTmFtZSA9IG92ZXJyaWRlTm9kZU5hbWU7XG5cdH1cblx0cmV0dXJuIGA8JHt0YWdOYW1lfSB4bWxuczoke25hbWVzcGFjZUFsaWFzfT1cIiR7bmFtZXNwYWNlLmpvaW4oXCIuXCIpfVwiICR7cHJvcGVydGllc1N0cmluZy5qb2luKFwiIFwiKX0+JHthZ2dyZWdhdGlvblN0cmluZy5qb2luKFxuXHRcdFwiXCJcblx0KX08LyR7dGFnTmFtZX0+YDtcbn07XG5leHBvcnQgZGVmYXVsdCBqc3hYbWw7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7O0VBUUEsU0FBU0EsMEJBQTBCLENBQ2xDQyxVQUF1RCxFQUNMO0lBQ2xELE9BQU8sQ0FBQ0EsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQXdDQyxLQUFLLE1BQUtDLFNBQVM7RUFDOUU7RUFFQSxNQUFNQyxhQUFhLEdBQUcsVUFBVUMsR0FBc0IsRUFBVTtJQUMvRCxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDLEVBQUU7TUFDdkIsT0FBT0EsR0FBRyxDQUFDRyxJQUFJLENB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
@@ -1,10 +1,17 @@
1
+ import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
2
+ import { compileExpression } from "sap/fe/base/BindingToolkit";
1
3
  import type { ControlProperties, NonControlProperties } from "sap/fe/base/jsx-runtime/jsx";
2
4
  import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
3
- import { isBindingToolkitExpression } from "sap/fe/core/helpers/BindingToolkit";
4
5
  import type Control from "sap/ui/core/Control";
5
6
  import type UI5Element from "sap/ui/core/Element";
6
7
  import type Context from "sap/ui/model/Context";
7
8
 
9
+ function isBindingToolkitExpression(
10
+ expression: BindingToolkitExpression<unknown> | unknown
11
+ ): expression is BindingToolkitExpression<unknown> {
12
+ return (expression as BindingToolkitExpression<unknown>)?._type !== undefined;
13
+ }
14
+
8
15
  const writeChildren = function (val: string | string[]): string {
9
16
  if (Array.isArray(val)) {
10
17
  return val.join("");
@@ -54,12 +61,17 @@ const isAControl = function (children?: typeof Control | Function): children is
54
61
  };
55
62
 
56
63
  const FL_DELEGATE = "fl:delegate";
64
+ const DT_DESIGNTIME = "dt:designtime";
57
65
  const CORE_REQUIRE = "core:require";
58
66
  const LOG_SOURCEPATH = "log:sourcePath";
59
67
  const CUSTOM_LOADVALUE = "customData:loadValue";
60
68
  const CUSTOM_URL = "customData:url";
61
69
 
62
- function processObjectPropertyValue(childrenObject: Record<string, unknown>, namespaceAlias: string, propertyName: string): string {
70
+ function processObjectPropertyValue(
71
+ childrenObject: Record<string, unknown>,
72
+ namespaceAlias: string | undefined,
73
+ propertyName: string
74
+ ): string {
63
75
  // This is called when the child is
64
76
  const aggregationProperties: string[] = [];
65
77
  const aggregationChildren: string[] = [];
@@ -67,18 +79,30 @@ function processObjectPropertyValue(childrenObject: Record<string, unknown>, nam
67
79
  const childValue = childrenObject[subPropName];
68
80
  if (childValue !== undefined) {
69
81
  if (typeof childValue === "object") {
70
- // if the property is a value it needs to be serialized as a children
71
- // <myObjectProp prop1='xxx', prop2='xxt'/>
72
- aggregationChildren.push(processObjectPropertyValue(childValue as Record<string, unknown>, namespaceAlias, subPropName));
82
+ if (Array.isArray(childValue)) {
83
+ aggregationChildren.push(`<${subPropName}>`);
84
+ for (const childrenObjectElement of childValue) {
85
+ aggregationChildren.push(
86
+ processObjectPropertyValue(childrenObjectElement as Record<string, unknown>, namespaceAlias, subPropName)
87
+ );
88
+ }
89
+ aggregationChildren.push(`</${subPropName}>`);
90
+ } else {
91
+ // if the property is a value it needs to be serialized as a children
92
+ // <myObjectProp prop1='xxx', prop2='xxt'/>
93
+ aggregationChildren.push(
94
+ processObjectPropertyValue(childValue as Record<string, unknown>, namespaceAlias, subPropName)
95
+ );
96
+ }
73
97
  } else {
74
98
  // Otherwise it's part of the main object just as another property
75
99
  aggregationProperties.push(`${subPropName}='${escapeXMLAttributeValue(childValue.toString())}'`);
76
100
  }
77
101
  }
78
102
  });
79
- return `<${namespaceAlias}:${propertyName} ${aggregationProperties.join(" ")}>${aggregationChildren.join(
80
- "\n"
81
- )}</${namespaceAlias}:${propertyName}>`;
103
+
104
+ const namespacedProperty = namespaceAlias ? `${namespaceAlias}:${propertyName}` : propertyName;
105
+ return `<${namespacedProperty} ${aggregationProperties.join(" ")}>${aggregationChildren.join("\n")}</${namespacedProperty}>`;
82
106
  }
83
107
 
84
108
  function processProperties<T>(
@@ -92,7 +116,8 @@ function processProperties<T>(
92
116
  >,
93
117
  namespaceAlias: string,
94
118
  propertiesString: string[],
95
- aggregationString: string[]
119
+ aggregationString: string[],
120
+ isControl: boolean
96
121
  ): void {
97
122
  Object.keys(metadataProperties).forEach((propertyName) => {
98
123
  if (mSettings.hasOwnProperty(propertyName) && mSettings[propertyName] !== undefined) {
@@ -100,6 +125,12 @@ function processProperties<T>(
100
125
  if (propertyName === CORE_REQUIRE) {
101
126
  propertiesString.push(`xmlns:core="sap.ui.core"`);
102
127
  }
128
+ if (propertyName === FL_DELEGATE) {
129
+ propertiesString.push(`xmlns:fl="sap.ui.fl"`);
130
+ }
131
+ if (propertyName === DT_DESIGNTIME) {
132
+ propertiesString.push(`xmlns:dt="sap.ui.dt"`);
133
+ }
103
134
  if (propertyName === LOG_SOURCEPATH) {
104
135
  propertiesString.push(`xmlns:log="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"`);
105
136
  }
@@ -109,23 +140,22 @@ function processProperties<T>(
109
140
  if (propertyValue && typeof propertyValue === "object") {
110
141
  if (metadataProperties[propertyName].type === "sap.ui.model.Context") {
111
142
  propertiesString.push(`${propertyName}='${(propertyValue as Context).getPath()}'`);
112
- } else if (isBindingToolkitExpression(propertyValue) || propertyName === "delegate") {
113
- propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
143
+ } else if (isBindingToolkitExpression(propertyValue)) {
144
+ propertiesString.push(`${propertyName}='${escapeXMLAttributeValue(compileExpression(propertyValue))}'`);
114
145
  } else if (Array.isArray(propertyValue)) {
115
146
  if (propertyValue.length === 1) {
116
- propertiesString.push(`${propertyName}='${JSON.stringify(propertyValue[0])}'`);
147
+ const outValue = typeof propertyValue[0] === "string" ? propertyValue[0] : JSON.stringify(propertyValue[0]);
148
+ propertiesString.push(`${propertyName}='${outValue}'`);
117
149
  } else {
118
- propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
150
+ const outValue = propertyValue.every((val) => typeof val === "string")
151
+ ? propertyValue.join(" ")
152
+ : JSON.stringify(propertyValue);
153
+ propertiesString.push(`${propertyName}='${outValue}'`);
119
154
  }
155
+ } else if (isControl) {
156
+ propertiesString.push(`${propertyName}='${JSON.stringify(mSettings[propertyName])}'`);
120
157
  } else {
121
- const complexProperty: string[] = [];
122
- const propertyValueObj = propertyValue as Record<string, string>;
123
- Object.keys(propertyValueObj).forEach((subPropName) => {
124
- if (propertyValueObj[subPropName] !== undefined) {
125
- complexProperty.push(`${subPropName}='${escapeXMLAttributeValue(propertyValueObj[subPropName].toString())}'`);
126
- }
127
- });
128
- aggregationString.push(`<${propertyName} ${complexProperty.join(" ")}/>`);
158
+ aggregationString.push(processObjectPropertyValue(propertyValue as Record<string, string>, undefined, propertyName));
129
159
  }
130
160
  } else {
131
161
  const prop = mSettings[propertyName] as string | boolean | number;
@@ -142,6 +172,35 @@ function processProperties<T>(
142
172
  });
143
173
  }
144
174
 
175
+ /**
176
+ * Processes the command.
177
+ *
178
+ * Resolves the command set on the control via the intrinsic class attribute "jsx:command".
179
+ * If no command has been set or the targeted event doesn't exist, no configuration is set.
180
+ *
181
+ * @param settings Metadata of the control
182
+ * @param metadataEvents Settings of the control
183
+ */
184
+ function processCommand(
185
+ settings: Record<string, unknown>,
186
+ metadataEvents: Record<
187
+ string,
188
+ {
189
+ name: string;
190
+ }
191
+ >
192
+ ): void {
193
+ const commandProperty = settings["jsx:command"];
194
+ if (commandProperty) {
195
+ const [command, eventName] = (commandProperty as string).split("|");
196
+ const event = metadataEvents[eventName];
197
+ if (event && command.startsWith("cmd:")) {
198
+ settings[event.name] = command;
199
+ }
200
+ }
201
+ delete settings["jsx:command"];
202
+ }
203
+
145
204
  function processAggregations(
146
205
  mSettings: Record<string, unknown>,
147
206
  metadataAggregations: Record<string, object>,
@@ -190,20 +249,25 @@ const jsxXml = function <T>(
190
249
  ): string {
191
250
  let metadata;
192
251
  let metadataProperties: Record<string, { name?: string; type?: string }>;
252
+ let metadataEvents: Record<string, { name: string }>;
193
253
  let controlName;
194
254
  let metadataAggregations;
195
255
  let defaultAggregationName: string | undefined;
256
+ let isControl = false;
196
257
  if (isAControl(type)) {
197
258
  metadata = type.getMetadata();
198
259
  metadataProperties = metadata.getAllProperties();
199
260
  metadataProperties = { ...metadataProperties, ...metadata.getAllEvents(), ...metadata.getAllAssociations() };
261
+ metadataEvents = metadata.getAllEvents();
200
262
  controlName = metadata.getName();
201
263
  metadataAggregations = metadata.getAllAggregations();
202
264
  defaultAggregationName = metadata.getDefaultAggregationName();
265
+ isControl = true;
203
266
  } else {
204
267
  metadata = type.metadata;
205
268
  metadataProperties = metadata.properties;
206
269
  metadataAggregations = { ...{ dependents: {}, customData: {} }, ...metadata.aggregations };
270
+ metadataEvents = {};
207
271
  defaultAggregationName = metadata.defaultAggregation;
208
272
  controlName = metadata.namespace + "." + metadata.name;
209
273
  }
@@ -214,12 +278,15 @@ const jsxXml = function <T>(
214
278
 
215
279
  metadataProperties["class"] = { name: "class" };
216
280
  metadataProperties["id"] = { name: "id" };
281
+ metadataProperties["binding"] = { name: "binding" };
217
282
  metadataProperties[FL_DELEGATE] = { name: FL_DELEGATE };
283
+ metadataProperties[DT_DESIGNTIME] = { name: DT_DESIGNTIME };
218
284
  metadataProperties[CORE_REQUIRE] = { name: CORE_REQUIRE };
219
285
  metadataProperties[LOG_SOURCEPATH] = { name: LOG_SOURCEPATH };
220
286
  metadataProperties[CUSTOM_LOADVALUE] = { name: CUSTOM_LOADVALUE };
221
287
  metadataProperties[CUSTOM_URL] = { name: CUSTOM_URL };
222
288
  metadataProperties["xmlns:fl"] = { name: FL_DELEGATE };
289
+ metadataProperties["xmlns:dt"] = { name: DT_DESIGNTIME };
223
290
  metadataProperties["xmlns:core"] = { name: CORE_REQUIRE };
224
291
  metadataProperties["xmlns:log"] = { name: LOG_SOURCEPATH };
225
292
  if (controlName === "sap.ui.core.Fragment") {
@@ -234,7 +301,8 @@ const jsxXml = function <T>(
234
301
  let tagName = `${namespaceAlias}:${name}`;
235
302
  const propertiesString: string[] = [];
236
303
  const aggregationString: string[] = [];
237
- processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString);
304
+ processCommand(mSettings, metadataEvents);
305
+ processProperties(mSettings, metadataProperties, namespaceAlias, propertiesString, aggregationString, isControl);
238
306
  processAggregations(mSettings, metadataAggregations, namespaceAlias, defaultAggregationName, propertiesString, aggregationString);
239
307
  if (overrideNodeName) {
240
308
  tagName = overrideNodeName;
@@ -22,7 +22,7 @@ sap.ui.define(["sap/ui/core/Lib"], function (Library) {
22
22
  controls: [],
23
23
  elements: [],
24
24
  // eslint-disable-next-line no-template-curly-in-string
25
- version: "1.125.0",
25
+ version: "1.126.1",
26
26
  noLibraryCSS: true
27
27
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
28
  });