@sapui5/sap.fe.test 1.102.0 → 1.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/test/.library +1 -1
- package/src/sap/fe/test/BaseActions.js +86 -97
- package/src/sap/fe/test/BaseArrangements.js +4 -15
- package/src/sap/fe/test/BaseAssertions.js +39 -46
- package/src/sap/fe/test/CollaborationClient.js +5 -5
- package/src/sap/fe/test/CollaborationClient.ts +5 -5
- package/src/sap/fe/test/FeMocks.js +1 -1
- package/src/sap/fe/test/FeMocks.ts +4 -3
- package/src/sap/fe/test/Flexibility.js +115 -162
- package/src/sap/fe/test/JestTemplatingHelper.js +37 -25
- package/src/sap/fe/test/JestTemplatingHelper.ts +46 -30
- package/src/sap/fe/test/JourneyRunner.js +31 -37
- package/src/sap/fe/test/ListReport.js +3 -7
- package/src/sap/fe/test/ObjectPage.js +26 -32
- package/src/sap/fe/test/Shell.js +0 -6
- package/src/sap/fe/test/TemplatePage.js +8 -2
- package/src/sap/fe/test/TemplatingTestUtils.js +20 -20
- package/src/sap/fe/test/UI5MockHelper.js +6 -6
- package/src/sap/fe/test/UI5MockHelper.ts +20 -19
- package/src/sap/fe/test/Utils.js +19 -20
- package/src/sap/fe/test/api/BaseAPI.js +11 -26
- package/src/sap/fe/test/api/ChartActions.js +116 -119
- package/src/sap/fe/test/api/ChartAssertions.js +18 -22
- package/src/sap/fe/test/api/CollaborationAPI.js +6 -6
- package/src/sap/fe/test/api/CollaborationAPI.ts +9 -11
- package/src/sap/fe/test/api/DialogAPI.js +11 -13
- package/src/sap/fe/test/api/DialogActions.js +8 -8
- package/src/sap/fe/test/api/DialogAssertions.js +8 -9
- package/src/sap/fe/test/api/DialogHelper.js +63 -0
- package/src/sap/fe/test/api/DialogMassEditActions.js +115 -0
- package/src/sap/fe/test/api/DialogMassEditAssertions.js +174 -0
- package/src/sap/fe/test/api/DialogMessageActions.js +2 -1
- package/src/sap/fe/test/api/DialogType.js +11 -2
- package/src/sap/fe/test/api/DialogValueHelpActions.js +17 -39
- package/src/sap/fe/test/api/DialogValueHelpAssertions.js +11 -19
- package/src/sap/fe/test/api/FilterBarAPI.js +11 -12
- package/src/sap/fe/test/api/FilterBarActions.js +26 -40
- package/src/sap/fe/test/api/FilterBarAssertions.js +28 -47
- package/src/sap/fe/test/api/FooterActionsBase.js +3 -4
- package/src/sap/fe/test/api/FooterActionsOP.js +6 -10
- package/src/sap/fe/test/api/FooterAssertionsBase.js +5 -10
- package/src/sap/fe/test/api/FooterAssertionsOP.js +8 -13
- package/src/sap/fe/test/api/FormAPI.js +5 -6
- package/src/sap/fe/test/api/FormActions.js +11 -21
- package/src/sap/fe/test/api/FormAssertions.js +14 -20
- package/src/sap/fe/test/api/HeaderAPI.js +12 -27
- package/src/sap/fe/test/api/HeaderActions.js +10 -12
- package/src/sap/fe/test/api/HeaderActionsLR.js +76 -82
- package/src/sap/fe/test/api/HeaderAssertions.js +2 -20
- package/src/sap/fe/test/api/HeaderAssertionsLR.js +5 -8
- package/src/sap/fe/test/api/HeaderLR.js +7 -19
- package/src/sap/fe/test/api/KPICardAssertions.js +18 -37
- package/src/sap/fe/test/api/TableAPI.js +3 -13
- package/src/sap/fe/test/api/TableActions.js +2 -34
- package/src/sap/fe/test/api/TableAssertions.js +1 -24
- package/src/sap/fe/test/builder/FEBuilder.js +71 -75
- package/src/sap/fe/test/builder/MacroFieldBuilder.js +4 -3
- package/src/sap/fe/test/builder/MdcFieldBuilder.js +33 -29
- package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +9 -7
- package/src/sap/fe/test/builder/MdcTableBuilder.js +8 -4
- package/src/sap/fe/test/builder/VMBuilder.js +27 -43
- package/src/sap/fe/test/library.js +3 -2
- package/src/sap/fe/test/library.ts +1 -0
- package/src/sap/fe/test/massEdit.js +0 -62
|
@@ -2,14 +2,12 @@
|
|
|
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/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "sap/base/util/merge", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel", "sap/ui/base/BindingParser", "sap/ui/core/InvisibleText", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "xpath"], function (
|
|
5
|
+
sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "sap/base/util/merge", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel", "sap/ui/base/BindingParser", "sap/ui/core/InvisibleText", "sap/ui/core/util/XMLPreprocessor", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "xpath"], function (compiler, fs, path, prettier, Log, merge, BuildingBlockRuntime, ConverterContext, SideEffectsFactory, TemplateModel, BindingParser, InvisibleText, XMLPreprocessor, JSONModel, _MetadataRequestor, ODataMetaModel, xpath) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
9
|
var registerBuildingBlock = BuildingBlockRuntime.registerBuildingBlock;
|
|
10
10
|
var format = prettier.format;
|
|
11
|
-
var to = cds_compiler.to;
|
|
12
|
-
var compileSources = cds_compiler.compileSources;
|
|
13
11
|
|
|
14
12
|
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; } } }; }
|
|
15
13
|
|
|
@@ -25,11 +23,17 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
|
|
|
25
23
|
|
|
26
24
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
25
|
|
|
26
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
27
|
+
|
|
28
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
29
|
+
|
|
30
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
31
|
+
|
|
28
32
|
/**
|
|
29
33
|
* Process the requested XML fragment with the provided data.
|
|
30
34
|
*
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
35
|
+
* @param name Fully qualified name of the fragment to be tested.
|
|
36
|
+
* @param testData Test data consisting
|
|
33
37
|
* @returns Templated fragment as string
|
|
34
38
|
*/
|
|
35
39
|
var processFragment = function (name, testData) {
|
|
@@ -195,32 +199,35 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
|
|
|
195
199
|
/**
|
|
196
200
|
* Compile a CDS file into an EDMX file.
|
|
197
201
|
*
|
|
198
|
-
* @param
|
|
202
|
+
* @param cdsUrl The path to the file containing the CDS definition. This file must declare the namespace
|
|
199
203
|
* sap.fe.test and a service JestService
|
|
200
|
-
* @
|
|
204
|
+
* @param options Options for creating the EDMX output
|
|
205
|
+
* @param edmxFileName Allows you to override the name of the compiled EDMX metadata file
|
|
206
|
+
* @returns The path of the generated EDMX
|
|
201
207
|
*/
|
|
202
208
|
|
|
203
209
|
|
|
204
210
|
_exports.formatXML = formatXML;
|
|
205
211
|
|
|
206
|
-
var compileCDS = function (
|
|
207
|
-
var
|
|
208
|
-
var
|
|
209
|
-
var
|
|
210
|
-
var
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
fs.writeFileSync(
|
|
217
|
-
return
|
|
212
|
+
var compileCDS = function (cdsUrl) {
|
|
213
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
214
|
+
var edmxFileName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : path.basename(cdsUrl).replace(".cds", ".xml");
|
|
215
|
+
var cdsString = fs.readFileSync(cdsUrl, "utf-8");
|
|
216
|
+
var edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService", options);
|
|
217
|
+
var dir = path.resolve(cdsUrl, "..", "gen");
|
|
218
|
+
var edmxFilePath = path.resolve(dir, edmxFileName);
|
|
219
|
+
fs.mkdirSync(dir, {
|
|
220
|
+
recursive: true
|
|
221
|
+
});
|
|
222
|
+
fs.writeFileSync(edmxFilePath, edmxContent);
|
|
223
|
+
return edmxFilePath;
|
|
218
224
|
};
|
|
219
225
|
/**
|
|
220
226
|
* Compile CDS to EDMX.
|
|
221
227
|
*
|
|
222
228
|
* @param cds The CDS model. It must define at least one service.
|
|
223
|
-
* @param service The fully-qualified name of the service to
|
|
229
|
+
* @param service The fully-qualified name of the service to be compiled. Defaults to "sap.fe.test.JestService".
|
|
230
|
+
* @param options Options for creating the EDMX output
|
|
224
231
|
* @returns The compiled service model as EDMX.
|
|
225
232
|
*/
|
|
226
233
|
|
|
@@ -229,16 +236,21 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
|
|
|
229
236
|
|
|
230
237
|
function cds2edmx(cds) {
|
|
231
238
|
var service = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sap.fe.test.JestService";
|
|
232
|
-
var
|
|
239
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
240
|
+
var csn = compiler.compileSources({
|
|
233
241
|
"string.cds": cds
|
|
234
242
|
}, {});
|
|
235
|
-
|
|
236
|
-
|
|
243
|
+
|
|
244
|
+
var edmxOptions = _objectSpread(_objectSpread({
|
|
237
245
|
odataForeignKeys: true,
|
|
238
246
|
odataFormat: "structured",
|
|
239
247
|
odataContainment: false
|
|
248
|
+
}, options), {}, {
|
|
249
|
+
service: service
|
|
240
250
|
});
|
|
241
251
|
|
|
252
|
+
var edmx = compiler.to.edmx(csn, edmxOptions);
|
|
253
|
+
|
|
242
254
|
if (!edmx) {
|
|
243
255
|
throw new Error("Compilation failed. Hint: Make sure that the CDS model defines service ".concat(service, "."));
|
|
244
256
|
}
|
|
@@ -296,7 +308,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
|
|
|
296
308
|
},
|
|
297
309
|
checkIfIssueExists: function (issueCategory, issueSeverity, details) {
|
|
298
310
|
return issues.find(function (issue) {
|
|
299
|
-
issue.issueCategory === issueCategory && issue.issueSeverity === issueSeverity && issue.details === details;
|
|
311
|
+
return issue.issueCategory === issueCategory && issue.issueSeverity === issueSeverity && issue.details === details;
|
|
300
312
|
});
|
|
301
313
|
}
|
|
302
314
|
};
|
|
@@ -462,4 +474,4 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
|
|
|
462
474
|
_exports.getTemplatedXML = getTemplatedXML;
|
|
463
475
|
return _exports;
|
|
464
476
|
}, false);
|
|
465
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwib3V0ZXJIVE1MIiwiZm9ybWF0WG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsInJlZ2lzdGVyTWFjcm8iLCJtYWNyb01ldGFkYXRhIiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwidW5yZWdpc3Rlck1hY3JvIiwicGx1Z0luIiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsInNlbGVjdG9yIiwieG1sZG9tIiwiZXhwZWN0IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJ0b05vdEhhdmVDb250cm9sIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJ4bWxGb3JtYXR0ZWQiLCJmb3JtYXRYTUwiLCJyZXBsYWNlIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZm9ybWF0IiwieG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5IiwiY29tcGlsZUNEUyIsInNDRFNVcmwiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImVkbXhVcmwiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsImNzbiIsImNvbXBpbGVTb3VyY2VzIiwiZWRteCIsInRvIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsIm9NZXRhTW9kZWwiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsIlNpZGVFZmZlY3RzRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwidGhlbiIsIm9TZXJ2aWNlSW5zdGFuY2UiLCJvSmVzdFNpZGVFZmZlY3RzU2VydmljZSIsImdldEludGVyZmFjZSIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwicHVzaCIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwiY29udmVydGVkVHlwZXMiLCJtYW5pZmVzdFNldHRpbmdzIiwiZW50aXR5U2V0IiwiZW50aXR5U2V0cyIsImVzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwic01ldGFkYXRhVXJsIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwidW5kZWZpbmVkIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsIm5hbWVkTW9kZWxzQ29udGVudCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5IiwiZGVmYXVsdE1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsIk9iamVjdCIsImVudHJpZXMiLCJjb250ZW50IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwieG1sRG9jIiwiaGFzT3duUHJvcGVydHkiLCJhc3NpZ24iLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1ldGFNb2RlbCIsInNLZXkiLCJnZXRPYmplY3QiLCJ0b0JlRGVm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QTFELENBQWhEO0FBQ0E7O0FBRUQsZUFBT0MsZUFBZSxDQUFDQyxPQUFoQixDQUF3Qm1LLE1BQU0sQ0FBQ2xLLGlCQUEvQixFQUFtRDtBQUFFbEIsVUFBQUEsSUFBSSxFQUFFO0FBQVIsU0FBbkQsRUFBOEU2TCxxQkFBOUUsQ0FBUDtBQTFDQztBQTJDRCxLQWhEK0I7QUFBQTtBQUFBO0FBQUEsR0FBekI7Ozs7QUFrREEsTUFBTU0sZUFBZSxhQUMzQm5CLFFBRDJCLEVBRTNCdEMsWUFGMkIsRUFHM0J1QyxnQkFIMkIsRUFJM0JDLE9BSjJCO0FBQUEsUUFLMUI7QUFBQSw2QkFDMEJILG1CQUFtQixDQUFDQyxRQUFELEVBQVd0QyxZQUFYLEVBQXlCdUMsZ0JBQXpCLEVBQTJDQyxPQUEzQyxDQUQ3QyxPQUVNekgsWUFGTjtBQUdELEtBUjJCO0FBQUE7QUFBQTtBQUFBLEdBQXJCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29tcGlsZVNvdXJjZXMsIHRvIH0gZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdCwgUmVxdWlyZWRPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNGYWN0b3J5IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgSW52aXNpYmxlVGV4dCBmcm9tIFwic2FwL3VpL2NvcmUvSW52aXNpYmxlVGV4dFwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgX01ldGFkYXRhUmVxdWVzdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliL19NZXRhZGF0YVJlcXVlc3RvclwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBmb3JtYXRYbWwgPSByZXF1aXJlKFwieG1sLWZvcm1hdHRlclwiKTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwID0ge1xuXHRcIm1hY3Jvc1wiOiBcInNhcC5mZS5tYWNyb3NcIixcblx0XCJtYWNyb1wiOiBcInNhcC5mZS5tYWNyb3NcIixcblx0XCJtYWNyb2RhdGFcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdFwibG9nXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcInVuaXR0ZXN0XCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvcHJlcHJvY2Vzc29yZXh0ZW5zaW9uL3NhcC5mZS51bml0dGVzdGluZy8xXCIsXG5cdFwiY29udHJvbFwiOiBcInNhcC5mZS5jb3JlLmNvbnRyb2xzXCIsXG5cdFwiY29yZVwiOiBcInNhcC51aS5jb3JlXCIsXG5cdFwibVwiOiBcInNhcC5tXCIsXG5cdFwiZlwiOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRcImludGVybmFsTWFjcm9cIjogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdFwibWRjXCI6IFwic2FwLnVpLm1kY1wiLFxuXHRcIm1kY2F0XCI6IFwic2FwLnVpLm1kYy5hY3Rpb250b29sYmFyXCIsXG5cdFwibWRjRmllbGRcIjogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFwibWRjVGFibGVcIjogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdFwidVwiOiBcInNhcC51aS51bmlmaWVkXCIsXG5cdFwibWFjcm9NaWNyb0NoYXJ0XCI6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdFwibWljcm9DaGFydFwiOiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdFwibWFjcm9UYWJsZVwiOiBcInNhcC5mZS5tYWNyb3MudGFibGVcIlxufTtcbmNvbnN0IHNlbGVjdCA9IHhwYXRoLnVzZU5hbWVzcGFjZXMobmFtZVNwYWNlTWFwKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbiAobWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhtYWNyb01ldGFkYXRhKTtcbn07XG5leHBvcnQgY29uc3QgdW5yZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24gKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKG51bGwsIG1hY3JvTWV0YWRhdGEubmFtZXNwYWNlLCBtYWNyb01ldGFkYXRhLm5hbWUpO1xuXHRpZiAobWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKG51bGwsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlLCBtYWNyb01ldGFkYXRhLm5hbWUpO1xuXHR9XG59O1xuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbiAoc2VsZWN0b3I6IHN0cmluZywgeG1sZG9tOiBOb2RlIHwgdW5kZWZpbmVkKSB7XG5cdHJldHVybiBzZWxlY3Qoc2VsZWN0b3IsIHhtbGRvbSk7XG59O1xuXG5leHBlY3QuZXh0ZW5kKHtcblx0dG9IYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KGAvcm9vdCR7c2VsZWN0b3J9YCwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBkaWQgbm90IGZpbmQgY29udHJvbHMgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPj0gMVxuXHRcdH07XG5cdH0sXG5cdHRvTm90SGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgVGhlcmUgaXMgYSBjb250cm9sIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID09PSAwXG5cdFx0fTtcblx0fVxufSk7XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRCdWlsZGluZ0Jsb2NrWE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nIHwgc3RyaW5nW10pIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoeG1sU3RyaW5nKSkge1xuXHRcdHhtbFN0cmluZyA9IHhtbFN0cmluZy5qb2luKFwiXCIpO1xuXHR9XG5cdGxldCB4bWxGb3JtYXR0ZWQgPSBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcblx0eG1sRm9ybWF0dGVkID0geG1sRm9ybWF0dGVkLnJlcGxhY2UoL3VpZC0taWQtWzAtOV17MTN9LVswLTldL2csIFwidWlkLS1pZFwiKTtcblx0cmV0dXJuIHhtbEZvcm1hdHRlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5jb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBmb3JtYXQoXG5cdFx0eG1sU3RyaW5nLFxuXHRcdHsgcGFyc2VyOiBcInhtbFwiLCB4bWxXaGl0ZXNwYWNlU2Vuc2l0aXZpdHk6IFwiaWdub3JlXCIgfSBhcyBQYXJ0aWFsPFJlcXVpcmVkT3B0aW9ucz4gLyogb3B0aW9ucyBieSB0aGUgUHJldHRpZXIgWE1MIHBsdWdpbiAqL1xuXHQpO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgQ0RTIGZpbGUgaW50byBhbiBFRE1YIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNDRFNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBNVVNUIGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKHNDRFNVcmw6IHN0cmluZykge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoc0NEU1VybCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgZWRteENvbnRlbnQgPSBjZHMyZWRteChjZHNTdHJpbmcsIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIik7XG5cdGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShzQ0RTVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXHRjb25zdCBlZG14VXJsID0gcGF0aC5yZXNvbHZlKGRpciwgcGF0aC5iYXNlbmFtZShzQ0RTVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIi54bWxcIikpO1xuXG5cdGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG5cdFx0ZnMubWtkaXJTeW5jKGRpcik7XG5cdH1cblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhVcmwsIGVkbXhDb250ZW50KTtcblx0cmV0dXJuIGVkbXhVcmw7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgQ0RTIHRvIEVETVguXG4gKlxuICogQHBhcmFtIGNkcyBUaGUgQ0RTIG1vZGVsLiBJdCBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgc2VydmljZS5cbiAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSB0byBjb21waWxlLiBEZWZhdWx0cyB0byBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIuXG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBtb2RlbCBhcyBFRE1YLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2RzMmVkbXgoY2RzOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZyA9IFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIikge1xuXHRjb25zdCBjc24gPSBjb21waWxlU291cmNlcyh7IFwic3RyaW5nLmNkc1wiOiBjZHMgfSwge30pO1xuXHRjb25zdCBlZG14ID0gdG8uZWRteChjc24sIHsgc2VydmljZTogc2VydmljZSwgb2RhdGFGb3JlaWduS2V5czogdHJ1ZSwgb2RhdGFGb3JtYXQ6IFwic3RydWN0dXJlZFwiLCBvZGF0YUNvbnRhaW5tZW50OiBmYWxzZSB9KTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH07XG5cdHJldHVybiBuZXcgU2lkZUVmZmVjdHNGYWN0b3J5KCkuY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0KS50aGVuKGZ1bmN0aW9uIChvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNjb3BlT2JqZWN0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24gKCk6IElEaWFnbm9zdGljcyB7XG5cdGNvbnN0IGlzc3VlczogYW55W10gPSBbXTtcblx0cmV0dXJuIHtcblx0XHRhZGRJc3N1ZShpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGlzc3Vlcy5wdXNoKHtcblx0XHRcdFx0aXNzdWVDYXRlZ29yeSxcblx0XHRcdFx0aXNzdWVTZXZlcml0eSxcblx0XHRcdFx0ZGV0YWlsc1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRnZXRJc3N1ZXMoKTogYW55W10ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcztcblx0XHR9LFxuXHRcdGNoZWNrSWZJc3N1ZUV4aXN0cyhpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBpc3N1ZXMuZmluZCgoaXNzdWUpID0+IHtcblx0XHRcdFx0aXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRUeXBlcy5lbnRpdHlTZXRzLmZpbmQoKGVzKSA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgY29udmVydGVkVHlwZXMsIGVudGl0eVNldCk7XG5cdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGg7XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ1N0cmluZyBUaGUgYmluZGluZyBzdHJpbmcuXG4gKiBAcGFyYW0gbW9kZWxDb250ZW50IENvbnRlbnQgb2YgdGhlIGRlZmF1bHQgbW9kZWwgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIG5hbWVkTW9kZWxzQ29udGVudCBDb250ZW50cyBvZiBhZGRpdGlvbmFsLCBuYW1lZCBtb2RlbHMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIGV2YWx1YXRlZCBiaW5kaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsKFxuXHRiaW5kaW5nU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsQ29udGVudDogTW9kZWxDb250ZW50LFxuXHRuYW1lZE1vZGVsc0NvbnRlbnQ/OiB7IFttb2RlbE5hbWU6IHN0cmluZ106IE1vZGVsQ29udGVudCB9XG4pOiBzdHJpbmcge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cblx0Y29uc3QgZGVmYXVsdE1vZGVsID0gbmV3IEpTT05Nb2RlbChtb2RlbENvbnRlbnQpO1xuXHR0ZXh0LnNldE1vZGVsKGRlZmF1bHRNb2RlbCk7XG5cdHRleHQuc2V0QmluZGluZ0NvbnRleHQoZGVmYXVsdE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0KTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0LCBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGV4dC5nZXRUZXh0KCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0aW5nUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblxuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGlmICghbU1vZGVscy5oYXNPd25Qcm9wZXJ0eShcImNvbnZlcnRlckNvbnRleHRcIikpIHtcblx0XHRtTW9kZWxzID0gT2JqZWN0LmFzc2lnbihtTW9kZWxzLCB7IFwiY29udmVydGVyQ29udGV4dFwiOiBuZXcgVGVtcGxhdGVNb2RlbCh7fSwgb01ldGFNb2RlbCkgfSk7XG5cdH1cblxuXHRPYmplY3Qua2V5cyhtTW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdC8qIEFzc2VydCB0byBtYWtlIHN1cmUgdGhlIGFubm90YXRpb25zIGFyZSBpbiB0aGUgdGVzdCBtZXRhZGF0YSAtPiBhdm9pZCBtaXNsZWFkaW5nIHRlc3RzICovXG5cdFx0ZXhwZWN0KHR5cGVvZiBvTWV0YU1vZGVsLmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzS2V5XSA9IG9Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChtQmluZGluZ0NvbnRleHRzW3NLZXldKTsgLy9WYWx1ZSBpcyBzUGF0aFxuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXG5cdC8vVGhpcyBjb250ZXh0IGZvciBtYWNybyB0ZXN0aW5nXG5cdGlmIChvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXSkge1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbXCJ0aGlzXCJdID0gb1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cblx0cmV0dXJuIFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhNTCA9IGF3YWl0IGdldFRlbXBsYXRpbmdSZXN1bHQoeG1sSW5wdXQsIHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscyk7XG5cdHJldHVybiBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MKTtcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIFhNTCBmcmFnbWVudCB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gdGVzdERhdGEgVGVzdCBkYXRhIGNvbnNpc3RpbmdcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCBmcmFnbWVudCBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFnbWVudChuYW1lOiBzdHJpbmcsIHRlc3REYXRhOiB7IFttb2RlbDogc3RyaW5nXTogb2JqZWN0IH0pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRjb25zdCBpbnB1dFhtbCA9IGA8cm9vdD48Y29yZTpGcmFnbWVudCBmcmFnbWVudE5hbWU9XCIke25hbWV9XCIgdHlwZT1cIlhNTFwiIHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiIC8+PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IGlucHV0RG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhpbnB1dFhtbCwgXCJ0ZXh0L3htbFwiKTtcblxuXHQvLyBidWlsZCBtb2RlbCBhbmQgYmluZGluZ3MgZm9yIGdpdmVuIHRlc3QgZGF0YVxuXHRjb25zdCBzZXR0aW5ncyA9IHtcblx0XHRtb2RlbHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRqc29uTW9kZWwuc2V0RGF0YSh0ZXN0RGF0YVttb2RlbF0pO1xuXHRcdHNldHRpbmdzLm1vZGVsc1ttb2RlbF0gPSBqc29uTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW21vZGVsXSA9IHNldHRpbmdzLm1vZGVsc1ttb2RlbF0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQ7XG5cdH1cblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIik7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHQvLyBLZWVwIHRoZSBmcmFnbWVudCByZXN1bHQgYXMgY2hpbGQgb2Ygcm9vdCBub2RlIHdoZW4gZnJhZ21lbnQgZ2VuZXJhdGVzIG11bHRpcGxlIHJvb3QgY29udHJvbHNcblx0Y29uc3QgeG1sUmVzdWx0ID0gcmVzdWx0RG9jLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyByZXN1bHREb2Mub3V0ZXJIVE1MIDogcmVzdWx0RG9jLmlubmVySFRNTDtcblxuXHRyZXR1cm4gZm9ybWF0WG1sKHhtbFJlc3VsdCwge1xuXHRcdGZpbHRlcjogKG5vZGU6IGFueSkgPT4gbm9kZS50eXBlICE9PSBcIkNvbW1lbnRcIlxuXHR9KTtcbn1cbiJdfQ==
|
|
477
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwib3V0ZXJIVE1MIiwiZm9ybWF0WG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsInJlZ2lzdGVyTWFjcm8iLCJtYWNyb01ldGFkYXRhIiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwidW5yZWdpc3Rlck1hY3JvIiwicGx1Z0luIiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsInNlbGVjdG9yIiwieG1sZG9tIiwiZXhwZWN0IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJ0b05vdEhhdmVDb250cm9sIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJ4bWxGb3JtYXR0ZWQiLCJmb3JtYXRYTUwiLCJyZXBsYWNlIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZm9ybWF0IiwieG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5IiwiY29tcGlsZUNEUyIsImNkc1VybCIsIm9wdGlvbnMiLCJlZG14RmlsZU5hbWUiLCJwYXRoIiwiYmFzZW5hbWUiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJyZXNvbHZlIiwiZWRteEZpbGVQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwid3JpdGVGaWxlU3luYyIsImNkcyIsInNlcnZpY2UiLCJjc24iLCJjb21waWxlciIsImNvbXBpbGVTb3VyY2VzIiwiZWRteE9wdGlvbnMiLCJvZGF0YUZvcmVpZ25LZXlzIiwib2RhdGFGb3JtYXQiLCJvZGF0YUNvbnRhaW5tZW50IiwiZWRteCIsInRvIiwiRXJyb3IiLCJnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsIm9TZXJ2aWNlQ29udGV4dCIsInNjb3BlT2JqZWN0Iiwic2NvcGVUeXBlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJzTWV0YWRhdGFVcmwiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJ1bmRlZmluZWQiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwibmFtZWRNb2RlbHNDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJkZWZhdWx0TW9kZWwiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiT2JqZWN0IiwiZW50cmllcyIsImNvbnRlbnQiLCJnZXRUZXh0IiwiZ2V0VGVtcGxhdGluZ1Jlc3VsdCIsInhtbElucHV0IiwibUJpbmRpbmdDb250ZXh0cyIsIm1Nb2RlbHMiLCJ0ZW1wbGF0ZWRYbWwiLCJ4bWxEb2MiLCJoYXNPd25Qcm9wZXJ0eSIsImFzc2lnbiIsIlRlbXBsYXRlTW9kZWwiLCJrZXlzIiwiZm9yRWFjaCIsInNNb2RlbE5hbWUiLCJpc1RlbXBsYXRlTW9kZWwiLCJkYXRhIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwibWV0YU1vZGVsIiwic0tleSIsImdldE9iamVjdCIsInRvQmVEZWZpbmVkIiwib01vZGVsIiwiZ2V0VGVtcGxhdGVkWE1MIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ3NCQSxlLGFBQWdCQyxJLEVBQWNDLFE7UUFBd0Q7QUFDM0csVUFBTUMsUUFBUSxpREFBeUNGLElBQXpDLHlEQUFkO0FBQ0EsVUFBTUcsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsU0FBWCxFQUFmO0FBQ0EsVUFBTUMsUUFBUSxHQUFHSCxNQUFNLENBQUNJLGVBQVAsQ0FBdUJMLFFBQXZCLEVBQWlDLFVBQWpDLENBQWpCLENBSDJHLENBSzNHOztBQUNBLFVBQU1NLFFBQVEsR0FBRztBQUNoQkMsUUFBQUEsTUFBTSxFQUFFLEVBRFE7QUFFaEJDLFFBQUFBLGVBQWUsRUFBRTtBQUZELE9BQWpCOztBQUlBLFdBQUssSUFBTUMsT0FBWCxJQUFvQlYsUUFBcEIsRUFBOEI7QUFDN0IsWUFBTVcsU0FBUyxHQUFHLElBQUlDLFNBQUosRUFBbEI7QUFDQUQsUUFBQUEsU0FBUyxDQUFDRSxPQUFWLENBQWtCYixRQUFRLENBQUNVLE9BQUQsQ0FBMUI7QUFDQUgsUUFBQUEsUUFBUSxDQUFDQyxNQUFULENBQWdCRSxPQUFoQixJQUF5QkMsU0FBekI7QUFDQUosUUFBQUEsUUFBUSxDQUFDRSxlQUFULENBQXlCQyxPQUF6QixJQUFrQ0gsUUFBUSxDQUFDQyxNQUFULENBQWdCRSxPQUFoQixFQUF1Qkksb0JBQXZCLENBQTRDLEdBQTVDLENBQWxDO0FBQ0EsT0FmMEcsQ0FpQjNHOzs7QUFqQjJHLDZCQWtCbkZDLGVBQWUsQ0FBQ0MsT0FBaEIsQ0FBd0JYLFFBQVEsQ0FBQ1ksaUJBQWpDLEVBQW9EO0FBQUVsQixRQUFBQSxJQUFJLEVBQUpBO0FBQUYsT0FBcEQsRUFBOERRLFFBQTlELENBbEJtRixp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QUN4TCxNQUF0QixDQUE2QjBMLElBQTdCLElBQXFDRyxNQUFyQztBQUNBLFNBTkQsRUE3QkMsQ0FxQ0Q7O0FBQ0EsWUFBSUwscUJBQXFCLENBQUN4TCxNQUF0QixDQUE2QixNQUE3QixDQUFKLEVBQTBDO0FBQ3pDd0wsVUFBQUEscUJBQXFCLENBQUN2TCxlQUF0QixDQUFzQyxNQUF0QyxJQUFnRHVMLHFCQUFxQixDQUFDeEwsTUFBdEIsQ0FBNkIsTUFBN0IsRUFBcUNNLG9CQUFyQyxDQUEwRCxHQUExRCxDQUFoRDtBQUNBOztBQUVELGVBQU9DLGVBQWUsQ0FBQ0MsT0FBaEIsQ0FBd0J1SyxNQUFNLENBQUN0SyxpQkFBL0IsRUFBbUQ7QUFBRWxCLFVBQUFBLElBQUksRUFBRTtBQUFSLFNBQW5ELEVBQThFaU0scUJBQTlFLENBQVA7QUExQ0M7QUEyQ0QsS0FoRCtCO0FBQUE7QUFBQTtBQUFBLEdBQXpCOzs7O0FBa0RBLE1BQU1NLGVBQWUsYUFDM0JuQixRQUQyQixFQUUzQnRDLFlBRjJCLEVBRzNCdUMsZ0JBSDJCLEVBSTNCQyxPQUoyQjtBQUFBLFFBSzFCO0FBQUEsNkJBQzBCSCxtQkFBbUIsQ0FBQ0MsUUFBRCxFQUFXdEMsWUFBWCxFQUF5QnVDLGdCQUF6QixFQUEyQ0MsT0FBM0MsQ0FEN0MsT0FFTTdILFlBRk47QUFHRCxLQVIyQjtBQUFBO0FBQUE7QUFBQSxHQUFyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZWRNZXRhZGF0YSwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IGNvbXBpbGVyIGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVpcmVkT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNGYWN0b3J5IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0XCJtYWNyb3NcIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9cIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9kYXRhXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcImxvZ1wiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJ1bml0dGVzdFwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L3ByZXByb2Nlc3NvcmV4dGVuc2lvbi9zYXAuZmUudW5pdHRlc3RpbmcvMVwiLFxuXHRcImNvbnRyb2xcIjogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRcImNvcmVcIjogXCJzYXAudWkuY29yZVwiLFxuXHRcIm1cIjogXCJzYXAubVwiLFxuXHRcImZcIjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0XCJpbnRlcm5hbE1hY3JvXCI6IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRcIm1kY1wiOiBcInNhcC51aS5tZGNcIixcblx0XCJtZGNhdFwiOiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRcIm1kY0ZpZWxkXCI6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRcIm1kY1RhYmxlXCI6IFwic2FwLnVpLm1kYy50YWJsZVwiLFxuXHRcInVcIjogXCJzYXAudWkudW5pZmllZFwiLFxuXHRcIm1hY3JvTWljcm9DaGFydFwiOiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRcIm1pY3JvQ2hhcnRcIjogXCJzYXAuc3VpdGUudWkubWljcm9jaGFydFwiLFxuXHRcIm1hY3JvVGFibGVcIjogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24gKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRyZWdpc3RlckJ1aWxkaW5nQmxvY2sobWFjcm9NZXRhZGF0YSk7XG59O1xuZXhwb3J0IGNvbnN0IHVucmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uIChtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0fVxufTtcbmV4cG9ydCBjb25zdCBydW5YUGF0aFF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRsZXQgeG1sRm9ybWF0dGVkID0gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG5cdHhtbEZvcm1hdHRlZCA9IHhtbEZvcm1hdHRlZC5yZXBsYWNlKC91aWQtLWlkLVswLTldezEzfS1bMC05XS9nLCBcInVpZC0taWRcIik7XG5cdHJldHVybiB4bWxGb3JtYXR0ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKC9yb290JHtjb250cm9sU2VsZWN0b3J9L0Ake2F0dHJpYnV0ZU5hbWV9KWA7XG5cdHJldHVybiBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pO1xufTtcblxuY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24gKHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGNvbnN0IHhtbFN0cmluZyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9tKTtcblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFhNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gZm9ybWF0KFxuXHRcdHhtbFN0cmluZyxcblx0XHR7IHBhcnNlcjogXCJ4bWxcIiwgeG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5OiBcImlnbm9yZVwiIH0gYXMgUGFydGlhbDxSZXF1aXJlZE9wdGlvbnM+IC8qIG9wdGlvbnMgYnkgdGhlIFByZXR0aWVyIFhNTCBwbHVnaW4gKi9cblx0KTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcGFyYW0gZWRteEZpbGVOYW1lIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIEVETVggbWV0YWRhdGEgZmlsZVxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKFxuXHRjZHNVcmw6IHN0cmluZyxcblx0b3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30sXG5cdGVkbXhGaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoY2RzVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIi54bWxcIilcbikge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY2RzVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBlZG14Q29udGVudCA9IGNkczJlZG14KGNkc1N0cmluZywgXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zKTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKGNkc1VybCwgXCIuLlwiLCBcImdlblwiKTtcblxuXHRjb25zdCBlZG14RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyLCBlZG14RmlsZU5hbWUpO1xuXG5cdGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGZzLndyaXRlRmlsZVN5bmMoZWRteEZpbGVQYXRoLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14RmlsZVBhdGg7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgQ0RTIHRvIEVETVguXG4gKlxuICogQHBhcmFtIGNkcyBUaGUgQ0RTIG1vZGVsLiBJdCBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgc2VydmljZS5cbiAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSB0byBiZSBjb21waWxlZC4gRGVmYXVsdHMgdG8gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBtb2RlbCBhcyBFRE1YLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2RzMmVkbXgoY2RzOiBzdHJpbmcsIHNlcnZpY2UgPSBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVyLmNvbXBpbGVTb3VyY2VzKHsgXCJzdHJpbmcuY2RzXCI6IGNkcyB9LCB7fSk7XG5cblx0Y29uc3QgZWRteE9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHtcblx0XHRvZGF0YUZvcmVpZ25LZXlzOiB0cnVlLFxuXHRcdG9kYXRhRm9ybWF0OiBcInN0cnVjdHVyZWRcIixcblx0XHRvZGF0YUNvbnRhaW5tZW50OiBmYWxzZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH07XG5cdHJldHVybiBuZXcgU2lkZUVmZmVjdHNGYWN0b3J5KCkuY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0KS50aGVuKGZ1bmN0aW9uIChvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNjb3BlT2JqZWN0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24gKCk6IElEaWFnbm9zdGljcyB7XG5cdGNvbnN0IGlzc3VlczogYW55W10gPSBbXTtcblx0cmV0dXJuIHtcblx0XHRhZGRJc3N1ZShpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGlzc3Vlcy5wdXNoKHtcblx0XHRcdFx0aXNzdWVDYXRlZ29yeSxcblx0XHRcdFx0aXNzdWVTZXZlcml0eSxcblx0XHRcdFx0ZGV0YWlsc1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRnZXRJc3N1ZXMoKTogYW55W10ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcztcblx0XHR9LFxuXHRcdGNoZWNrSWZJc3N1ZUV4aXN0cyhpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBpc3N1ZXMuZmluZCgoaXNzdWUpID0+IHtcblx0XHRcdFx0cmV0dXJuIGlzc3VlLmlzc3VlQ2F0ZWdvcnkgPT09IGlzc3VlQ2F0ZWdvcnkgJiYgaXNzdWUuaXNzdWVTZXZlcml0eSA9PT0gaXNzdWVTZXZlcml0eSAmJiBpc3N1ZS5kZXRhaWxzID09PSBkZXRhaWxzO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRUeXBlcy5lbnRpdHlTZXRzLmZpbmQoKGVzKSA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgY29udmVydGVkVHlwZXMsIGVudGl0eVNldCk7XG5cdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQsIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhtbCA9IGA8cm9vdD4ke3htbElucHV0fTwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlZFhtbCwgXCJ0ZXh0L3htbFwiKTtcblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0aWYgKCFtTW9kZWxzLmhhc093blByb3BlcnR5KFwiY29udmVydGVyQ29udGV4dFwiKSkge1xuXHRcdG1Nb2RlbHMgPSBPYmplY3QuYXNzaWduKG1Nb2RlbHMsIHsgXCJjb252ZXJ0ZXJDb250ZXh0XCI6IG5ldyBUZW1wbGF0ZU1vZGVsKHt9LCBvTWV0YU1vZGVsKSB9KTtcblx0fVxuXG5cdE9iamVjdC5rZXlzKG1Nb2RlbHMpLmZvckVhY2goZnVuY3Rpb24gKHNNb2RlbE5hbWUpIHtcblx0XHRpZiAobU1vZGVsc1tzTW9kZWxOYW1lXSAmJiBtTW9kZWxzW3NNb2RlbE5hbWVdLmlzVGVtcGxhdGVNb2RlbCkge1xuXHRcdFx0bU1vZGVsc1tzTW9kZWxOYW1lXSA9IG5ldyBUZW1wbGF0ZU1vZGVsKG1Nb2RlbHNbc01vZGVsTmFtZV0uZGF0YSwgb01ldGFNb2RlbCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3M6IGFueSA9IHtcblx0XHRtb2RlbHM6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7XG5cdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0fSxcblx0XHRcdG1Nb2RlbHNcblx0XHQpLFxuXHRcdGJpbmRpbmdDb250ZXh0czoge31cblx0fTtcblxuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tzS2V5XSA9IG9Nb2RlbDtcblx0fSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRyZXR1cm4gWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdCh4bWxJbnB1dCwgc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0cmV0dXJuIHNlcmlhbGl6ZVhNTCh0ZW1wbGF0ZWRYTUwpO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGJlIHRlc3RlZC5cbiAqIEBwYXJhbSB0ZXN0RGF0YSBUZXN0IGRhdGEgY29uc2lzdGluZ1xuICogQHJldHVybnMgVGVtcGxhdGVkIGZyYWdtZW50IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYWdtZW50KG5hbWU6IHN0cmluZywgdGVzdERhdGE6IHsgW21vZGVsOiBzdHJpbmddOiBvYmplY3QgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdGNvbnN0IGlucHV0WG1sID0gYDxyb290Pjxjb3JlOkZyYWdtZW50IGZyYWdtZW50TmFtZT1cIiR7bmFtZX1cIiB0eXBlPVwiWE1MXCIgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCIgLz48L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgaW5wdXREb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGlucHV0WG1sLCBcInRleHQveG1sXCIpO1xuXG5cdC8vIGJ1aWxkIG1vZGVsIGFuZCBiaW5kaW5ncyBmb3IgZ2l2ZW4gdGVzdCBkYXRhXG5cdGNvbnN0IHNldHRpbmdzID0ge1xuXHRcdG1vZGVsczoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogSlNPTk1vZGVsIH0sXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBvYmplY3QgfVxuXHR9O1xuXHRmb3IgKGNvbnN0IG1vZGVsIGluIHRlc3REYXRhKSB7XG5cdFx0Y29uc3QganNvbk1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0fVxuXG5cdC8vIGV4ZWN1dGUgdGhlIHByZS1wcm9jZXNzb3Jcblx0Y29uc3QgcmVzdWx0RG9jID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXREb2MuZmlyc3RFbGVtZW50Q2hpbGQsIHsgbmFtZSB9LCBzZXR0aW5ncyk7XG5cblx0Ly8gZXhjbHVkZSBuZXN0ZWQgZnJhZ21lbnRzIGZyb20gdGVzdCBzbmFwc2hvdHNcblx0Y29uc3QgZnJhZ21lbnRzID0gcmVzdWx0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29yZTpGcmFnbWVudFwiKTtcblx0aWYgKGZyYWdtZW50cz8ubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRmcmFnbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdC8vIEtlZXAgdGhlIGZyYWdtZW50IHJlc3VsdCBhcyBjaGlsZCBvZiByb290IG5vZGUgd2hlbiBmcmFnbWVudCBnZW5lcmF0ZXMgbXVsdGlwbGUgcm9vdCBjb250cm9sc1xuXHRjb25zdCB4bWxSZXN1bHQgPSByZXN1bHREb2MuY2hpbGRyZW4ubGVuZ3RoID4gMSA/IHJlc3VsdERvYy5vdXRlckhUTUwgOiByZXN1bHREb2MuaW5uZXJIVE1MO1xuXG5cdHJldHVybiBmb3JtYXRYbWwoeG1sUmVzdWx0LCB7XG5cdFx0ZmlsdGVyOiAobm9kZTogYW55KSA9PiBub2RlLnR5cGUgIT09IFwiQ29tbWVudFwiXG5cdH0pO1xufVxuIl19
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { AnyAnnotation,
|
|
2
|
-
import
|
|
1
|
+
import type { AnyAnnotation, ConvertedMetadata, EntitySet, Property } from "@sap-ux/vocabularies-types";
|
|
2
|
+
import compiler from "@sap/cds-compiler";
|
|
3
3
|
import * as fs from "fs";
|
|
4
4
|
import * as path from "path";
|
|
5
|
-
import {
|
|
5
|
+
import type { RequiredOptions } from "prettier";
|
|
6
|
+
import { format } from "prettier";
|
|
6
7
|
import Log from "sap/base/Log";
|
|
7
8
|
import merge from "sap/base/util/merge";
|
|
8
9
|
import { registerBuildingBlock } from "sap/fe/core/buildingBlocks/BuildingBlockRuntime";
|
|
9
10
|
import ConverterContext from "sap/fe/core/converters/ConverterContext";
|
|
10
|
-
import { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
|
|
11
|
-
import { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
|
|
12
|
-
import { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
|
|
11
|
+
import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
|
|
12
|
+
import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
|
|
13
|
+
import type { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
|
|
13
14
|
import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
|
|
14
15
|
import TemplateModel from "sap/fe/core/TemplateModel";
|
|
15
|
-
import { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
|
|
16
|
+
import type { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
|
|
16
17
|
import BindingParser from "sap/ui/base/BindingParser";
|
|
17
18
|
import InvisibleText from "sap/ui/core/InvisibleText";
|
|
18
19
|
import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
|
|
19
|
-
import Context from "sap/ui/model/Context";
|
|
20
|
+
import type Context from "sap/ui/model/Context";
|
|
20
21
|
import JSONModel from "sap/ui/model/json/JSONModel";
|
|
21
22
|
import _MetadataRequestor from "sap/ui/model/odata/v4/lib/_MetadataRequestor";
|
|
22
23
|
import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
|
|
@@ -115,34 +116,49 @@ export const formatXML = function (xmlString: string) {
|
|
|
115
116
|
/**
|
|
116
117
|
* Compile a CDS file into an EDMX file.
|
|
117
118
|
*
|
|
118
|
-
* @param
|
|
119
|
+
* @param cdsUrl The path to the file containing the CDS definition. This file must declare the namespace
|
|
119
120
|
* sap.fe.test and a service JestService
|
|
120
|
-
* @
|
|
121
|
+
* @param options Options for creating the EDMX output
|
|
122
|
+
* @param edmxFileName Allows you to override the name of the compiled EDMX metadata file
|
|
123
|
+
* @returns The path of the generated EDMX
|
|
121
124
|
*/
|
|
122
|
-
export const compileCDS = function (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
125
|
+
export const compileCDS = function (
|
|
126
|
+
cdsUrl: string,
|
|
127
|
+
options: compiler.ODataOptions = {},
|
|
128
|
+
edmxFileName = path.basename(cdsUrl).replace(".cds", ".xml")
|
|
129
|
+
) {
|
|
130
|
+
const cdsString = fs.readFileSync(cdsUrl, "utf-8");
|
|
131
|
+
const edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService", options);
|
|
132
|
+
const dir = path.resolve(cdsUrl, "..", "gen");
|
|
133
|
+
|
|
134
|
+
const edmxFilePath = path.resolve(dir, edmxFileName);
|
|
131
135
|
|
|
132
|
-
fs.
|
|
133
|
-
|
|
136
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
137
|
+
|
|
138
|
+
fs.writeFileSync(edmxFilePath, edmxContent);
|
|
139
|
+
return edmxFilePath;
|
|
134
140
|
};
|
|
135
141
|
|
|
136
142
|
/**
|
|
137
143
|
* Compile CDS to EDMX.
|
|
138
144
|
*
|
|
139
145
|
* @param cds The CDS model. It must define at least one service.
|
|
140
|
-
* @param service The fully-qualified name of the service to
|
|
146
|
+
* @param service The fully-qualified name of the service to be compiled. Defaults to "sap.fe.test.JestService".
|
|
147
|
+
* @param options Options for creating the EDMX output
|
|
141
148
|
* @returns The compiled service model as EDMX.
|
|
142
149
|
*/
|
|
143
|
-
export function cds2edmx(cds: string, service
|
|
144
|
-
const csn = compileSources({ "string.cds": cds }, {});
|
|
145
|
-
|
|
150
|
+
export function cds2edmx(cds: string, service = "sap.fe.test.JestService", options: compiler.ODataOptions = {}) {
|
|
151
|
+
const csn = compiler.compileSources({ "string.cds": cds }, {});
|
|
152
|
+
|
|
153
|
+
const edmxOptions: compiler.ODataOptions = {
|
|
154
|
+
odataForeignKeys: true,
|
|
155
|
+
odataFormat: "structured",
|
|
156
|
+
odataContainment: false,
|
|
157
|
+
...options,
|
|
158
|
+
service: service
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const edmx = compiler.to.edmx(csn, edmxOptions);
|
|
146
162
|
if (!edmx) {
|
|
147
163
|
throw new Error(`Compilation failed. Hint: Make sure that the CDS model defines service ${service}.`);
|
|
148
164
|
}
|
|
@@ -185,14 +201,14 @@ export const getFakeDiagnostics = function (): IDiagnostics {
|
|
|
185
201
|
},
|
|
186
202
|
checkIfIssueExists(issueCategory: IssueCategory, issueSeverity: IssueSeverity, details: string): boolean {
|
|
187
203
|
return issues.find((issue) => {
|
|
188
|
-
issue.issueCategory === issueCategory && issue.issueSeverity === issueSeverity && issue.details === details;
|
|
204
|
+
return issue.issueCategory === issueCategory && issue.issueSeverity === issueSeverity && issue.details === details;
|
|
189
205
|
});
|
|
190
206
|
}
|
|
191
207
|
};
|
|
192
208
|
};
|
|
193
209
|
|
|
194
210
|
export const getConverterContextForTest = function (
|
|
195
|
-
convertedTypes:
|
|
211
|
+
convertedTypes: ConvertedMetadata,
|
|
196
212
|
manifestSettings: ListReportManifestSettings | ObjectPageManifestSettings
|
|
197
213
|
) {
|
|
198
214
|
const entitySet = convertedTypes.entitySets.find((es) => es.name === manifestSettings.entitySet);
|
|
@@ -213,7 +229,7 @@ export const getMetaModel = async function (sMetadataUrl: string) {
|
|
|
213
229
|
|
|
214
230
|
export const getDataModelObjectPathForProperty = function (
|
|
215
231
|
entitySet: EntitySet,
|
|
216
|
-
convertedTypes:
|
|
232
|
+
convertedTypes: ConvertedMetadata,
|
|
217
233
|
property?: Property | EntitySet | AnyAnnotation
|
|
218
234
|
): DataModelObjectPath {
|
|
219
235
|
const targetPath: DataModelObjectPath = {
|
|
@@ -332,8 +348,8 @@ export const getTemplatedXML = async function (
|
|
|
332
348
|
/**
|
|
333
349
|
* Process the requested XML fragment with the provided data.
|
|
334
350
|
*
|
|
335
|
-
* @param
|
|
336
|
-
* @param
|
|
351
|
+
* @param name Fully qualified name of the fragment to be tested.
|
|
352
|
+
* @param testData Test data consisting
|
|
337
353
|
* @returns Templated fragment as string
|
|
338
354
|
*/
|
|
339
355
|
export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
|