@sapui5/sap.fe.test 1.96.0 → 1.97.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.96.0",
3
+ "version": "1.97.0",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "SAP SE (https://www.sap.com)",
@@ -17,8 +17,9 @@
17
17
  ],
18
18
  "devDependencies": {
19
19
  "@babel/cli": "^7.14.8",
20
- "@ui5/cli": "^2.10.0",
20
+ "@ui5/cli": "^2.14.0",
21
21
  "copyfiles": "2.2.0",
22
- "xpath": "0.0.27"
22
+ "xpath": "0.0.27",
23
+ "xml-formatter": "2.4.0"
23
24
  }
24
25
  }
@@ -6,7 +6,7 @@
6
6
  <copyright>SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.96.0</version>
9
+ <version>1.97.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -14,9 +14,6 @@ sap.ui.define(["sap/ui/test/OpaBuilder"], function(OpaBuilder) {
14
14
  .hasType("sap.m.OverflowToolbarButton")
15
15
  .hasProperties({ icon: "sap-icon://full-screen" })
16
16
  .description("Entering the FullScreen Button")
17
- .do(function(oButton) {
18
- oButton.fireHover();
19
- })
20
17
  .doPress()
21
18
  .execute();
22
19
  },
@@ -25,9 +22,6 @@ sap.ui.define(["sap/ui/test/OpaBuilder"], function(OpaBuilder) {
25
22
  .hasType("sap.m.OverflowToolbarButton")
26
23
  .hasProperties({ icon: "sap-icon://exit-full-screen" })
27
24
  .description("Exiting Full screen mode")
28
- .do(function(oButton) {
29
- oButton.fireHover();
30
- })
31
25
  .doPress()
32
26
  .execute();
33
27
  },
@@ -228,6 +228,17 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
228
228
  .execute();
229
229
  },
230
230
 
231
+ iExecutePopOverButtonByIcon: function(sIcon, sDescription) {
232
+ return OpaBuilder.create(this)
233
+ .viewId(null)
234
+ .hasType("sap.m.Button")
235
+ .hasProperties({ icon: "sap-icon://" + sIcon })
236
+ .isDialogElement()
237
+ .doPress()
238
+ .description(sDescription)
239
+ .execute();
240
+ },
241
+
231
242
  iExecutePopOverActionRename: function(sId) {
232
243
  return this.iExecutePopOverActionByIcon("edit", "Press rename on " + sId);
233
244
  },
@@ -261,7 +272,7 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
261
272
  },
262
273
 
263
274
  iSwitchToGroupViewInTheFilterBarDialog: function() {
264
- return this.iExecutePopOverActionByIcon("group-2", "Switch to grouped view in filter bar dialog");
275
+ return this.iExecutePopOverButtonByIcon("group-2", "Switch to grouped view in filter bar dialog");
265
276
  },
266
277
 
267
278
  iSelectExpandFiltersgroupInTheFilterBarDialog: function(sFiltersgroupName) {
@@ -629,11 +640,11 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
629
640
  },
630
641
 
631
642
  iSeeTheVariantManagementPopover: function() {
632
- return this.iSeeTheButtonByIcon("sap-icon://duplicate", "The Popover");
643
+ return this.iSeeTheMenuItemByIcon("sap-icon://duplicate", "The Popover");
633
644
  },
634
645
 
635
646
  iSeeTheRTAPopover: function() {
636
- return this.iSeeTheButtonByIcon("sap-icon://key-user-settings", "The RTAPopover");
647
+ return this.iSeeTheMenuItemByIcon("sap-icon://key-user-settings", "The RTAPopover");
637
648
  },
638
649
 
639
650
  iSeeTheRenameButton: function() {
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "xpath", "fs", "@sap/cds-compiler", "prettier", "sap/ui/base/BindingParser", "sap/ui/model/json/JSONModel", "sap/ui/core/InvisibleText", "sap/base/util/merge", "path", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory"], function (PhantomUtil, _MetadataRequestor, ODataMetaModel, XMLPreprocessor, Log, xpath, fs, cds_compiler, prettier, BindingParser, JSONModel, InvisibleText, merge, path, ConverterContext, SideEffectsFactory) {
5
+ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "xpath", "fs", "@sap/cds-compiler", "prettier", "sap/ui/base/BindingParser", "sap/ui/model/json/JSONModel", "sap/ui/core/InvisibleText", "sap/base/util/merge", "path", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel"], function (PhantomUtil, _MetadataRequestor, ODataMetaModel, XMLPreprocessor, Log, xpath, fs, cds_compiler, prettier, BindingParser, JSONModel, InvisibleText, merge, path, ConverterContext, SideEffectsFactory, TemplateModel) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -10,6 +10,78 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
10
10
  var to = cds_compiler.to;
11
11
  var compileSources = cds_compiler.compileSources;
12
12
 
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
14
+
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
+
19
+ /**
20
+ * Process the requested XML fragment with the provided data.
21
+ *
22
+ * @param {string} name Fully qualified name of the fragment to be tested.
23
+ * @param {object} testData Test data consisting
24
+ * @returns Tempalted fragment as string
25
+ */
26
+ var processFragment = function (name, testData) {
27
+ try {
28
+ var inputXml = "<root><core:Fragment fragmentName=\"".concat(name, "\" type=\"XML\" xmlns:core=\"sap.ui.core\" /></root>");
29
+ var parser = new window.DOMParser();
30
+ var inputDoc = parser.parseFromString(inputXml, "text/xml"); // build model and bindings for given test data
31
+
32
+ var settings = {
33
+ models: {},
34
+ bindingContexts: {}
35
+ };
36
+
37
+ for (var _model in testData) {
38
+ var jsonModel = new JSONModel();
39
+ jsonModel.setData(testData[_model]);
40
+ settings.models[_model] = jsonModel;
41
+ settings.bindingContexts[_model] = settings.models[_model].createBindingContext("/");
42
+ } // execute the pre-processor
43
+
44
+
45
+ return Promise.resolve(XMLPreprocessor.process(inputDoc.firstElementChild, {
46
+ name: name
47
+ }, settings)).then(function (resultDoc) {
48
+ // exclude nested fragments from test snapshots
49
+ var fragments = resultDoc.getElementsByTagName("core:Fragment");
50
+
51
+ if ((fragments === null || fragments === void 0 ? void 0 : fragments.length) > 0) {
52
+ var _iterator = _createForOfIteratorHelper(fragments),
53
+ _step;
54
+
55
+ try {
56
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
57
+ var fragment = _step.value;
58
+ fragment.innerHTML = "";
59
+ }
60
+ } catch (err) {
61
+ _iterator.e(err);
62
+ } finally {
63
+ _iterator.f();
64
+ }
65
+ }
66
+
67
+ return formatXml(resultDoc.innerHTML, {
68
+ filter: function (node) {
69
+ return node.type !== "Comment";
70
+ }
71
+ });
72
+ });
73
+ } catch (e) {
74
+ return Promise.reject(e);
75
+ }
76
+ };
77
+
78
+ _exports.processFragment = processFragment;
79
+
80
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
81
+ var formatXml = require("xml-formatter"); // eslint-disable-next-line @typescript-eslint/ban-ts-comment
82
+ // @ts-ignore
83
+
84
+
13
85
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
14
86
  jest.setTimeout(40000);
15
87
  var nameSpaceMap = {
@@ -257,13 +329,18 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
257
329
  var xmlDoc = parser.parseFromString(templatedXml, "text/xml"); // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
258
330
  // if not already passed to teh templating
259
331
 
260
- if (!mModels.hasOwnProperty("converterContext")) {
261
- mModels = Object.assign(mModels, {
262
- "converterContext": new JSONModel({})
263
- });
264
- }
265
-
266
332
  return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
333
+ if (!mModels.hasOwnProperty("converterContext")) {
334
+ mModels = Object.assign(mModels, {
335
+ "converterContext": new TemplateModel({}, oMetaModel)
336
+ });
337
+ }
338
+
339
+ Object.keys(mModels).forEach(function (sModelName) {
340
+ if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
341
+ mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
342
+ }
343
+ });
267
344
  var oPreprocessorSettings = {
268
345
  models: Object.assign({
269
346
  metaModel: oMetaModel
@@ -306,4 +383,4 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
306
383
  _exports.getTemplatedXML = getTemplatedXML;
307
384
  return _exports;
308
385
  }, false);
309
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsIlBoYW50b21VdGlsIiwicmVnaXN0ZXIiLCJ1bnJlZ2lzdGVyTWFjcm8iLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJuYW1lc3BhY2UiLCJuYW1lIiwicHVibGljTmFtZSIsInB1YmxpY05hbWVzcGFjZSIsInJ1blhQYXRoUXVlcnkiLCJzZWxlY3RvciIsInhtbGRvbSIsImV4cGVjdCIsImV4dGVuZCIsInRvSGF2ZUNvbnRyb2wiLCJub2RlcyIsIm1lc3NhZ2UiLCJvdXRwdXRYbWwiLCJzZXJpYWxpemVYTUwiLCJwYXNzIiwibGVuZ3RoIiwidG9Ob3RIYXZlQ29udHJvbCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJ4bWxTdHJpbmciLCJzZXJpYWxpemVUb1N0cmluZyIsInJlcGxhY2UiLCJmb3JtYXQiLCJwYXJzZXIiLCJjb21waWxlQ0RTIiwic0NEU1VybCIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiY3NuIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14Q29udGVudCIsInRvIiwiZWRteCIsInNlcnZpY2UiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImVkbXhVcmwiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsIm9NZXRhTW9kZWwiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJzTWV0YWRhdGFVcmwiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJ1bmRlZmluZWQiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJnZXRUZXh0IiwiZ2V0VGVtcGxhdGluZ1Jlc3VsdCIsInhtbElucHV0IiwibUJpbmRpbmdDb250ZXh0cyIsIm1Nb2RlbHMiLCJ0ZW1wbGF0ZWRYbWwiLCJET01QYXJzZXIiLCJ4bWxEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsImFzc2lnbiIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsImtleXMiLCJmb3JFYWNoIiwic0tleSIsImdldE9iamVjdCIsInRvQmVEZWZpbmVkIiwib01vZGVsIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwiZ2V0VGVtcGxhdGVkWE1MIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFvQkFBLEVBQUFBLEdBQUcsQ0FBQ0MsUUFBSixDQUFhLENBQWIsRUFBdUIsa0NBQXZCO0FBQ0FDLEVBQUFBLElBQUksQ0FBQ0MsVUFBTCxDQUFnQixLQUFoQjtBQUVBLE1BQU1DLFlBQVksR0FBRztBQUNwQixjQUFVLGVBRFU7QUFFcEIsYUFBUyxlQUZXO0FBR3BCLGlCQUFhLGtFQUhPO0FBSXBCLFdBQU8sa0VBSmE7QUFLcEIsZ0JBQVksMEVBTFE7QUFNcEIsZUFBVyxzQkFOUztBQU9wQixZQUFRLGFBUFk7QUFRcEIsU0FBSyxPQVJlO0FBU3BCLFNBQUssb0JBVGU7QUFVcEIsV0FBTyxZQVZhO0FBV3BCLGdCQUFZLGtCQVhRO0FBWXBCLFNBQUssZ0JBWmU7QUFhcEIsdUJBQW1CLDBCQWJDO0FBY3BCLGtCQUFjO0FBZE0sR0FBckI7QUFnQkEsTUFBTUMsTUFBTSxHQUFHQyxLQUFLLENBQUNDLGFBQU4sQ0FBb0JILFlBQXBCLENBQWY7O0FBRU8sTUFBTUks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QztBQUNBLFNBTkQsRUF0QkMsQ0E4QkQ7O0FBQ0EsWUFBSVQscUJBQXFCLENBQUNDLE1BQXRCLENBQTZCLE1BQTdCLENBQUosRUFBMEM7QUFDekNELFVBQUFBLHFCQUFxQixDQUFDRyxlQUF0QixDQUFzQyxNQUF0QyxJQUFnREgscUJBQXFCLENBQUNDLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDZCxvQkFBckMsQ0FBMEQsR0FBMUQsQ0FBaEQ7QUFDQTs7QUFFRCxlQUFPeEgsZUFBZSxDQUFDK0ksT0FBaEIsQ0FBd0JmLE1BQU0sQ0FBQ2dCLGlCQUEvQixFQUFtRDtBQUFFN0ksVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FBbkQsRUFBOEVrSSxxQkFBOUUsQ0FBUDtBQW5DQztBQW9DRCxLQXpDK0I7QUFBQTtBQUFBO0FBQUEsR0FBekI7Ozs7QUEyQ0EsTUFBTVksZUFBZSxhQUMzQnRCLFFBRDJCLEVBRTNCcEMsWUFGMkIsRUFHM0JxQyxnQkFIMkIsRUFJM0JDLE9BSjJCO0FBQUEsUUFLMUI7QUFBQSw2QkFDMEJILG1CQUFtQixDQUFDQyxRQUFELEVBQVdwQyxZQUFYLEVBQXlCcUMsZ0JBQXpCLEVBQTJDQyxPQUEzQyxDQUQ3QyxPQUVNOUcsWUFGTjtBQUdELEtBUjJCO0FBQUE7QUFBQTtBQUFBLEdBQXJCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaGFudG9tVXRpbCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zXCI7XG5pbXBvcnQgeyBfTWV0YWRhdGFSZXF1ZXN0b3IgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYlwiO1xuaW1wb3J0IHsgT0RhdGFNZXRhTW9kZWwgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0XCI7XG5pbXBvcnQgeyBYTUxQcmVwcm9jZXNzb3IgfSBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbFwiO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSBcInNhcC9iYXNlXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGNvbXBpbGVTb3VyY2VzLCB0byB9IGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBCaW5kaW5nUGFyc2VyIH0gZnJvbSBcInNhcC91aS9iYXNlXCI7XG5pbXBvcnQgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEpTT05Nb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvanNvblwiO1xuaW1wb3J0IHsgSW52aXNpYmxlVGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MsIE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwic2FwL2Jhc2UvdXRpbFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXAgPSB7XG5cdFwibWFjcm9zXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvZGF0YVwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJsb2dcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdFwidW5pdHRlc3RcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9wcmVwcm9jZXNzb3JleHRlbnNpb24vc2FwLmZlLnVuaXR0ZXN0aW5nLzFcIixcblx0XCJjb250cm9sXCI6IFwic2FwLmZlLmNvcmUuY29udHJvbHNcIixcblx0XCJjb3JlXCI6IFwic2FwLnVpLmNvcmVcIixcblx0XCJtXCI6IFwic2FwLm1cIixcblx0XCJmXCI6IFwic2FwLnVpLmxheW91dC5mb3JtXCIsXG5cdFwibWRjXCI6IFwic2FwLnVpLm1kY1wiLFxuXHRcIm1kY0ZpZWxkXCI6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRcInVcIjogXCJzYXAudWkudW5pZmllZFwiLFxuXHRcIm1hY3JvTWljcm9DaGFydFwiOiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRcIm1pY3JvQ2hhcnRcIjogXCJzYXAuc3VpdGUudWkubWljcm9jaGFydFwiXG59O1xuY29uc3Qgc2VsZWN0ID0geHBhdGgudXNlTmFtZXNwYWNlcyhuYW1lU3BhY2VNYXApO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRQaGFudG9tVXRpbC5yZWdpc3RlcihtYWNyb01ldGFkYXRhKTtcbn07XG5leHBvcnQgY29uc3QgdW5yZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24obWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5uYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEubmFtZSk7XG5cdGlmIChtYWNyb01ldGFkYXRhLnB1YmxpY05hbWUpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKG51bGwsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlLCBtYWNyb01ldGFkYXRhLnB1YmxpY05hbWUpO1xuXHR9XG59O1xuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCB4bWxkb206IE5vZGUgfCB1bmRlZmluZWQpIHtcblx0cmV0dXJuIHNlbGVjdChzZWxlY3RvciwgeG1sZG9tKTtcbn07XG5cbmV4cGVjdC5leHRlbmQoe1xuXHR0b0hhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYGRpZCBub3QgZmluZCBjb250cm9scyBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+PSAxXG5cdFx0fTtcblx0fSxcblx0dG9Ob3RIYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KGAvcm9vdCR7c2VsZWN0b3J9YCwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBUaGVyZSBpcyBhIGNvbnRyb2wgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPT09IDBcblx0XHR9O1xuXHR9XG59KTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRyb2xBdHRyaWJ1dGUgPSBmdW5jdGlvbihjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKC9yb290JHtjb250cm9sU2VsZWN0b3J9L0Ake2F0dHJpYnV0ZU5hbWV9KWA7XG5cdHJldHVybiBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZVhNTCA9IGZ1bmN0aW9uKHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGNvbnN0IHhtbFN0cmluZyA9IHNlcmlhbGl6ZXJcblx0XHQuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9tKVxuXHRcdC5yZXBsYWNlKC8oPzpbXFx0IF0qKD86XFxyP1xcbnxcXHIpKSsvZywgXCJcXG5cIilcblx0XHQucmVwbGFjZSgvXFxcXFwiL2csICdcIicpO1xuXHRyZXR1cm4gZm9ybWF0KHhtbFN0cmluZywgeyBwYXJzZXI6IFwiaHRtbFwiIH0pO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgQ0RTIGZpbGUgaW50byBhbiBFRE1YIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNDRFNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBNVVNUIGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24oc0NEU1VybDogc3RyaW5nKSB7XG5cdGNvbnN0IGNkc1N0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhzQ0RTVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBjc24gPSBjb21waWxlU291cmNlcyh7IFwic3RyaW5nLmNkc1wiOiBjZHNTdHJpbmcgfSwge30pO1xuXHRjb25zdCBlZG14Q29udGVudCA9IHRvLmVkbXgoY3NuLCB7IHNlcnZpY2U6IFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiB9KTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHNDRFNVcmwsIFwiLi5cIiwgXCJnZW5cIik7XG5cdGNvbnN0IGVkbXhVcmwgPSBwYXRoLnJlc29sdmUoZGlyLCBwYXRoLmJhc2VuYW1lKHNDRFNVcmwpLnJlcGxhY2UoXCIuY2RzXCIsIFwiLnhtbFwiKSk7XG5cblx0aWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHtcblx0XHRmcy5ta2RpclN5bmMoZGlyKTtcblx0fVxuXG5cdGZzLndyaXRlRmlsZVN5bmMoZWRteFVybCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteFVybDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24ob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBQcm9taXNlPGFueT4ge1xuXHRjb25zdCBvU2VydmljZUNvbnRleHQgPSB7IHNjb3BlT2JqZWN0OiB7fSwgc2NvcGVUeXBlOiBcIlwiLCBzZXR0aW5nczoge30gfTtcblx0cmV0dXJuIG5ldyBTaWRlRWZmZWN0c0ZhY3RvcnkoKS5jcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQpLnRoZW4oZnVuY3Rpb24ob1NlcnZpY2VJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgb0plc3RTaWRlRWZmZWN0c1NlcnZpY2UgPSBvU2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xuXHRcdG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRleHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNjb3BlT2JqZWN0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0Z2V0TWV0YU1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0XHRyZXR1cm4gb0plc3RTaWRlRWZmZWN0c1NlcnZpY2U7XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uKCk6IElEaWFnbm9zdGljcyB7XG5cdGNvbnN0IGlzc3VlczogYW55W10gPSBbXTtcblx0cmV0dXJuIHtcblx0XHRhZGRJc3N1ZShpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGlzc3Vlcy5wdXNoKHtcblx0XHRcdFx0aXNzdWVDYXRlZ29yeSxcblx0XHRcdFx0aXNzdWVTZXZlcml0eSxcblx0XHRcdFx0ZGV0YWlsc1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRnZXRJc3N1ZXMoKTogYW55W10ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcztcblx0XHR9LFxuXHRcdGNoZWNrSWZJc3N1ZUV4aXN0cyhpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBpc3N1ZXMuZmluZChpc3N1ZSA9PiB7XG5cdFx0XHRcdGlzc3VlLmlzc3VlQ2F0ZWdvcnkgPT09IGlzc3VlQ2F0ZWdvcnkgJiYgaXNzdWUuaXNzdWVTZXZlcml0eSA9PT0gaXNzdWVTZXZlcml0eSAmJiBpc3N1ZS5kZXRhaWxzID09PSBkZXRhaWxzO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0ID0gZnVuY3Rpb24oXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRUeXBlcy5lbnRpdHlTZXRzLmZpbmQoZXMgPT4gZXMubmFtZSA9PT0gbWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXQpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5KGVudGl0eVNldCBhcyBFbnRpdHlTZXQsIGVudGl0eVNldCk7XG5cdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24oc01ldGFkYXRhVXJsOiBzdHJpbmcpIHtcblx0Y29uc3Qgb1JlcXVlc3RvciA9IF9NZXRhZGF0YVJlcXVlc3Rvci5jcmVhdGUoe30sIFwiNC4wXCIsIHt9KTtcblx0aWYgKCFtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG5ldyBPRGF0YU1ldGFNb2RlbChvUmVxdWVzdG9yLCBzTWV0YWRhdGFVcmwsIHVuZGVmaW5lZCwgbnVsbCk7XG5cdFx0YXdhaXQgb01ldGFNb2RlbC5mZXRjaEVudGl0eUNvbnRhaW5lcigpO1xuXHRcdG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0gPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHRwcm9wZXJ0eT86IFByb3BlcnR5IHwgRW50aXR5U2V0IHwgQW55QW5ub3RhdGlvblxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGNvbnN0IHRhcmdldFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IGVudGl0eVNldCxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllczogW10sXG5cdFx0dGFyZ2V0T2JqZWN0OiBwcm9wZXJ0eSxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBlbnRpdHlTZXQuZW50aXR5VHlwZVxuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGg7XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwgPSBmdW5jdGlvbihiaW5kaW5nU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsIG1vZGVsQ29udGVudDogYW55KSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdGNvbnN0IHRleHQgPSBuZXcgSW52aXNpYmxlVGV4dCgpO1xuXHR0ZXh0LmJpbmRQcm9wZXJ0eShcInRleHRcIiwgYmluZGluZ0VsZW1lbnQpO1xuXHR0ZXh0LnNldE1vZGVsKGpzb25Nb2RlbCk7XG5cdHRleHQuc2V0QmluZGluZ0NvbnRleHQoanNvbk1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSk7XG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0aW5nUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24oXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhtbCA9IGA8cm9vdD4ke3htbElucHV0fTwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlZFhtbCwgXCJ0ZXh0L3htbFwiKTtcblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IEpTT05Nb2RlbCh7fSkgfSk7XG5cdH1cblxuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5nczogYW55ID0ge1xuXHRcdG1vZGVsczogT2JqZWN0LmFzc2lnbihcblx0XHRcdHtcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0bU1vZGVsc1xuXHRcdCksXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fVxuXHR9O1xuXG5cdC8vSW5qZWN0IG1vZGVscyBhbmQgYmluZGluZ0NvbnRleHRzXG5cdE9iamVjdC5rZXlzKG1CaW5kaW5nQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24oc0tleSkge1xuXHRcdC8qIEFzc2VydCB0byBtYWtlIHN1cmUgdGhlIGFubm90YXRpb25zIGFyZSBpbiB0aGUgdGVzdCBtZXRhZGF0YSAtPiBhdm9pZCBtaXNsZWFkaW5nIHRlc3RzICovXG5cdFx0ZXhwZWN0KHR5cGVvZiBvTWV0YU1vZGVsLmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzS2V5XSA9IG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChtQmluZGluZ0NvbnRleHRzW3NLZXldKTsgLy9WYWx1ZSBpcyBzUGF0aFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXG5cdC8vVGhpcyBjb250ZXh0IGZvciBtYWNybyB0ZXN0aW5nXG5cdGlmIChvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXSkge1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbXCJ0aGlzXCJdID0gb1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cblx0cmV0dXJuIFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbihcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdCh4bWxJbnB1dCwgc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0cmV0dXJuIHNlcmlhbGl6ZVhNTCh0ZW1wbGF0ZWRYTUwpO1xufTtcbiJdfQ==
386
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsImZvcm1hdFhtbCIsImZpbHRlciIsIm5vZGUiLCJ0eXBlIiwicmVxdWlyZSIsIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsIlBoYW50b21VdGlsIiwicmVnaXN0ZXIiLCJ1bnJlZ2lzdGVyTWFjcm8iLCJwbHVnSW4iLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsInNlbGVjdG9yIiwieG1sZG9tIiwiZXhwZWN0IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJ0b05vdEhhdmVDb250cm9sIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInhtbFN0cmluZyIsInNlcmlhbGl6ZVRvU3RyaW5nIiwicmVwbGFjZSIsImZvcm1hdCIsImNvbXBpbGVDRFMiLCJzQ0RTVXJsIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJjc24iLCJjb21waWxlU291cmNlcyIsImVkbXhDb250ZW50IiwidG8iLCJlZG14Iiwic2VydmljZSIsImRpciIsInBhdGgiLCJyZXNvbHZlIiwiZWRteFVybCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsIm9TZXJ2aWNlQ29udGV4dCIsInNjb3BlT2JqZWN0Iiwic2NvcGVUeXBlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJzTWV0YWRhdGFVcmwiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJ1bmRlZmluZWQiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwieG1sRG9jIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1ldGFNb2RlbCIsInNLZXkiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImdldFRlbXBsYXRlZFhNTCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBOFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ3NCQSxlLGFBQWdCQyxJLEVBQWNDLFE7UUFBd0Q7QUFDM0csVUFBTUMsUUFBUSxpREFBeUNGLElBQXpDLHlEQUFkO0FBQ0EsVUFBTUcsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsU0FBWCxFQUFmO0FBQ0EsVUFBTUMsUUFBUSxHQUFHSCxNQUFNLENB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QUFDbkdGLFVBQUFBLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkJvSyxJQUE3QixJQUFxQ0csTUFBckM7QUFDQSxTQU5ELEVBN0JDLENBcUNEOztBQUNBLFlBQUlMLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkIsTUFBN0IsQ0FBSixFQUEwQztBQUN6Q2tLLFVBQUFBLHFCQUFxQixDQUFDakssZUFBdEIsQ0FBc0MsTUFBdEMsSUFBZ0RpSyxxQkFBcUIsQ0FBQ2xLLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDTSxvQkFBckMsQ0FBMEQsR0FBMUQsQ0FBaEQ7QUFDQTs7QUFFRCxlQUFPQyxlQUFlLENBQUNDLE9BQWhCLENBQXdCZ0osTUFBTSxDQUFDL0ksaUJBQS9CLEVBQW1EO0FBQUVsQixVQUFBQSxJQUFJLEVBQUU7QUFBUixTQUFuRCxFQUE4RTJLLHFCQUE5RSxDQUFQO0FBMUNDO0FBMkNELEtBaEQrQjtBQUFBO0FBQUE7QUFBQSxHQUF6Qjs7OztBQWtEQSxNQUFNTSxlQUFlLGFBQzNCcEIsUUFEMkIsRUFFM0JqQyxZQUYyQixFQUczQmtDLGdCQUgyQixFQUkzQkMsT0FKMkI7QUFBQSxRQUsxQjtBQUFBLDZCQUMwQkgsbUJBQW1CLENBQUNDLFFBQUQsRUFBV2pDLFlBQVgsRUFBeUJrQyxnQkFBekIsRUFBMkNDLE9BQTNDLENBRDdDLE9BRU12RyxZQUZOO0FBR0QsS0FSMkI7QUFBQTtBQUFBO0FBQUEsR0FBckIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBoYW50b21VdGlsIH0gZnJvbSBcInNhcC9mZS9tYWNyb3NcIjtcbmltcG9ydCB7IF9NZXRhZGF0YVJlcXVlc3RvciB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IFhNTFByZXByb2Nlc3NvciB9IGZyb20gXCJzYXAvdWkvY29yZS91dGlsXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgY29tcGlsZVNvdXJjZXMsIHRvIH0gZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IEJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2VcIjtcbmltcG9ydCB7IEFueUFubm90YXRpb24sIENvbnZlcnRlck91dHB1dCwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgSlNPTk1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9qc29uXCI7XG5pbXBvcnQgeyBJbnZpc2libGVUZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJzYXAvYmFzZS91dGlsXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNGYWN0b3J5IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0XCJtYWNyb3NcIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9cIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9kYXRhXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcImxvZ1wiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJ1bml0dGVzdFwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L3ByZXByb2Nlc3NvcmV4dGVuc2lvbi9zYXAuZmUudW5pdHRlc3RpbmcvMVwiLFxuXHRcImNvbnRyb2xcIjogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRcImNvcmVcIjogXCJzYXAudWkuY29yZVwiLFxuXHRcIm1cIjogXCJzYXAubVwiLFxuXHRcImZcIjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0XCJtZGNcIjogXCJzYXAudWkubWRjXCIsXG5cdFwibWRjRmllbGRcIjogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFwidVwiOiBcInNhcC51aS51bmlmaWVkXCIsXG5cdFwibWFjcm9NaWNyb0NoYXJ0XCI6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdFwibWljcm9DaGFydFwiOiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24obWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFBoYW50b21VdGlsLnJlZ2lzdGVyKG1hY3JvTWV0YWRhdGEpO1xufTtcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbihtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSk7XG5cdH1cbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24oeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplclxuXHRcdC5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pXG5cdFx0LnJlcGxhY2UoLyg/OltcXHQgXSooPzpcXHI/XFxufFxccikpKy9nLCBcIlxcblwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7IHBhcnNlcjogXCJodG1sXCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0NEU1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIE1VU1QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbihzQ0RTVXJsOiBzdHJpbmcpIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNDRFNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVTb3VyY2VzKHsgXCJzdHJpbmcuY2RzXCI6IGNkc1N0cmluZyB9LCB7fSk7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gdG8uZWRteChjc24sIHsgc2VydmljZTogXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiIH0pO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoc0NEU1VybCwgXCIuLlwiLCBcImdlblwiKTtcblx0Y29uc3QgZWRteFVybCA9IHBhdGgucmVzb2x2ZShkaXIsIHBhdGguYmFzZW5hbWUoc0NEU1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpKTtcblxuXHRpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdGZzLm1rZGlyU3luYyhkaXIpO1xuXHR9XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14VXJsLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14VXJsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UgPSBhc3luYyBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IG9TZXJ2aWNlQ29udGV4dCA9IHsgc2NvcGVPYmplY3Q6IHt9LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbihvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2NvcGVPYmplY3Q6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24oKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKGlzc3VlID0+IHtcblx0XHRcdFx0aXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbihcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlZFR5cGVzLmVudGl0eVNldHMuZmluZChlcyA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgZW50aXR5U2V0KTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlZFR5cGVzLCBtYW5pZmVzdFNldHRpbmdzLCBnZXRGYWtlRGlhZ25vc3RpY3MoKSwgbWVyZ2UsIGRhdGFNb2RlbFBhdGgpO1xufTtcbmNvbnN0IG1ldGFNb2RlbENhY2hlOiBhbnkgPSB7fTtcbmV4cG9ydCBjb25zdCBnZXRNZXRhTW9kZWwgPSBhc3luYyBmdW5jdGlvbihzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IE9EYXRhTWV0YU1vZGVsKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbihcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZ1N0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0cmV0dXJuIGJpbmRpbmdFbGVtZW50LmZvcm1hdHRlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCA9IGZ1bmN0aW9uKGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWxDb250ZW50OiBhbnkpIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwobW9kZWxDb250ZW50KTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cdHRleHQuc2V0TW9kZWwoanNvbk1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChqc29uTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbihcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbihzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbihzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tzS2V5XSA9IG9Nb2RlbDtcblx0fSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRyZXR1cm4gWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHtvYmplY3R9IHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wYWx0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWw8b2JqZWN0PiB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWw8b2JqZWN0PigpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIik7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9ybWF0WG1sKHJlc3VsdERvYy5pbm5lckhUTUwsIHtcblx0XHRmaWx0ZXI6IChub2RlOiBhbnkpID0+IG5vZGUudHlwZSAhPT0gXCJDb21tZW50XCJcblx0fSk7XG59XG4iXX0=
@@ -19,6 +19,11 @@ import { merge } from "sap/base/util";
19
19
  import * as path from "path";
20
20
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
21
21
  import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
22
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
23
+ const formatXml = require("xml-formatter");
24
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
+ // @ts-ignore
26
+ import * as TemplateModel from "sap/fe/core/TemplateModel";
22
27
 
23
28
  Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
24
29
  jest.setTimeout(40000);
@@ -216,11 +221,18 @@ export const getTemplatingResult = async function(
216
221
  const xmlDoc = parser.parseFromString(templatedXml, "text/xml");
217
222
  // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
218
223
  // if not already passed to teh templating
224
+
225
+ const oMetaModel = await getMetaModel(sMetadataUrl);
219
226
  if (!mModels.hasOwnProperty("converterContext")) {
220
- mModels = Object.assign(mModels, { "converterContext": new JSONModel({}) });
227
+ mModels = Object.assign(mModels, { "converterContext": new TemplateModel({}, oMetaModel) });
221
228
  }
222
229
 
223
- const oMetaModel = await getMetaModel(sMetadataUrl);
230
+ Object.keys(mModels).forEach(function(sModelName) {
231
+ if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
232
+ mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
233
+ }
234
+ });
235
+
224
236
  const oPreprocessorSettings: any = {
225
237
  models: Object.assign(
226
238
  {
@@ -257,3 +269,43 @@ export const getTemplatedXML = async function(
257
269
  const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels);
258
270
  return serializeXML(templatedXML);
259
271
  };
272
+
273
+ /**
274
+ * Process the requested XML fragment with the provided data.
275
+ *
276
+ * @param {string} name Fully qualified name of the fragment to be tested.
277
+ * @param {object} testData Test data consisting
278
+ * @returns Tempalted fragment as string
279
+ */
280
+ export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
281
+ const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
282
+ const parser = new window.DOMParser();
283
+ const inputDoc = parser.parseFromString(inputXml, "text/xml");
284
+
285
+ // build model and bindings for given test data
286
+ const settings = {
287
+ models: {} as { [name: string]: JSONModel<object> },
288
+ bindingContexts: {} as { [name: string]: object }
289
+ };
290
+ for (const model in testData) {
291
+ const jsonModel = new JSONModel<object>();
292
+ jsonModel.setData(testData[model]);
293
+ settings.models[model] = jsonModel;
294
+ settings.bindingContexts[model] = settings.models[model].createBindingContext("/");
295
+ }
296
+
297
+ // execute the pre-processor
298
+ const resultDoc = await XMLPreprocessor.process(inputDoc.firstElementChild, { name }, settings);
299
+
300
+ // exclude nested fragments from test snapshots
301
+ const fragments = resultDoc.getElementsByTagName("core:Fragment");
302
+ if (fragments?.length > 0) {
303
+ for (const fragment of fragments) {
304
+ fragment.innerHTML = "";
305
+ }
306
+ }
307
+
308
+ return formatXml(resultDoc.innerHTML, {
309
+ filter: (node: any) => node.type !== "Comment"
310
+ });
311
+ }
@@ -527,17 +527,6 @@ sap.ui.define(
527
527
  .description("Seeing a value list of condition operators with " + numItems + " items.")
528
528
  .execute();
529
529
  },
530
- iCheckValueForFieldInCreateDialog: function(sFieldId, sValue, bIsRequired) {
531
- return FieldBuilder.create(this)
532
- .isDialogElement()
533
- .hasId(sFieldId)
534
- .hasValue(sValue)
535
- .hasProperties({ required: !!bIsRequired })
536
- .description(
537
- Utils.formatMessage("Seeing Create dialog parameter '{0}' with value '{1}'", sFieldId, sValue)
538
- )
539
- .execute();
540
- },
541
530
  iSeeKPI: function(sTitle, oProperties) {
542
531
  var sDescription = "Seeing KPI '" + sTitle + "'";
543
532
  if (oProperties) {
@@ -408,16 +408,6 @@ sap.ui.define(
408
408
  .description("Comfirmed VHD opened in dialog")
409
409
  .execute();
410
410
  },
411
- iEnterValueForFieldInCreateDialog: function(sFieldId, sValue) {
412
- return OpaBuilder.create(this)
413
- .isDialogElement()
414
- .hasId(sFieldId)
415
- .doEnterText(sValue)
416
- .description(
417
- "Entering Text in the field '" + sFieldId + "'in the create dialog with value '" + sValue + "'"
418
- )
419
- .execute();
420
- },
421
411
  iClickOnMessageButton: function() {
422
412
  return OpaBuilder.create(this)
423
413
 
@@ -795,21 +785,6 @@ sap.ui.define(
795
785
  .description("Seeing variant title '" + sTitle + "'")
796
786
  .execute();
797
787
  },
798
- iCheckValueOfFieldInCreateDialog: function(sFieldId, sValue, sAdditionalValue, bIsRequired) {
799
- return FieldBuilder.create(this)
800
- .isDialogElement()
801
- .hasId(sFieldId)
802
- .hasValue(sValue, sAdditionalValue)
803
- .hasProperties({ required: !!bIsRequired })
804
- .description(
805
- Utils.formatMessage(
806
- "Seeing field '{0}' with value '{1}'",
807
- sFieldId,
808
- [].concat(sValue, sAdditionalValue || [])
809
- )
810
- )
811
- .execute();
812
- },
813
788
  iSeeMessageView: function() {
814
789
  return OpaBuilder.create(this)
815
790
  .hasType("sap.m.MessageView")
@@ -850,19 +825,6 @@ sap.ui.define(
850
825
  .description("MessageItem is correctly displayed")
851
826
  .execute();
852
827
  },
853
-
854
- iCheckValueForFieldInCreateDialog: function(sFieldId, sValue, bIsRequired) {
855
- return FieldBuilder.create(this)
856
- .isDialogElement()
857
- .hasId(sFieldId)
858
- .hasValue(sValue)
859
- .hasProperties({ required: !!bIsRequired })
860
- .description(
861
- Utils.formatMessage("Seeing Create dialog parameter '{0}' with value '{1}'", sFieldId, sValue)
862
- )
863
- .execute();
864
- },
865
-
866
828
  iClickBackOnMessageView: function() {
867
829
  return OpaBuilder.create(this)
868
830
  .hasType("sap.m.MessageView")
@@ -446,18 +446,6 @@ sap.ui.define(
446
446
  )
447
447
  .execute();
448
448
  },
449
- iSeeActionParameterContent: function(sFieldName, sContent) {
450
- var sFieldId = "APD_::" + sFieldName + "-inner",
451
- oBuilder = OpaBuilder.create(this)
452
- .hasId(sFieldId)
453
- .isDialogElement()
454
- .description("Seeing Action parameter '" + sFieldName + "' with content '" + sContent + "'");
455
-
456
- if (sContent) {
457
- oBuilder.hasProperties({ value: sContent });
458
- }
459
- return oBuilder.execute();
460
- },
461
449
  iSeePageHeaderButton: function(bCollapse) {
462
450
  return OpaBuilder.create(this)
463
451
  .hasType("sap.m.Button")
@@ -27,6 +27,11 @@ sap.ui.define([], function () {
27
27
  return _this.oValues[key];
28
28
  }));
29
29
 
30
+ _defineProperty(this, "setProperty", jest.fn(function (key, value) {
31
+ _this.oValues[key] = value;
32
+ return _this.oValues[key];
33
+ }));
34
+
30
35
  _defineProperty(this, "getObject", jest.fn(function (key) {
31
36
  return _this.oValues[key];
32
37
  }));
@@ -39,6 +44,8 @@ sap.ui.define([], function () {
39
44
  return _this.oBinding;
40
45
  }));
41
46
 
47
+ _defineProperty(this, "getModel", jest.fn());
48
+
42
49
  this.oValues = oValues;
43
50
  this.oBinding = oBinding;
44
51
  };
@@ -51,6 +58,10 @@ sap.ui.define([], function () {
51
58
  _defineProperty(this, "getBindingInfo", jest.fn());
52
59
 
53
60
  _defineProperty(this, "getBinding", jest.fn());
61
+
62
+ _defineProperty(this, "data", jest.fn());
63
+
64
+ _defineProperty(this, "getModel", jest.fn());
54
65
  };
55
66
  /**
56
67
  * Mock class for OData V4 ListBinding
@@ -154,6 +165,12 @@ sap.ui.define([], function () {
154
165
  return _this4.oMetaContext.getProperty(sPath);
155
166
  }));
156
167
 
168
+ _defineProperty(this, "requestObject", jest.fn());
169
+
170
+ _defineProperty(this, "createBindingContext", jest.fn());
171
+
172
+ _defineProperty(this, "getMetaPath", jest.fn());
173
+
157
174
  this.oMetaContext = new MockContext(oMetaData || {});
158
175
  } // Mocked API
159
176
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -183,6 +200,10 @@ sap.ui.define([], function () {
183
200
  return _this5.oMetaModel;
184
201
  }));
185
202
 
203
+ _defineProperty(this, "getProperty", jest.fn());
204
+
205
+ _defineProperty(this, "setProperty", jest.fn());
206
+
186
207
  this.mockListBinding = mockListBinding;
187
208
  this.mockContextBinding = mockContextBinding;
188
209
  } // Factories
@@ -215,4 +236,4 @@ sap.ui.define([], function () {
215
236
  _exports.MockModel = MockModel;
216
237
  return _exports;
217
238
  }, false);
218
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJNb2NrQ29udHJvbCIsIk1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0cyIsIlByb21pc2UiLCJyZXNvbHZlIiwiYU1vY2tDb250ZXh0cyIsIm1hcCIsImNvbnRleHQiLCJzQ2xhc3NOYW1lIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwic1BhdGgiLCIkcGF0aCIsIm9NZXRhQ29udGV4dCIsImdldFByb3BlcnR5IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwib01ldGFNb2RlbCIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFGQTtBQUNBO0FBQ0E7TUFJYUEsVyxHQUNaLHFCQUEyQkMsT0FBM0IsRUFBaURDLFFBQWpELEVBQWlFO0FBQUE7O0FBQUE7O0FBQUEseUNBRTVDQyxJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWlCO0FBQzdDLGFBQU8sS0FBSSxDQUFDSixPQUFMLENBQWFJLEdBQWIsQ0FBUDtBQUNBLEtBRm9CLENBRjRDOztBQUFBLHVDQUs5Q0YsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUMzQyxhQUFPLEtBQUksQ0FBQ0osT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUZrQixDQUw4Qzs7QUFBQSxxQ0FRaERGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDOUIsYUFBTyxLQUFJLENBQUNILE9BQUwsQ0FBYSxPQUFiLENBQVA7QUFDQSxLQUZnQixDQVJnRDs7QUFBQSx3Q0FZN0NFLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDakMsYUFBTyxL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T0FGb0IsQ0FwQjBGOztBQUFBLDRDQXVCekZ2QixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQ25DLGVBQVEsTUFBSSxDQUFDdUIsVUFBYjtBQUNBLE9BRnFCLENBdkJ5Rjs7QUFBQSxXQUFwRkYsZUFBb0YsR0FBcEZBLGVBQW9GO0FBQUEsV0FBekNDLGtCQUF5QyxHQUF6Q0Esa0JBQXlDO0FBQUUsSyxDQUVqSDs7Ozs7OzthQVFBLHNCQUFvQkMsVUFBcEIsRUFBK0M7QUFDOUMsYUFBS0EsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxPLENBRUQ7QUFDQTs7OzthQVpBLDhCQUE0QkYsZUFBNUIsRUFBeUU7QUFDeEUsZUFBTyxJQUFJRCxTQUFKLENBQWNDLGVBQWQsQ0FBUDtBQUNBOzs7YUFDRCxpQ0FBK0JDLGtCQUEvQixFQUFrRjtBQUNqRixlQUFPLElBQUlGLFNBQUosQ0FBY0ksU0FBZCxFQUF5QkYsa0JBQXpCLENBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuXG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YUxpc3RCaW5kaW5nLCBPRGF0YUNvbnRleHRCaW5kaW5nLCBPRGF0YU1ldGFNb2RlbCwgT0RhdGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9WYWx1ZXM6IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIHtcblx0cHVibGljIGdldEJpbmRpbmdJbmZvID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10pIHtcblx0XHRhQ29udGV4dHMgPSBhQ29udGV4dHMgfHwgW107XG5cblx0XHR0aGlzLmFNb2NrQ29udGV4dHMgPSBhQ29udGV4dHMubWFwKGNvbnRleHQgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBNb2NrQ29udGV4dChjb250ZXh0LCB0aGlzKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvQ29udGV4dD86IGFueSkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvTWV0YURhdGE/OiBhbnkpIHtcblx0XHR0aGlzLm9NZXRhQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRNZXRhQ29udGV4dCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gKG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG59XG4iXX0=
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsIk1vY2tDb250cm9sIiwiTW9ja0xpc3RCaW5kaW5nIiwiYUNvbnRleHRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhTW9ja0NvbnRleHRzIiwibWFwIiwiY29udGV4dCIsInNDbGFzc05hbWUiLCJNb2NrQ29udGV4dEJpbmRpbmciLCJvQ29udGV4dCIsIm9Nb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJzUGF0aCIsIiRwYXRoIiwib01ldGFDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJNb2NrTW9kZWwiLCJtb2NrTGlzdEJpbmRpbmciLCJtb2NrQ29udGV4dEJpbmRpbmciLCJvTWV0YU1vZGVsIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQUZBO0FBQ0E7QUFDQTtNQUlhQSxXLEdBQ1oscUJBQTJCQyxPQUEzQixFQUFpREMsUUFBakQsRUFBaUU7QUFBQTs7QUFBQTs7QUFBQSx5Q0FFNUNDLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDN0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FBYUksR0FBYixDQUFQO0FBQ0EsS0FGb0IsQ0FGNEM7O0FBQUEseUNBSzVDRixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWNDLEtBQWQsRUFBNkI7QUFDekQsTUFBQSxLQUFJLENBQUNMLE9BQUwsQ0FBYUksR0FBYixJQUFvQkMsS0FBcEI7QUFDQSxhQUFPLEtBQUksQ0FBQ0wsT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUhvQixDQUw0Qzs7QUFBQSx1Q0FVOUNGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDM0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FB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dCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5cbmltcG9ydCB7IENvbnRleHQsIE9EYXRhTGlzdEJpbmRpbmcsIE9EYXRhQ29udGV4dEJpbmRpbmcsIE9EYXRhTWV0YU1vZGVsLCBPRGF0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRleHQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlczogYW55LCBwcml2YXRlIG9CaW5kaW5nPzogYW55KSB7fVxuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW1wiJHBhdGhcIl07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub0JpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbCB7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBkYXRhID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tMaXN0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFMaXN0QmluZGluZz4ge1xuXHRwcml2YXRlIGFNb2NrQ29udGV4dHM6IE1vY2tDb250ZXh0W107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFDb250ZXh0cz86IGFueVtdKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXSk7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRDdXJyZW50Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55KSBhcyBDb250ZXh0W107XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHRCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdHByaXZhdGUgb01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob0NvbnRleHQ/OiBhbnkpIHtcblx0XHR0aGlzLm9Nb2NrQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgdGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH1cblx0cHVibGljIGdldEludGVybmFsTW9ja0NvbnRleHQoKTogTW9ja0NvbnRleHQge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIGdldEJvdW5kQ29udGV4dCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTW9ja0NvbnRleHQgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tNZXRhTW9kZWwgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTWV0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob01ldGFEYXRhPzogYW55KSB7XG5cdFx0dGhpcy5vTWV0YUNvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0TWV0YUNvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGgpO1xuXHR9KTtcblx0cHVibGljIHJlcXVlc3RPYmplY3QgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBjcmVhdGVCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1ldGFQYXRoID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG5cblx0cHVibGljIGdldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG59XG4iXX0=
@@ -10,6 +10,11 @@ export class MockContext implements Partial<Context> {
10
10
  public getProperty = jest.fn((key: string) => {
11
11
  return this.oValues[key];
12
12
  });
13
+ public setProperty = jest.fn((key: string, value: any) => {
14
+ this.oValues[key] = value;
15
+ return this.oValues[key];
16
+ });
17
+
13
18
  public getObject = jest.fn((key: string) => {
14
19
  return this.oValues[key];
15
20
  });
@@ -20,11 +25,14 @@ export class MockContext implements Partial<Context> {
20
25
  public getBinding = jest.fn(() => {
21
26
  return this.oBinding;
22
27
  });
28
+ public getModel = jest.fn();
23
29
  }
24
30
 
25
31
  export class MockControl {
26
32
  public getBindingInfo = jest.fn();
27
33
  public getBinding = jest.fn();
34
+ public data = jest.fn();
35
+ public getModel = jest.fn();
28
36
  }
29
37
 
30
38
  /**
@@ -99,6 +107,9 @@ export class MockMetaModel implements Partial<ODataMetaModel> {
99
107
  public getObject = jest.fn((sPath: string) => {
100
108
  return this.oMetaContext.getProperty(sPath);
101
109
  });
110
+ public requestObject = jest.fn();
111
+ public createBindingContext = jest.fn();
112
+ public getMetaPath = jest.fn();
102
113
  }
103
114
 
104
115
  /**
@@ -134,4 +145,7 @@ export class MockModel implements Partial<ODataModel> {
134
145
  public getMetaModel = jest.fn(() => {
135
146
  return (this.oMetaModel as any) as ODataMetaModel;
136
147
  });
148
+
149
+ public getProperty = jest.fn();
150
+ public setProperty = jest.fn();
137
151
  }
@@ -78,6 +78,27 @@ sap.ui.define(
78
78
  * @public
79
79
  */
80
80
 
81
+ /**
82
+ * An dialog field identifier
83
+ *
84
+ * @typedef {object} DialogFieldIdentifier
85
+ * @property {string} property The name of the field
86
+ * In case of an action parameter dialog, this is the fieldname only
87
+ * <code><pre>
88
+ * {
89
+ * property: <fieldname>
90
+ * }
91
+ * </pre></code>
92
+ * In case of a create dialog, the concatenation of the entity and fieldname has to be provided
93
+ * <code><pre>
94
+ * {
95
+ * property: <entity>::<fieldname>
96
+ * }
97
+ * </pre></code>
98
+ * @name sap.fe.test.api.DialogFieldIdentifier
99
+ * @public
100
+ */
101
+
81
102
  function _findParentChainFunction(oResult, sChainKeyword) {
82
103
  var oAnd = oResult.and;
83
104
  if (sChainKeyword in oAnd) {
@@ -34,19 +34,23 @@ sap.ui.define(
34
34
  DialogAPI.prototype.constructor = DialogAPI;
35
35
 
36
36
  /**
37
- * Creates a matcher for fields within action dialogs.
37
+ * Creates a matcher for fields within create and action dialogs.
38
38
  *
39
39
  * @param {sap.fe.test.api.FieldIdentifier | string} vFieldIdentifier Identifier to be used for the matcher
40
+ * @param {object} oDialogIdentifier Identifier for the dialog (create/action)
40
41
  *
41
42
  * @returns {object} A matcher
42
43
  *
43
44
  * @private
44
45
  */
45
- DialogAPI.prototype._createFieldMatcher = function(vFieldIdentifier) {
46
+ DialogAPI.prototype._createFieldMatcher = function(vFieldIdentifier, oDialogIdentifier) {
46
47
  var vMatcher, sFieldId;
47
48
  if (!Utils.isOfType(vFieldIdentifier, String)) {
48
49
  if (typeof vFieldIdentifier.property === "string") {
49
- sFieldId = "APD_::" + vFieldIdentifier.property.replaceAll("/", "::");
50
+ sFieldId =
51
+ oDialogIdentifier && oDialogIdentifier.type === "Create"
52
+ ? "CreateDialog::" + vFieldIdentifier.property.replaceAll("/", "::")
53
+ : "APD_::" + vFieldIdentifier.property.replaceAll("/", "::");
50
54
  } else {
51
55
  throw new Error(
52
56
  "The 'property' parameter for creating a control ID for a field in an action dialog is not supported: " +
@@ -61,12 +65,12 @@ sap.ui.define(
61
65
  return vMatcher;
62
66
  };
63
67
 
64
- DialogAPI.prototype._createFieldBuilder = function(vFieldIdentifier) {
68
+ DialogAPI.prototype._createFieldBuilder = function(vFieldIdentifier, oDialogIdentifier) {
65
69
  var oMdcFieldBuilder = new MdcFieldBuilder(this.getOpaInstance());
66
70
  return oMdcFieldBuilder
67
71
  .isDialogElement()
68
72
  .hasType("sap.ui.mdc.Field")
69
- .has(this._createFieldMatcher(vFieldIdentifier));
73
+ .has(this._createFieldMatcher(vFieldIdentifier, oDialogIdentifier));
70
74
  };
71
75
 
72
76
  DialogAPI.prototype._getConfirmButtonMatcher = function() {
@@ -70,22 +70,22 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder"], fu
70
70
  };
71
71
 
72
72
  /**
73
- * Changes the content of a field in an action parameter dialog.
73
+ * Changes the content of a field in a dialog.
74
74
  *
75
- * @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
75
+ * @param {sap.fe.test.api.DialogFieldIdentifier} vFieldIdentifier The identifier of the field
76
76
  * @param {string} [vValue] The new target value.
77
77
  * @param {boolean} [bClearFirst] Set to <code>true</code> to clear previously set filters, otherwise all previously set values will be kept
78
78
  * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, that can be used for chaining statements
79
79
  * @public
80
80
  */
81
- DialogActions.prototype.iChangeActionParameterDialogField = function(vFieldIdentifier, vValue, bClearFirst) {
81
+ DialogActions.prototype.iChangeDialogField = function(vFieldIdentifier, vValue, bClearFirst) {
82
82
  var aArguments = Utils.parseArguments([Object, String, Boolean], arguments);
83
83
  return this.prepareResult(
84
- this._createFieldBuilder(vFieldIdentifier)
84
+ this._createFieldBuilder(vFieldIdentifier, this.getIdentifier())
85
85
  .doChangeValue(aArguments[1], aArguments[2])
86
86
  .description(
87
87
  Utils.formatMessage(
88
- "Changing the field '{1}' of action parameter dialog '{0}' by adding '{2}' (was cleared first: {3})",
88
+ "Changing the field '{1}' of dialog '{0}' by adding '{2}' (was cleared first: {3})",
89
89
  this.getIdentifier(),
90
90
  aArguments[0],
91
91
  aArguments[1],
@@ -96,5 +96,18 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder"], fu
96
96
  );
97
97
  };
98
98
 
99
+ /**
100
+ * Changes the content of a field in an action parameter dialog.
101
+ *
102
+ * @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
103
+ * @param {string} [vValue] The new target value.
104
+ * @param {boolean} [bClearFirst] Set to <code>true</code> to clear previously set filters, otherwise all previously set values will be kept
105
+ * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, that can be used for chaining statements
106
+ * @public
107
+ */
108
+ DialogActions.prototype.iChangeActionParameterDialogField = function(vFieldIdentifier, vValue, bClearFirst) {
109
+ return this.iChangeDialogField(vFieldIdentifier, vValue, bClearFirst);
110
+ };
111
+
99
112
  return DialogActions;
100
113
  });
@@ -86,9 +86,9 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils"], function(DialogAPI, Utils) {
86
86
  };
87
87
 
88
88
  /**
89
- * Checks the content and state of a field in an action parameter dialog.
89
+ * Checks the content and state of a field in a dialog.
90
90
  *
91
- * @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
91
+ * @param {sap.fe.test.api.DialogFieldIdentifier} vFieldIdentifier The identifier of the field
92
92
  * @param {string | Array | object} [vValue] Expected value(s) of the field.
93
93
  * if passed as an object, the following pattern will be considered:
94
94
  * <code><pre>
@@ -100,15 +100,16 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils"], function(DialogAPI, Utils) {
100
100
  * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
101
101
  * @public
102
102
  */
103
- DialogAssertions.prototype.iCheckActionParameterDialogField = function(vFieldIdentifier, vValue, mState) {
103
+ DialogAssertions.prototype.iCheckDialogField = function(vFieldIdentifier, vValue, mState) {
104
104
  var aArguments = Utils.parseArguments([Object, [String, Array, Object], Object], arguments);
105
105
  return this.prepareResult(
106
- this._createFieldBuilder(vFieldIdentifier)
106
+ this._createFieldBuilder(vFieldIdentifier, this.getIdentifier())
107
107
  .hasValue(aArguments[1])
108
108
  .hasState(aArguments[2])
109
109
  .description(
110
110
  Utils.formatMessage(
111
- "Checking field '{0}' with content '{1}' and state '{2}'",
111
+ "Checking field '{1}' of dialog '{0}' with content '{2}' and state '{3}'",
112
+ this.getIdentifier(),
112
113
  aArguments[0],
113
114
  aArguments[1],
114
115
  aArguments[2]
@@ -118,5 +119,24 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils"], function(DialogAPI, Utils) {
118
119
  );
119
120
  };
120
121
 
122
+ /**
123
+ * Checks the content and state of a field in an action parameter dialog.
124
+ *
125
+ * @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
126
+ * @param {string | Array | object} [vValue] Expected value(s) of the field.
127
+ * if passed as an object, the following pattern will be considered:
128
+ * <code><pre>
129
+ * {
130
+ * value: <string>, // optional
131
+ * }
132
+ * </pre></code>
133
+ * @param {object} [mState] Defines the expected state of the field
134
+ * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
135
+ * @public
136
+ */
137
+ DialogAssertions.prototype.iCheckActionParameterDialogField = function(vFieldIdentifier, vValue, mState) {
138
+ return this.iCheckDialogField(vFieldIdentifier, vValue, mState);
139
+ };
140
+
121
141
  return DialogAssertions;
122
142
  });
@@ -32,6 +32,15 @@ sap.ui.define(
32
32
  * @type {string}
33
33
  * @public
34
34
  */
35
+ AllHidingDrafts: EditState.ALL_HIDING_DRAFTS.id,
36
+ /**
37
+ * All (Hiding Drafts)
38
+ *
39
+ * @name sap.fe.test.api.EditState.AllHidingDrafts
40
+ * @constant
41
+ * @type {string}
42
+ * @public
43
+ */
35
44
  Unchanged: EditState.UNCHANGED.id,
36
45
  /**
37
46
  * Own Draft
@@ -234,18 +234,28 @@ sap.ui.define(
234
234
  /**
235
235
  * Saves a variant under the given name, or overwrites the current variant.
236
236
  *
237
- * @param {string} [sVariantName] The name of the new variant. If omitted, the current variant will be overwritten.
237
+ * @param {string} [sVariantName] The name of the new variant. If no new variant name is defined, the current variant will be overwritten.
238
+ * @param {string} [bSetAsDefault] Saves the new variant with option "Set as Default".
239
+ * @param {string} [bApplyAutomatically] Saves the new variant with option "Apply Automatically".
238
240
  * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
239
241
  *
240
242
  * @public
241
243
  */
242
- FilterBarActions.prototype.iSaveVariant = function(sVariantName) {
244
+ FilterBarActions.prototype.iSaveVariant = function(sVariantName, bSetAsDefault, bApplyAutomatically) {
243
245
  var fnSuccessFunction = Utils.isOfType(sVariantName, String)
244
246
  ? function(oFilterBar) {
245
247
  return VMBuilder.create(this)
246
248
  .hasId(oFilterBar.getId() + "::VariantManagement")
247
- .doSaveAs(sVariantName)
248
- .description(Utils.formatMessage("Saving variant for '{0}' as '{1}'", this.getIdentifier(), sVariantName))
249
+ .doSaveAs(sVariantName, bSetAsDefault, bApplyAutomatically)
250
+ .description(
251
+ Utils.formatMessage(
252
+ "Saving variant for '{0}' as '{1}' with default='{2}' and applyAutomatically='{3}'",
253
+ this.getIdentifier(),
254
+ sVariantName,
255
+ !!bSetAsDefault,
256
+ !!bApplyAutomatically
257
+ )
258
+ )
249
259
  .execute();
250
260
  }
251
261
  : function(oFilterBar) {
@@ -263,6 +273,30 @@ sap.ui.define(
263
273
  );
264
274
  };
265
275
 
276
+ /**
277
+ * Selects the chosen variant.
278
+ *
279
+ * @param {string} sVariantName The name of the variant to be selected
280
+ * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
281
+ *
282
+ * @public
283
+ */
284
+ FilterBarActions.prototype.iSelectVariant = function(sVariantName) {
285
+ return this.prepareResult(
286
+ this.getBuilder()
287
+ .success(
288
+ function(oFilterBar) {
289
+ return VMBuilder.create(this)
290
+ .hasId(oFilterBar.getId() + "::VariantManagement")
291
+ .doSelectVariant(sVariantName)
292
+ .description(Utils.formatMessage("Selecting variant '{1}' from '{0}'", this.getIdentifier(), sVariantName))
293
+ .execute();
294
+ }.bind(this)
295
+ )
296
+ .execute()
297
+ );
298
+ };
299
+
266
300
  FilterBarActions.prototype.iSelectVisualFilter = function(sVisualFilterIdentifier, sLabelValue, bIsSelected) {
267
301
  // var that = this;
268
302
  return this.prepareResult(
@@ -171,10 +171,39 @@ sap.ui.define(
171
171
  return this.iCheckField(aArguments[0], aArguments[1], Utils.mergeObjects({ controlType: "sap.m.Link" }, aArguments[2]));
172
172
  };
173
173
 
174
- FormAssertions.prototype.iCheckElement = function(sId, oProperties) {
175
- return OpaBuilder.create(this)
176
- .hasId(sId)
177
- .hasProperties(oProperties);
174
+ FormAssertions.prototype.iCheckFormContainersElementCount = function(sFormContainer, iCount, mState) {
175
+ var aArguments = Utils.parseArguments([String, Number, Object], arguments),
176
+ fullSubSectionId = this.getIdentifier().fullSubSectionId,
177
+ mFormState = aArguments[2],
178
+ sView = fullSubSectionId.split("--")[0],
179
+ sForm = fullSubSectionId.split("--")[1].split("::")[2],
180
+ sFormContainerId = sView + "--" + "fe::FormContainer::" + aArguments[0];
181
+ return this.prepareResult(
182
+ this.getBuilder()
183
+ .hasId(sFormContainerId)
184
+ .has(function(oFormContainer) {
185
+ var oMatchingFormContainers;
186
+ if (Object.keys(mFormState).length) {
187
+ oMatchingFormContainers = oFormContainer.getFormElements().filter(function(oFormElement) {
188
+ return Object.keys(mFormState).every(function(sFormElementKey) {
189
+ return mFormState[sFormElementKey] === oFormElement.getProperty(sFormElementKey);
190
+ });
191
+ });
192
+ } else {
193
+ oMatchingFormContainers = oFormContainer.getFormElements();
194
+ }
195
+ return oMatchingFormContainers.length === iCount;
196
+ })
197
+ .description(
198
+ Utils.formatMessage(
199
+ "Form Container '{0}' on Form '{1}' has '{2}' Form Elements.",
200
+ aArguments[0],
201
+ sForm,
202
+ aArguments[1]
203
+ )
204
+ )
205
+ .execute()
206
+ );
178
207
  };
179
208
  return FormAssertions;
180
209
  }
@@ -597,7 +597,7 @@ sap.ui.define(
597
597
  };
598
598
 
599
599
  /**
600
- * Selects the variant of the given name.
600
+ * Selects the chosen variant.
601
601
  *
602
602
  * @param {string} sVariantName The name of the variant to be selected
603
603
  * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
@@ -27,7 +27,7 @@ sap.ui.define(
27
27
  interfaces: [],
28
28
  controls: [],
29
29
  elements: [],
30
- version: "1.96.0",
30
+ version: "1.97.0",
31
31
  noLibraryCSS: true
32
32
  });
33
33