element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = legacy_1.RPTUtil.getAncestor(ruleContext, "table") != null;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_exists.ts":
+/*!**********************************************!*\
+ !*** ./src/v4/rules/table_headers_exists.ts ***!
+ \**********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_exists = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+exports.table_headers_exists = {
+ id: "table_headers_exists",
+ context: "dom:table",
+ refactor: {
+ "RPT_Table_DataHeadingsAria": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_exists.html",
+ "Fail_1": "table_headers_exists.html",
+ "group": "table_headers_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Table has no headers identified",
+ "group": "Data table must identify headers"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // If this is a layout table or there are no rows, the rule does not apply.
+ var rows = ruleContext.rows;
+ if (!legacy_1.RPTUtil.isDataTable(ruleContext) || rows === null || rows.length === 0)
+ return null;
+ var passed = legacy_1.RPTUtil.tableHeaderExists(ruleContext);
+ if (passed === null)
+ return;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_ref_valid.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_headers_ref_valid.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_ref_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+exports.table_headers_ref_valid = {
+ id: "table_headers_ref_valid",
+ context: "dom:td[headers], dom:th[headers]",
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_ref_valid.html",
+ "Fail_1": "table_headers_ref_valid.html",
+ "Fail_2": "table_headers_ref_valid.html",
+ "Fail_3": "table_headers_ref_valid.html",
+ "Fail_4": "table_headers_ref_valid.html",
+ "group": "table_headers_ref_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",
+ "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself",
+ "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",
+ "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with or a role of \"columnheader\" or \"rowheader\"",
+ "group": "The 'headers' attribute should refer to a valid cell in the same table"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: ["a25f45"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var parentTable = legacy_1.RPTUtil.getAncestor(ruleContext, "table");
+ var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable);
+ // If this is a layout table or a simple table the rule does not apply.
+ if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var doc = ruleContext.ownerDocument;
+ var value = ruleContext.getAttribute("headers");
+ if (!value)
+ return null;
+ var ids = value.split(" ");
+ var invalidHeaderValues = [];
+ var sameNodeHeaderValues = [];
+ var sameTableHeaderValues = [];
+ var invalidElemHeaderValues = [];
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ if (id.trim() === '')
+ continue;
+ var elem = doc.getElementById(id);
+ if (!elem)
+ invalidHeaderValues.push(id);
+ else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext))
+ sameNodeHeaderValues.push(id);
+ else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext))
+ sameTableHeaderValues.push(id);
+ else {
+ var elemName = elem.nodeName.toLowerCase();
+ if (elemName !== 'th') {
+ var roles = legacy_1.RPTUtil.getRoles(elem, true);
+ if (!roles.includes('columnheader') && !roles.includes('rowheader'))
+ invalidElemHeaderValues.push(id);
+ }
+ }
+ }
+ var results = [];
+ if (invalidHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()]));
+ if (sameNodeHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()]));
+ if (sameTableHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()]));
+ if (invalidElemHeaderValues.length != 0)
+ results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()]));
+ if (results.length == 0) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return results;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_headers_related.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/table_headers_related.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_headers_related = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+exports.table_headers_related = {
+ id: "table_headers_related",
+ context: "dom:td, dom:th",
+ refactor: {
+ "Valerie_Table_DataCellRelationships": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_headers_related.html",
+ "Fail_1": "table_headers_related.html",
+ "group": "table_headers_related.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'",
+ "group": "For a complex data table, all and elements must be related via 'header' or 'scope' attributes"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var parentTable = legacy_1.RPTUtil.getAncestor(ruleContext, "table");
+ // If this is a layout table or a simple table the rule does not apply.
+ if (parentTable == null || !legacy_1.RPTUtil.isComplexDataTable(parentTable))
+ return null;
+ // If this table hasn't been preprocessed, process it.
+ if ((0, CacheUtil_1.getCache)(ruleContext, "table_headers_related", null) === null) {
+ // Build a grid that's actually usable (rowspan and colspan elements are duplicated)
+ // This builds a real 2d table array.
+ var grid = [];
+ for (var i = 0; i < parentTable.rows.length; ++i) {
+ var row = parentTable.rows[i];
+ if (!grid[i])
+ grid[i] = [];
+ for (var j = 0; j < row.cells.length; ++j) {
+ var cell = row.cells[j];
+ (0, CacheUtil_1.setCache)(cell, "table_headers_related", i + ":" + j);
+ var width = parseInt(cell.getAttribute("colspan"));
+ if (!width)
+ width = 1;
+ var height = parseInt(cell.getAttribute("rowspan"));
+ if (!height)
+ height = 1;
+ var gX = 0;
+ while (grid[i][gX])
+ gX += 1;
+ for (var k = 0; k < height; ++k) {
+ if (!grid[i + k])
+ grid[i + k] = [];
+ for (var l = 0; l < width; ++l) {
+ grid[i + k][gX + l] = cell;
+ }
+ }
+ }
+ }
+ // Iterate through the table grid and record headers that point to cells and
+ // cells that are pointed to by headers
+ var doc = ruleContext.ownerDocument;
+ var lookup = {};
+ var scopedCols = {};
+ for (var i = 0; i < grid.length; ++i) {
+ var rowScoped = false;
+ for (var j = 0; j < grid[i].length; ++j) {
+ var gridCell = grid[i][j];
+ var gridNodeName = gridCell.nodeName.toLowerCase();
+ if (gridNodeName == "th") {
+ if (gridCell.getAttribute("scope") == "row") {
+ rowScoped = true;
+ // If there's an axis attribute, it must be referred to by headers,
+ // scope is not enough.
+ if (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ else if (gridCell.getAttribute("scope") == "col") {
+ scopedCols[j] = true;
+ // If there's an axis attribute, it must be referred to by headers,
+ // scope is not enough.
+ if (!legacy_1.RPTUtil.attributeNonEmpty(gridCell, "axis"))
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ // Headers can refer to other headers
+ if (legacy_1.RPTUtil.attributeNonEmpty(gridCell, "headers")) {
+ var hdrs = gridCell.getAttribute("headers").split(" ");
+ for (var k = 0; k < hdrs.length; ++k) {
+ var headElem = doc.getElementById(hdrs[k].trim());
+ if (headElem && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ else if (gridNodeName == "td") {
+ if (rowScoped || scopedCols[j]) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(gridCell, "headers")) {
+ var hdrs = gridCell.getAttribute("headers").split(" ");
+ for (var k = 0; k < hdrs.length; ++k) {
+ var headElem = doc.getElementById(hdrs[k].trim());
+ if (headElem && legacy_1.RPTUtil.getAncestor(headElem, "table") == parentTable) {
+ lookup[(0, CacheUtil_1.getCache)(gridCell, "table_headers_related", null)] = true;
+ lookup[(0, CacheUtil_1.getCache)(headElem, "table_headers_related", null)] = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(parentTable, "table_headers_related", lookup);
+ }
+ var rcInfo = (0, CacheUtil_1.getCache)(ruleContext, "table_headers_related", null);
+ var tInfo = (0, CacheUtil_1.getCache)(parentTable, "table_headers_related", null);
+ var passed = rcInfo !== null && tInfo !== null && rcInfo in tInfo;
+ if (!passed && rcInfo === "0:0" &&
+ legacy_1.RPTUtil.getInnerText(ruleContext).trim().length == 0) {
+ // We don't test if it's the upper-left cell and it's empty
+ return null;
+ }
+ // If the table has no th's, it may just be that this was supposed to be a layout
+ // table, which introduces a lot of noise. In that case, only trigger this error
+ // once per table.
+ if (!passed && parentTable.getElementsByTagName("th").length == 0) {
+ if ((0, CacheUtil_1.getCache)(parentTable, "table_headers_related_TrigOnce", false) === true) {
+ passed = true;
+ }
+ else {
+ (0, CacheUtil_1.setCache)(parentTable, "table_headers_related_TrigOnce", true);
+ }
+ }
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_layout_linearized.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_layout_linearized.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_layout_linearized = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.table_layout_linearized = {
+ id: "table_layout_linearized",
+ context: "dom:table",
+ refactor: {
+ "RPT_Table_LayoutTrigger": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_layout_linearized.html",
+ "Potential_1": "table_layout_linearized.html",
+ "group": "table_layout_linearized.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized",
+ "group": "Avoid using tables to format text documents in columns unless the table can be linearized"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = !legacy_1.RPTUtil.isLayoutTable(ruleContext);
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_scope_valid.ts":
+/*!*******************************************!*\
+ !*** ./src/v4/rules/table_scope_valid.ts ***!
+ \*******************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_scope_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+exports.table_scope_valid = {
+ id: "table_scope_valid",
+ context: "dom:td[scope], dom:th[scope]",
+ refactor: {
+ "WCAG20_Table_Scope_Valid": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_scope_valid.html",
+ "Fail_1": "table_scope_valid.html",
+ "Fail_2": "table_scope_valid.html",
+ "group": "table_scope_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Value provided is invalid for the 'scope' attribute",
+ "Fail_2": "The 'scope' attribute should only be used on a element",
+ "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (nodeName === 'td')
+ return (0, IRule_1.RuleFail)("Fail_2");
+ //only continue for 'th'
+ var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase();
+ var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_structure_misuse.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/table_structure_misuse.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_structure_misuse = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.table_structure_misuse = {
+ id: "table_structure_misuse",
+ context: "dom:table",
+ refactor: {
+ "WCAG20_Table_Structure": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_structure_misuse.html",
+ "Fail_1": "table_structure_misuse.html",
+ "group": "table_structure_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'",
+ "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - OUT OF SCOPE hidden in context
+ if (legacy_1.RPTUtil.isDataTable(ruleContext))
+ return null;
+ if (legacy_1.RPTUtil.isNodeInGrid(ruleContext))
+ return null;
+ var errorNodes = [];
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "summary"))
+ errorNodes.push(ruleContext);
+ var captionElems = ruleContext.getElementsByTagName("caption");
+ for (var i = 0; i < captionElems.length; ++i) {
+ if (legacy_1.RPTUtil.getAncestor(captionElems[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(captionElems[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(captionElems[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ var thNodes = ruleContext.getElementsByTagName("th");
+ for (var i = 0; i < thNodes.length; ++i) {
+ if (legacy_1.RPTUtil.getAncestor(thNodes[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(thNodes[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(thNodes[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ var tdNodes = ruleContext.getElementsByTagName("td");
+ for (var i = 0; i < tdNodes.length; ++i) {
+ if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) &&
+ legacy_1.RPTUtil.getAncestor(tdNodes[i], "table") == ruleContext) {
+ // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or
+ // not.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(tdNodes[i])) {
+ continue;
+ }
+ // Add the node to the errorNodes
+ errorNodes.push(tdNodes[i]);
+ // Since we are not actually making use of theses errorNodes even though they are passed along with
+ // ValidationResult, we do not need to keep looping over and getting every single violating node under
+ // the rule context. This can be a future enhancenment where we actually make use of the error nodes that
+ // are passed along. Adding this break to speed up performance at this point.
+ break; // There is no point to keep adding the error nodes, stop after finding the first one
+ }
+ }
+ // Get the node name for the rule context element in this case it will always be table
+ var currentElementToken = ruleContext.nodeName.toLowerCase();
+ // Construct a new array which will contan only the element tag for the violation elements
+ var structuralElementTokens = new Array();
+ // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure
+ // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing.
+ var seen = {};
+ // Loop through all the violating structural elements and extract the element tag to be used as a token
+ for (var i = 0; i < errorNodes.length; i++) {
+ // Get the node name (tag name) for the violating structural element
+ var nodeName = errorNodes[i].nodeName.toLowerCase();
+ // Only need to add the violating element once
+ if (!seen.hasOwnProperty(nodeName)) {
+ // Since we are adding the token as elements and attributes we need to handle
+ // the summary attribute on the ruleContext (table). We only add summary once, same as
+ // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case)
+ if (nodeName == "table" && !seen.hasOwnProperty["summary"]) {
+ // Mark this as a new attribute
+ seen["summary"] = true;
+ // Since this is a new violating element add it to the structural element tokens array
+ structuralElementTokens.push("summary");
+ }
+ else {
+ // Mark this as a new element
+ seen[nodeName] = true;
+ // Since this is a new violating element add it to the structural element tokens array
+ structuralElementTokens.push(nodeName);
+ }
+ }
+ }
+ // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in
+ // the message.
+ var structuralElementTokensStr = structuralElementTokens.join(", ");
+ //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]);
+ if (errorNodes.length == 0) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/table_summary_redundant.ts":
+/*!*************************************************!*\
+ !*** ./src/v4/rules/table_summary_redundant.ts ***!
+ \*************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.table_summary_redundant = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts");
+var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts");
+exports.table_summary_redundant = {
+ id: "table_summary_redundant",
+ context: "dom:table",
+ refactor: {
+ "WCAG20_Table_CapSummRedundant": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "table_summary_redundant.html",
+ "Fail_1": "table_summary_redundant.html",
+ "group": "table_summary_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The table summary duplicates the caption",
+ "group": "The table summary must not duplicate the caption"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var pofId;
+ var passed = true;
+ var sumStr;
+ if (ruleContext.hasAttribute("summary")) {
+ pofId = 0;
+ sumStr = ruleContext.getAttribute("summary").trim().toLowerCase();
+ }
+ else if (ruleContext.hasAttribute("aria-describedby")) {
+ pofId = 1;
+ var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" ");
+ var summaryNodeConcat = "";
+ for (var i = 0; i < summaryNodeIds.length; i++) {
+ var summaryNodeId = summaryNodeIds[i];
+ if (summaryNodeId) {
+ var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId);
+ if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) {
+ summaryNodeConcat += " " + legacy_1.RPTUtil.getInnerText(summaryNode).trim().toLowerCase();
+ }
+ }
+ }
+ sumStr = summaryNodeConcat;
+ }
+ if (!sumStr) {
+ return null;
+ }
+ else {
+ var capElems = ruleContext.getElementsByTagName("caption");
+ if (capElems.length === 0) {
+ return null;
+ }
+ else if (sumStr.length > 0) {
+ var capStr = legacy_1.RPTUtil.getInnerText(capElems[0]).trim().toLowerCase();
+ if (!sumStr.includes(capStr)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_block_heading.ts":
+/*!********************************************!*\
+ !*** ./src/v4/rules/text_block_heading.ts ***!
+ \********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_block_heading = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+exports.text_block_heading = {
+ id: "text_block_heading",
+ context: "dom:p, dom:div, dom:br",
+ refactor: {
+ "RPT_Block_ShouldBeHeading": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_block_heading.html",
+ "Potential_1": "text_block_heading.html",
+ "group": "text_block_heading.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check if this text should be marked up as a heading: {0}",
+ "group": "Heading text must use a heading element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ numWords: {
+ value: 10,
+ type: "integer"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var numWords = validateParams.numWords.value;
+ var wordsSeen = 0;
+ var wordStr = [];
+ var emphasizedText = false;
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ var passed = false;
+ while (!passed &&
+ nw.nextNode() &&
+ nw.node !== ruleContext &&
+ nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) &&
+ !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice
+ {
+ var nwName = nw.node.nodeName.toLowerCase();
+ if ((nwName == "b" || nwName == "em" || nwName == "i" ||
+ nwName == "strong" || nwName == "u" || nwName == "font") && !legacy_1.RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ var nextStr = legacy_1.RPTUtil.getInnerText(nw.node);
+ var wc = legacy_1.RPTUtil.wordCount(nextStr);
+ if (wc > 0) {
+ wordStr.push(nextStr);
+ emphasizedText = true;
+ wordsSeen += wc;
+ }
+ passed = wordsSeen > numWords;
+ // Skip this node because it's emphasized
+ nw.bEndTag = true;
+ }
+ else {
+ passed =
+ (nw.node.nodeType == 1 && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "alt") &&
+ (nwName == "applet" || nwName == "embed" || nwName == "img" ||
+ (nwName === "input" && nw.elem().hasAttribute("type") && nw.elem().getAttribute("type") == "image")))
+ || (nwName === "#text" && nw.node.nodeValue.trim().length > 0)
+ // Give them the benefit of the doubt if there's a link
+ || (nwName === "a" && nw.elem().hasAttribute("href") && legacy_1.RPTUtil.attributeNonEmpty(nw.node, "href"));
+ }
+ }
+ if (wordsSeen == 0)
+ passed = true;
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RulePotential)("Potential_1", [wordStr.join(" ")]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_contrast_sufficient.ts":
+/*!**************************************************!*\
+ !*** ./src/v4/rules/text_contrast_sufficient.ts ***!
+ \**************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_contrast_sufficient = void 0;
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var ColorUtil_1 = __webpack_require__(/*! ../../v2/dom/ColorUtil */ "./src/v2/dom/ColorUtil.ts");
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+//import { setCache } from "../util/CacheUtil";
+var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts");
+exports.text_contrast_sufficient = {
+ id: "text_contrast_sufficient",
+ context: "dom:*",
+ refactor: {
+ "IBMA_Color_Contrast_WCAG2AA": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Potential_1": "Potential_same_color"
+ },
+ "IBMA_Color_Contrast_WCAG2AA_PV": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_graphic_background"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "text_contrast_sufficient.html",
+ "Pass_0": "text_contrast_sufficient.html",
+ "Fail_1": "text_contrast_sufficient.html",
+ "Potential_same_color": "text_contrast_sufficient.html",
+ "Potential_graphic_background": "text_contrast_sufficient.html",
+ "Potential_text_shadow": "text_contrast_sufficient.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "The contrast ratio of text with its background must meet WCAG 2.1 AA requirements",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",
+ "Potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG 2.1 AA requirements for minimum contrast",
+ "Potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2}",
+ "Potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2}"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.4.3",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ['afw4f7'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // avoid diagnosing elements that are not visible
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) ||
+ (VisUtil_1.VisUtil.hiddenByDefaultElements != null &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements != undefined &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) {
+ return null;
+ }
+ //TODO ? should only consider native disabled, ignore aria-disabled
+ //skip disabled element
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["svg", "script", "meta"]))
+ return null;
+ var doc = ruleContext.ownerDocument;
+ if (!doc) {
+ return null;
+ }
+ var win = doc.defaultView;
+ if (!win) {
+ return null;
+ }
+ // Ensure that this element has children with actual text.
+ var childStr = legacy_1.RPTUtil.getNodeText(ruleContext);
+ if (!legacy_1.RPTUtil.isShadowHostElement(ruleContext) || (legacy_1.RPTUtil.isShadowHostElement(ruleContext) && legacy_1.RPTUtil.getNodeText(ruleContext.shadowRoot) === '')) {
+ if (childStr.trim().length == 0)
+ return null;
+ // ignore if the text does not convey anything in human language
+ /**
+ * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s)
+ * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF
+ * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters
+ * (3) for now not consider unicode special characters that are different in different languages
+ */
+ var regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g;
+ var removed = childStr.trim().replace(regex, '');
+ if (removed.trim().length === 0)
+ return null;
+ }
+ var elem = ruleContext;
+ // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists
+ // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM.
+ if (legacy_1.RPTUtil.isShadowHostElement(ruleContext)) {
+ // if it's direct text of a shadow host
+ if (ruleContext.shadowRoot) {
+ for (var node = ruleContext.firstChild; node; node = node.nextSibling) {
+ if (node.nodeType == 3) {
+ //if multiple texts exist, only need to check one
+ elem = node.assignedSlot;
+ break;
+ }
+ }
+ }
+ if (elem === null)
+ return;
+ }
+ var style = win.getComputedStyle(elem);
+ // JCH clip INFO:
+ // The clip property lets you specify a rectangle to clip an absolutely positioned element.
+ // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped.
+ // Property values:
+ // none This is default. No clipping is done
+ // auto No clipping will be done
+ // shape The only valid value is: rect (top, right, bottom, left)
+ // e.g., clip: rect(10px, 20px, 30px, 40px);
+ // Note: the four values are in the same order as margin/padding
+ // The rect values are positive pixel values, e.g., 10px, etc.
+ // margin-box Uses the margin box as the reference box
+ // border-box Uses the border box as the reference box
+ // padding-box Uses the padding box as the reference box
+ // content-box
+ // fill-box
+ // stroke-box
+ // NOTE: the CSS clip property is deprecated
+ // Also: clip only works if the element is absolutely positioned and can only do rectangles
+ // check if element visible
+ var visible = true;
+ if (style.width !== "0" &&
+ style.height !== "0" &&
+ style.opacity !== "0" &&
+ style.display !== 'none' &&
+ style.visibility !== 'hidden' &&
+ style.overflow !== 'hidden' &&
+ // left and right work with all absolute units
+ (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) &&
+ (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) {
+ visible = true;
+ // console.log("element IS visible");
+ // console.log("CHECK COLOR CONTRAST unless to small");
+ }
+ else {
+ visible = false;
+ // console.log("element NOT visible");
+ }
+ if (visible === false) {
+ // console.log("DO NOT CHECK COLOR CONTRAST");
+ return null;
+ }
+ var clipHeight = -1;
+ if (style.clip !== "auto") {
+ var clipString = style.clip.toString();
+ if (clipString.includes("rect")) {
+ var reBrackets = /\((.*)\)/g;
+ var listOfText = [];
+ var found = reBrackets.exec(clipString);
+ var foundArr = found[1].split(', ');
+ for (var i = 0; i < foundArr.length; i++) {
+ // console.log("foundArr[",i,"] = ",foundArr[i]);
+ listOfText.push(foundArr[i]);
+ }
+ ;
+ }
+ // console.log("listOfText = ",listOfText);
+ clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, ''));
+ clipHeight = Math.abs(clipHeight);
+ }
+ // JCH clip-path INFO:
+ // Excellent article on clip-path: https://ishadeed.com/article/clip-path/
+ // clip-path is a totally different animal with many, many different variations
+ // The goal was for it to not be as limited as clip
+ // The syntax is more complicated (as it does more) and it is different from clip,
+ // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px);
+ // Note: there are no commas
+ // Also, it can take single values to make all sides the same, or 2 values (vert/hori).
+ // or 3 values (top/hori/bottom)
+ // And percentages can works as well as px
+ //
+ // Although there are five different shapes: inset (term used for rectangle), circle,
+ // ellipse, polygon, path - we will only concern ourselves with inset
+ // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box
+ // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px);
+ // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box
+ //
+ // So the key question is what amount of effort do we want to invest into clip-path
+ //
+ // JCH don't do clip-path now
+ var clipPathHeight = -1;
+ // if (style.clipPath !== "auto") {
+ // console.log("style.clipPath = ",style.clipPath);
+ // console.log("style.clipPath.toString = ",style.clipPath.toString());
+ // let clipString = style.clipPath.toString();
+ // if (clipString.includes("inset")) {
+ // var reBrackets = /\((.*)\)/g;
+ // var listOfText = [];
+ // var found = reBrackets.exec(clipString);
+ // var foundArr = found[1].split(' ');
+ // for (let i=0; i= 24 || size >= 18.6 && weight >= 700;
+ var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale);
+ var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient;
+ var textShadow = colorCombo.textShadow;
+ var isDisabled = legacy_1.RPTUtil.isNodeDisabled(elem);
+ if (!isDisabled) {
+ var control = legacy_1.RPTUtil.getControlOfLabel(elem);
+ if (control) {
+ isDisabled = legacy_1.RPTUtil.isNodeDisabled(control);
+ }
+ }
+ if (!isDisabled && nodeName === 'label' && legacy_1.RPTUtil.isDisabledByFirstChildFormElement(elem)) {
+ isDisabled = true;
+ }
+ if (!isDisabled && ruleContext.hasAttribute("id") && legacy_1.RPTUtil.isDisabledByReferringElement(elem)) {
+ isDisabled = true;
+ }
+ /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", {
+ "ratio": ratio,
+ "isLargeScale": isLargeScale,
+ "weight": weight,
+ "size": size,
+ "hasBackground": hasBackground,
+ "isDisabled": isDisabled
+ });*/
+ // If element or parent is disabled, this rule does not apply (but may be 3:1 in future)
+ if (!passed && isDisabled) {
+ passed = true;
+ }
+ if (!passed) {
+ if (hasBackground) {
+ // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image
+ return (0, IRule_1.RulePotential)("Potential_graphic_background", [ratio.toFixed(2), size, weight]);
+ ;
+ }
+ else if (textShadow) {
+ // fire potential since a text with shadow may be still viewable, depending on the shadow efffects
+ return (0, IRule_1.RulePotential)("Potential_text_shadow", [ratio.toFixed(2), size, weight]);
+ ;
+ }
+ else {
+ if (fg.toHex() === bg.toHex()) {
+ return (0, IRule_1.RulePotential)("Potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ }
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_quoted_correctly.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/text_quoted_correctly.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_quoted_correctly = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.text_quoted_correctly = {
+ id: "text_quoted_correctly",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "Pass_0": "text_quoted_correctly.html",
+ "Potential_1": "text_quoted_correctly.html",
+ "group": "text_quoted_correctly.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "If the following text is a quotation, mark it as a or element: {0}",
+ "group": "Quotations should be marked with or elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // ignore the check if the node is hidden
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext))
+ return null;
+ // Don't trigger if the element is not in the body
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["body"]) === null)
+ return null;
+ var validateParams = {
+ minWords: {
+ value: 3,
+ type: "integer"
+ }
+ };
+ var minWords = validateParams.minWords.value;
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ var violatedtext = null;
+ // ignore the check for the text of the following elements
+ var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"];
+ while (passed && walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName === "#text") {
+ var txtVal = walkNode.nodeValue;
+ // Do the regex tests first - should be fast
+ // Remove apostrophe's
+ txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2");
+ var dblQuotes = txtVal.match(/("[^"]+")/g);
+ var snglQuotes = txtVal.match(/('[^']+')/g);
+ // Walk the parents - only continue testing if we found a quote, but
+ // we're not already marked up
+ // Also skip if we're in a script - there's lots of quotes used in scripts
+ if ((dblQuotes !== null || snglQuotes !== null) &&
+ legacy_1.RPTUtil.getAncestor(walkNode, ignored) === null) {
+ if (dblQuotes != null) {
+ for (var i = 0; passed && i < dblQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.wordCount(dblQuotes[i]) < minWords;
+ }
+ if (snglQuotes != null) {
+ for (var i = 0; passed && i < snglQuotes.length; ++i)
+ passed = legacy_1.RPTUtil.wordCount(snglQuotes[i]) < minWords;
+ }
+ // Remove any linefeed inside the quote
+ // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),"");
+ if (dblQuotes === null) {
+ violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ else if (snglQuotes === null) {
+ violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ else {
+ violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), "");
+ }
+ }
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars
+ if (!passed && violatedtext.length && violatedtext.length > 69) {
+ violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32);
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_sensory_misuse.ts":
+/*!*********************************************!*\
+ !*** ./src/v4/rules/text_sensory_misuse.ts ***!
+ \*********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_sensory_misuse = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.text_sensory_misuse = {
+ id: "text_sensory_misuse",
+ context: "dom:body, dom:body dom:*",
+ refactor: {
+ "RPT_Text_SensoryReference": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "text_sensory_misuse.html",
+ "Potential_1": "text_sensory_misuse.html",
+ "group": "text_sensory_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "If the word(s) '{0}' is part of instructions for using page content, check it is still understandable without this location or shape information",
+ "group": "Instructions must be meaningful without shape or location words"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ sensoryText: {
+ value: ["top-left", "top-right", "bottom-right", "bottom-left",
+ "round", "square", "shape", "rectangle", "triangle",
+ "right", "left", "above", "below", "top", "bottom",
+ "upper", "lower", "corner", "beside"],
+ type: "[string]"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(ruleContext.nodeName.toLowerCase())) {
+ return null;
+ }
+ // Extract the nodeName of the context node
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // In the case this is a style or link element, skip triggering rule as we do not want to scan
+ // CSS for sensory words, as there can be CSS keys which contain theses sensory text that is matching.
+ if (nodeName === "style" || nodeName === "link") {
+ return (0, IRule_1.RulePass)(1);
+ }
+ var violatedtextArray = null;
+ var violatedtext = null;
+ var sensoryRegex = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "text_sensory_misuse", null);
+ if (sensoryRegex == null) {
+ var sensoryText = validateParams.sensoryText.value;
+ var regexStr = "(" + sensoryText[0];
+ for (var j = 1; j < sensoryText.length; ++j)
+ regexStr += "|" + sensoryText[j];
+ regexStr += ")\\W";
+ sensoryRegex = new RegExp(regexStr, "gi");
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "text_sensory_misuse", sensoryRegex);
+ }
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ var _loop_1 = function () {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ var txtVal = walkNode.nodeValue.trim();
+ if (txtVal.length > 0) {
+ violatedtextArray = txtVal.match(sensoryRegex);
+ if (violatedtextArray != null) {
+ var hash_1 = {}, result_1 = [];
+ var exemptWords_1 = ["right-click", "left-click", "right-clicking", "right-clicks", "left-clicking", "left-clicks"];
+ // Note: split(/[\n\r ]+/) will spread the string into group of words using space,
+ // carriage return or linefeed as separators.
+ var counts = txtVal.split(/[\n\r ]+/).reduce(function (map, word) {
+ var sensoryTextArr = validateParams.sensoryText.value;
+ var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, "");
+ var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, "");
+ for (var counter = 0; counter < sensoryTextArr.length; counter++) {
+ var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]);
+ var b = exemptWords_1.indexOf(lcWordWoPunc);
+ var sensoryWordLen = sensoryTextArr[counter].length;
+ var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a);
+ // If the word does not contains substring of sensoryTextArr[counter]
+ // proceed to the next loop iteration for next sensoryText.
+ if (a < 0) {
+ continue;
+ }
+ var isPuncfollowing = ((charFollowSensoryText == '\-') ||
+ (charFollowSensoryText == '\.') ||
+ (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') ||
+ (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') ||
+ (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') ||
+ (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') ||
+ (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') ||
+ (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]'));
+ var isPuncPreceding = false;
+ if (a > 0) {
+ var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1);
+ isPuncPreceding = ((charPrecedeSensoryText == '\-') ||
+ (charPrecedeSensoryText == '\.') ||
+ (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') ||
+ (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') ||
+ (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') ||
+ (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') ||
+ (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') ||
+ (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]'));
+ }
+ if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true)) && (b < 0)) {
+ passed = false;
+ if (!hash_1.hasOwnProperty(wordWoTrailingPunc)) {
+ hash_1[wordWoTrailingPunc] = true;
+ result_1.push(wordWoTrailingPunc);
+ }
+ counter = sensoryTextArr.length;
+ }
+ }
+ map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1;
+ return map;
+ }, Object.create(null));
+ violatedtext = result_1.join(", ");
+ }
+ }
+ }
+ walkNode = walkNode.nextSibling;
+ };
+ while (passed && walkNode) {
+ _loop_1();
+ }
+ if (!passed) {
+ // Don't trigger if we're not in the body or if we're in a script
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["body", "script"]);
+ passed = (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body");
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_spacing_valid.ts":
+/*!********************************************!*\
+ !*** ./src/v4/rules/text_spacing_valid.ts ***!
+ \********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_spacing_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts");
+exports.text_spacing_valid = {
+ id: "text_spacing_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "text_spacing_valid.html",
+ "group": "text_spacing_valid.html",
+ "fail_letter_spacing_style": "text_spacing_valid.html",
+ "fail_word_spacing_style": "text_spacing_valid.html",
+ "fail_line_height_style": "text_spacing_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "CSS !important is not used in inline style to control letter or word spacing or line height",
+ "group": "CSS !important should not be used in inline style to control letter or word spacing or line height",
+ "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style",
+ "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style",
+ "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.4.12"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: ['9e45ec', '24afc2', '78fd32'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return null;
+ //skip the check if the element is off screen
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ if (bounds['top'] < 0 || bounds['left'] < 0)
+ return null;
+ //skip no-html element
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, "svg"))
+ return null;
+ // Ensure that this element has children with actual text.
+ var childStr = "";
+ var childNodes = ruleContext.childNodes;
+ for (var i = 0; i < childNodes.length; ++i) {
+ if (childNodes[i].nodeType == 3) {
+ childStr += childNodes[i].nodeValue;
+ }
+ }
+ if (childStr.trim().length == 0)
+ return null;
+ //font size always resolved to 'px'
+ var font_size_style = (0, CSSUtil_1.getComputedStyle)(ruleContext).getPropertyValue('font-size');
+ var font_size = parseFloat(font_size_style);
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (Object.keys(styles).length === 0)
+ return null;
+ //note that CSS unit is required for non-zero values, otherwise it's ignored
+ var ret = [];
+ // matched string: original style, the style value and unit
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var word_style = styles['word-spacing'];
+ if (word_style) {
+ if (word_style.startsWith('inherit') || word_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "word-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ word_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['word-spacing'];
+ }
+ else if (word_style.startsWith('unset')) {
+ word_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("word-spacing") === 'important') {
+ word_style = word_style.substring(0, word_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (word_style === 'initial' || word_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else {
+ var wordSpacing = parseFloat(word_style);
+ if (!isNaN(wordSpacing)) {
+ var parsed = word_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 0.16)
+ ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var letter_style = styles['letter-spacing'];
+ if (letter_style) {
+ if (letter_style.startsWith('inherit') || letter_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "letter-spacing": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ letter_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['letter-spacing'];
+ }
+ else if (letter_style.startsWith('unset')) {
+ letter_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("letter-spacing") === 'important') {
+ letter_style = letter_style.substring(0, letter_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (letter_style === 'initial' || letter_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else {
+ var letterSpacing = parseFloat(letter_style);
+ if (!isNaN(letterSpacing)) {
+ var parsed = letter_style.trim().match(regex);
+ if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 0.12)
+ ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ var line_style = styles['line-height'];
+ var overflow = { "overflow": ['auto', 'scroll'], "overflow-x": ['auto', 'scroll'], "overflow-y": ['auto', 'scroll'] };
+ if (line_style && legacy_1.RPTUtil.getAncestorWithStyles(ruleContext, overflow) === null) {
+ if (line_style.startsWith('inherit') || line_style.startsWith('unset')) {
+ //get closet ancestor's word-spacing
+ var ancestor = legacy_1.RPTUtil.getAncestorWithStyles(ruleContext.parentElement, { "line-height": ["*"] }, ['inherit', 'unset']);
+ if (ancestor !== null) {
+ line_style = (0, CSSUtil_1.getDefinedStyles)(ancestor)['line-height'];
+ }
+ else if (line_style.startsWith('unset')) {
+ line_style = "initial";
+ }
+ }
+ if (ruleContext.style.getPropertyPriority("line-height") === 'important') {
+ line_style = line_style.substring(0, line_style.length - "!important".length - 1);
+ // computed space is 0 for 'normal' or 'initial'.
+ if (line_style === 'initial' || line_style === 'normal')
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else {
+ var lineHeight = parseFloat(line_style);
+ if (!isNaN(lineHeight)) {
+ var parsed = line_style.trim().match(regex);
+ if (parsed[2] === '') { //line-height are allowed unitless when the valie is multiple (or fraction) of the font size
+ if (parsed[1] < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ else {
+ var pixels = (0, CSSUtil_1.convertValue2Pixels)(parsed[2], parsed[1], ruleContext);
+ if (pixels !== null && pixels / font_size < 1.5)
+ ret.push((0, IRule_1.RuleFail)("fail_line_height_style"));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ }
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ if (ret.length > 0)
+ return ret;
+ return null; //implicable or ignore
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/text_whitespace_valid.ts":
+/*!***********************************************!*\
+ !*** ./src/v4/rules/text_whitespace_valid.ts ***!
+ \***********************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.text_whitespace_valid = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+exports.text_whitespace_valid = {
+ id: "text_whitespace_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "text_whitespace_valid.html",
+ "potential_text": "text_whitespace_valid.html",
+ "group": "text_whitespace_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "potential_text": "Space characters should not be used to create space between the letters of a word",
+ "group": "Space characters should not be used to control spacing within a word"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Don't trigger if we're not in the body or if we're in a script
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["body", "script", "code"]);
+ if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body")
+ return null;
+ var passed = true;
+ var walkNode = ruleContext.firstChild;
+ while (passed && walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ var txtVal = walkNode.nodeValue;
+ passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal));
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("pass");
+ return (0, IRule_1.RulePotential)("potential_text");
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/widget_tabbable_exists.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/widget_tabbable_exists.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.widget_tabbable_exists = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.widget_tabbable_exists = {
+ id: "widget_tabbable_exists",
+ context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",
+ refactor: {
+ "IBMA_Focus_Tabbable": {
+ "pass": "pass",
+ "fail_no_tabbable": "fail_no_tabbable"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "widget_tabbable_exists.html",
+ "fail_no_tabbable": "widget_tabbable_exists.html",
+ "group": "widget_tabbable_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element",
+ "group": "Component must have at least one tabbable element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //ignore datalist element check since it will be part of a input element or hidden by default
+ if (nodeName === 'datalist')
+ return null;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ ++count;
+ }
+ // If node has children, look for tab stops in the children
+ // skip the count if the element requires presentational children only
+ if (count < 1 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 1 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ var passed = count >= 1;
+ return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rules/widget_tabbable_single.ts":
+/*!************************************************!*\
+ !*** ./src/v4/rules/widget_tabbable_single.ts ***!
+ \************************************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.widget_tabbable_single = void 0;
+var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts");
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts");
+var VisUtil_1 = __webpack_require__(/*! ../../v2/dom/VisUtil */ "./src/v2/dom/VisUtil.ts");
+exports.widget_tabbable_single = {
+ id: "widget_tabbable_single",
+ context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",
+ refactor: {
+ "IBMA_Focus_MultiTab": {
+ "pass": "pass",
+ "fail_multiple_tabbable": "fail_multiple_tabbable"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "widget_tabbable_single.html",
+ "fail_multiple_tabbable": "widget_tabbable_single.html",
+ "group": "widget_tabbable_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element",
+ "group": "Certain components must have no more than one tabbable element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.3"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var count = 0;
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ ++count;
+ }
+ // If node has children, look for tab stops in the children
+ //skip the count if the element requires presentational children only
+ if (count < 2 && !legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) {
+ var nw = new legacy_1.NodeWalker(ruleContext);
+ while (count < 2 && nw.nextNode() && nw.node != ruleContext) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && legacy_1.RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ var passed = count < 2;
+ if (!passed)
+ (0, CacheUtil_1.setCache)(ruleContext, "widget_tabbable_single", "fail_multiple_tabbable");
+ return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_multiple_tabbable", [role]);
+ }
+};
+
+
+/***/ }),
+
+/***/ "./src/v4/rulesets.ts":
+/*!****************************!*\
+ !*** ./src/v4/rulesets.ts ***!
+ \****************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a11yRulesets = void 0;
+// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json
+var SCURLs = __webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json");
+var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts");
+var SCs = [];
+for (var key in SCURLs) {
+ SCs.push(SCURLs[key]);
+}
+var summaries = {
+ "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.",
+ "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.",
+ "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.",
+ "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.",
+ "1.2.4": "Captions are provided for all live audio content in synchronized media.",
+ "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.",
+ "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.",
+ "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.",
+ "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.",
+ "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.",
+ "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.",
+ "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.",
+ "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.",
+ "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.",
+ "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.",
+ "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.",
+ "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.",
+ "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.",
+ "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.",
+ "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.",
+ "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.",
+ "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.",
+ "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.",
+ "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.",
+ "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.",
+ "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.",
+ "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.",
+ "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.",
+ "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.",
+ "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.",
+ "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.",
+ "2.4.6": "Headings and labels describe topic or purpose.",
+ "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.",
+ "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.",
+ "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.",
+ "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.",
+ "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.",
+ "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.",
+ "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.",
+ "3.2.1": "When any component receives focus, it does not initiate a change of context.",
+ "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.",
+ "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.",
+ "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.",
+ "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.",
+ "3.3.2": "Labels or instructions are provided when content requires user input.",
+ "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.",
+ "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.",
+ "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.",
+ "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",
+ "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are reported.",
+ "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are reported.",
+};
+exports.a11yRulesets = [
+ // {
+ // id: "DEBUG",
+ // name: "DEBUG Rules",
+ // category: eRuleCategory.ACCESSIBILITY,
+ // description: "Rules for debugging",
+ // checkpoints: [{
+ // num: "1",
+ // name: "Debug CP 1",
+ // wcagLevel: "A",
+ // summary: "Rules for Debug"
+ // }]
+ // },
+ {
+ id: "EXTENSIONS",
+ name: "Extension Rules",
+ category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY,
+ description: "Rules for enabling the browser extensions",
+ type: IGuideline_1.eGuidelineType.EXTENSION,
+ checkpoints: [{
+ num: "1",
+ name: "Extension CP 1",
+ wcagLevel: "A",
+ summary: "Rules for Extension"
+ }]
+ },
+ {
+ id: "IBM_Accessibility",
+ name: "IBM Accessibility 7.2",
+ category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA plus additional IBM checklist supplemental requirements.",
+ // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ },
+ {
+ id: "WCAG_2_1",
+ name: "WCAG 2.1 (A, AA)",
+ category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.1 AA. This is the current W3C recommendation. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",
+ // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ },
+ {
+ id: "WCAG_2_0",
+ name: "WCAG 2.0 (A, AA)",
+ category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY,
+ description: "Rules for WCAG 2.0 AA. Referenced by US Section 508, but not the latest W3C recommendation.",
+ // This ruleset has all 2.0 checkpoints that are A or AA
+ checkpoints: SCs
+ .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); })
+ .map(function (sc) { return ({
+ num: sc.num,
+ scId: sc.scId,
+ name: sc.handle,
+ wcagLevel: sc.level,
+ summary: summaries[sc.num]
+ }); })
+ }
+];
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CSSUtil.ts":
+/*!********************************!*\
+ !*** ./src/v4/util/CSSUtil.ts ***!
+ \********************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getCSSStyle = exports.getFontInPixels = exports.getWeightNumber = exports.isMaterialIconFont = exports.convertValue2Pixels = exports.getPixelsFromStyle = exports.getRotationDegree = exports.getMediaOrientationTransform = exports.getDefinedStyles = exports.getComputedStyle = exports.selectorMatchesElem = void 0;
+var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts");
+function selectorMatchesElem(element, selector) {
+ try {
+ if (selector.trim() === "")
+ return false;
+ if (typeof element.matches === 'function') {
+ return element.matches(selector);
+ }
+ if (typeof element.matchesSelector === 'function') {
+ return element.matchesSelector(selector);
+ }
+ // Native functions not there, fallback
+ var matches = (element.document || element.ownerDocument).querySelectorAll(selector);
+ var i = 0;
+ while (i < matches.length && matches[i] !== element) {
+ ++i;
+ }
+ return i < matches.length;
+ }
+ catch (err) {
+ // Bad selector? Doesn't match then...
+ return false;
+ }
+}
+exports.selectorMatchesElem = selectorMatchesElem;
+/**
+ * Returns the style computed for this element
+ * @param elem
+ */
+function getComputedStyle(elem, pseudoElt) {
+ var doc = elem.ownerDocument;
+ var win = doc.defaultView;
+ return win.getComputedStyle(elem, pseudoElt);
+}
+exports.getComputedStyle = getComputedStyle;
+/**
+ * Returns the style defined for this element
+ *
+ * This differs from the computed style in that the computed style will return
+ * styles defined by the user agent. This will only return styles defined by the
+ * application
+ * if rotation transform is used, the computed style returns the resolved matrix
+ * while the defined style return the transform function(s)
+ * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)'
+ * and the defined style returns 'rotate(2.5deg)'
+ *
+ * @param {HTMLElement} elem
+ * @param {string} [pseudoClass] If specified, will return values that are different
+ * than when the pseudoClass does not match.
+ */
+function getDefinedStyles(elem, pseudoClass) {
+ // console.log("Function: getDefinedStyles");
+ var definedStyles = {};
+ var definedStylePseudo = {};
+ function fillStyle(maps, style) {
+ for (var sIndex = 0; sIndex < style.length; ++sIndex) {
+ if (style[sIndex] === "all" && style[style[sIndex]]) {
+ for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) {
+ var map = maps_1[_i];
+ for (var key in map) {
+ delete map[key];
+ }
+ }
+ break;
+ }
+ else {
+ var key = style[sIndex];
+ for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) {
+ var map = maps_2[_a];
+ var priority = style.getPropertyPriority(key);
+ if (key in map && map[key].endsWith("!important")) {
+ if (priority === 'important' && !map[key].startsWith("inherit") && !map[key].startsWith("unset"))
+ //override !important only if it is also !important
+ map[key] = style[key] + " !important";
+ else
+ //don't override !important if it is not !important
+ continue;
+ }
+ else
+ //create/overide anyway
+ map[key] = style[key] + (priority === 'important' ? " !important" : "");
+ }
+ }
+ }
+ }
+ var storedStyles = (0, CacheUtil_1.getCache)(elem, "RPTUtil_DefinedStyles", null);
+ if (!pseudoClass && storedStyles !== null) {
+ definedStyles = storedStyles["definedStyles"];
+ definedStylePseudo = storedStyles["definedStylePseudo"];
+ }
+ else {
+ // Iterate through all of the stylesheets and rules
+ for (var ssIndex = 0; ssIndex < elem.ownerDocument.styleSheets.length; ++ssIndex) {
+ var sheet = elem.ownerDocument.styleSheets[ssIndex];
+ try {
+ if (sheet && sheet.cssRules) {
+ // console.log("Got sheet");
+ for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) {
+ // console.log("Got rule: ", sheet.cssRules[rIndex]);
+ var rule = sheet.cssRules[rIndex];
+ var fullRuleSelector = rule.selectorText;
+ if (fullRuleSelector) {
+ var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/);
+ var hasPseudoClass = !!pseudoMatch;
+ var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector;
+ var selPseudo = hasPseudoClass ? pseudoMatch[2] : "";
+ var samePseudoClass = selPseudo === pseudoClass;
+ if (pseudoClass && pseudoClass === ":focus") {
+ // If this element has focus, remove focus-within from parents
+ selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1");
+ }
+ // Get styles of non-pseudo selectors
+ if (!hasPseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStyles, definedStylePseudo], rule.style);
+ }
+ if (samePseudoClass && selectorMatchesElem(elem, selMain)) {
+ fillStyle([definedStylePseudo], rule.style);
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ //
+ // Handled the stylesheets, now handle the element defined styles
+ fillStyle([definedStyles, definedStylePseudo], elem.style);
+ (0, CacheUtil_1.setCache)(elem, "RPTUtil_DefinedStyles", { definedStyles: definedStyles, definedStylePseudo: definedStylePseudo });
+ }
+ /**
+ * 'initial' sets the style back to default
+ for (const key in definedStyles) {
+ if (definedStyles[key] === "initial") {
+ delete definedStyles[key];
+ }
+ }
+ for (const key in definedStylePseudo) {
+ if (definedStylePseudo[key] === "initial") {
+ delete definedStylePseudo[key];
+ }
+ }
+ */
+ if (!pseudoClass) {
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStyles, null, 2));
+ return definedStyles;
+ }
+ else {
+ for (var key in definedStylePseudo) {
+ if (definedStylePseudo[key] === definedStyles[key]) {
+ delete definedStylePseudo[key];
+ }
+ }
+ // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStylePseudo, null, 2));
+ return definedStylePseudo;
+ }
+}
+exports.getDefinedStyles = getDefinedStyles;
+/**
+ * Returns the media query defined for the document
+ *
+ *
+ * @param {Document} doc
+ */
+function getMediaOrientationTransform(doc) {
+ var orientationTransforms = {};
+ // Iterate through all of the stylesheets and rules
+ for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) {
+ var sheet = doc.styleSheets[ssIndex];
+ try {
+ if (sheet && sheet.cssRules) {
+ for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) {
+ var sheetRule = sheet.cssRules[rIndex];
+ if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) {
+ var rule = sheetRule;
+ if (rule && rule.media) {
+ var mediaList = rule.media;
+ for (var i = 0; i < mediaList.length; i++) {
+ var elem_transforms = orientationTransforms[mediaList.item(i).toLocaleLowerCase()];
+ if (!elem_transforms)
+ elem_transforms = {};
+ var styleRules = rule.cssRules;
+ for (var i_1 = 0; i_1 < styleRules.length; ++i_1) {
+ if (1 /* CSSRule.STYLE_RULE */ === styleRules[i_1].STYLE_RULE) {
+ var styleRule = styleRules[i_1];
+ var selector = styleRule.selectorText;
+ if (selector) {
+ var transforms = {};
+ var styles = styleRule.style;
+ for (var s = 0; s < styles.length; ++s) {
+ var key = styles[s];
+ if (key.toLocaleLowerCase() === "transform") {
+ if (key === "all" && styles[key]) {
+ delete transforms[key];
+ break;
+ }
+ else {
+ transforms[key] = styles[key];
+ }
+ }
+ }
+ elem_transforms[selector] = transforms;
+ }
+ }
+ }
+ orientationTransforms[mediaList.item(i).toLocaleLowerCase()] = elem_transforms;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (!err.toString().includes("Cannot access rules") && !err.toString().includes("SecurityError:")) {
+ throw err;
+ }
+ }
+ }
+ return orientationTransforms;
+}
+exports.getMediaOrientationTransform = getMediaOrientationTransform;
+/**
+ * convert given rotation transform functions to the degree transformed.
+ * If multiple functions are given, then the functions are applied linearly in the order.
+ * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg),
+ * rotate(2rad) rotate3d(1, 1, 1, 45deg)
+ * @param rotation_transform
+ */
+function getRotationDegree(rotation_transform) {
+ var degree = 0;
+ try {
+ if (!rotation_transform)
+ return degree;
+ // normalize the rotation_transform
+ rotation_transform = rotation_transform.replaceAll(", ", ",");
+ var transform_functions = rotation_transform.split(" ");
+ for (var i = 0; i < transform_functions.length; i++) {
+ var transform_function = transform_functions[i].trim();
+ if (transform_function === '')
+ continue;
+ if (transform_function.startsWith("rotate3d")) {
+ // example: rotate3d(1, 1, 1, 45deg);
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = void 0;
+ if (matrix)
+ values = matrix.split(",");
+ if (values && values.length === 4) {
+ var rotation = values[3];
+ if (!rotation)
+ continue;
+ rotation = rotation.trim();
+ if (rotation.endsWith("turn")) {
+ var num = rotation.substring(0, rotation.length - 4);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 360;
+ }
+ else if (rotation.endsWith("rad")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 180 / Math.PI;
+ }
+ else if (rotation.endsWith("deg")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree += num;
+ }
+ }
+ }
+ }
+ else if (transform_function.startsWith("rotate") || transform_function.startsWith("rotateZ")) {
+ // example: rotate(45deg);
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var rotation = transform_function.substring(left + 1, right);
+ if (!rotation)
+ continue;
+ rotation = rotation.trim();
+ if (rotation.endsWith("turn")) {
+ var num = rotation.substring(0, rotation.length - 4);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 360;
+ }
+ else if (rotation.endsWith("rad")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree = num * 180 / Math.PI;
+ }
+ else if (rotation.endsWith("deg")) {
+ var num = rotation.substring(0, rotation.length - 3);
+ num = parseFloat(num);
+ if (!isNaN(num))
+ degree += num;
+ }
+ }
+ }
+ else if (transform_function.startsWith("matrix3d")) {
+ // calculate the three Euler angles
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = null;
+ if (matrix)
+ values = matrix.split(",");
+ if (values !== null) {
+ var z_angle = Math.atan2(values[4], values[5]);
+ degree += Math.round(Math.round(z_angle * 180 / Math.PI));
+ }
+ }
+ }
+ else if (transform_function.startsWith("matrix")) {
+ // calculate the three Euler angles
+ var left = transform_function.indexOf("(");
+ var right = transform_function.indexOf(")");
+ if (left !== -1 && right !== -1) {
+ var matrix = transform_function.substring(left + 1, right);
+ var values = null;
+ if (matrix)
+ values = matrix.split(",");
+ if (values !== null) {
+ var z_angle = Math.atan2(values[1], values[0]);
+ degree += Math.round(Math.round(z_angle * 180 / Math.PI));
+ }
+ }
+ }
+ }
+ while (degree >= 360)
+ degree -= 360;
+ }
+ catch (err) {
+ console.log("Cannot retrieve rotation degree: " + err);
+ throw err;
+ }
+ return degree;
+}
+exports.getRotationDegree = getRotationDegree;
+/**
+ * Convert CSS style string values to pixels.
+ *
+ * @param value style value in string, such as 3rem, 230px etc.
+ * @param target element.
+ * @return value in pixels
+ */
+function getPixelsFromStyle(value, elem) {
+ if (!value)
+ return 0;
+ var regex = /(-?[\d.]+)([a-z%]*)/;
+ var parsed = value.trim().match(regex);
+ if (parsed[2] === '' || parsed[1] === 0)
+ //no zero value without unit which is considered as error, so implicable
+ return 0;
+ var pixels = convertValue2Pixels(parsed[2], parsed[1], elem);
+ return pixels === null ? pixels : parseFloat(pixels);
+}
+exports.getPixelsFromStyle = getPixelsFromStyle;
+/**
+ * Convert absolute CSS numerical values to pixels.
+ *
+ * @param unitValue in string
+ * @param target element.
+ * @return value in pixels
+ */
+function convertValue2Pixels(unit, unitValue, elem) {
+ if (unitValue == 0)
+ return 0;
+ var supportedUnits = {
+ // absolute unit
+ 'px': function (value) { return value; },
+ 'cm': function (value) { return value * 37.8; },
+ 'mm': function (value) { return value * 3.78; },
+ 'q': function (value) { return value * 0.95; },
+ 'in': function (value) { return value * 96; },
+ 'pc': function (value) { return value * 16; },
+ 'pt': function (value) { return value * 1.33; },
+ // relative unit
+ 'rem': function (value) { return value * parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue('font-size')); },
+ 'em': function (value) { return value * parseFloat(getComputedStyle(elem).getPropertyValue('font-size')); },
+ 'vw': function (value) { return value / 100 * elem.ownerDocument.defaultView.innerWidth; },
+ 'vh': function (value) { return value / 100 * elem.ownerDocument.defaultView.innerHeight; },
+ '%': function (value) { return value / 100 * parseFloat(getComputedStyle(elem).getPropertyValue('font-size')); }
+ };
+ if (unit in supportedUnits)
+ return supportedUnits[unit](unitValue);
+ return null;
+}
+exports.convertValue2Pixels = convertValue2Pixels;
+/*
+* Returns if the font for visible text of the element is defined by material icons
+*
+* @param {HTMLElement} elem
+*/
+function isMaterialIconFont(elem) {
+ // TODO: check the existence material icons using fetch in node 18+
+ // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time.
+ //list of known material icons and stylesheet link
+ var known_icons = {
+ 'Material Icons': "https://fonts.googleapis.com/icon?family=Material+Icons"
+ };
+ var known_css_classes = {
+ 'material-icons': "https://fonts.googleapis.com/icon?family=Material+Icons"
+ };
+ // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons"
+ var styles = getDefinedStyles(elem);
+ var fontFamily = styles['font-family'];
+ var found = false;
+ // font-family specifies a prioritized list of one or more font family names
+ if (fontFamily && fontFamily.split(",")[0].replace(/['"]+/g, '').trim() in known_icons)
+ found = true;
+ if (!found) {
+ var list = elem.classList;
+ for (var css_class in known_css_classes) {
+ if (list.contains(css_class)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ if (!found)
+ return false;
+ var passed = false;
+ // check if the stylesheet for the 'Material Icons' exists statically
+ var sheets = elem.ownerDocument.styleSheets;
+ for (var s = 0; s < sheets.length; s++) {
+ if (sheets && sheets.length > 0 && Object.values(known_icons).indexOf(sheets[s].href) > -1) {
+ passed = true;
+ break;
+ }
+ }
+ return passed;
+}
+exports.isMaterialIconFont = isMaterialIconFont;
+function getWeightNumber(styleVal) {
+ var map = {
+ "light": 100,
+ "bold": 700
+ };
+ var retVal = parseInt(styleVal);
+ if (retVal)
+ return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+}
+exports.getWeightNumber = getWeightNumber;
+function getFontInPixels(styleVal, elem) {
+ var map = {
+ "xx-small": 16,
+ "x-small": 10,
+ "small": 13,
+ "medium": 16,
+ "large": 18,
+ "x-large": 24,
+ "xx-large": 32
+ };
+ var value = parseFloat(styleVal);
+ if (!value) {
+ return map[styleVal];
+ }
+ var units = styleVal.substring(("" + value).length);
+ /**
+ if (units === "" || units === "px") return value;
+ if (units === "em") return value * 16;
+ if (units === "%") return value / 100 * 16;
+ if (units === "pt") return value * 4 / 3;
+ return Math.round(value);
+ */
+ return convertValue2Pixels(units, value, elem);
+}
+exports.getFontInPixels = getFontInPixels;
+function getCSSStyle(element) {
+ var styleText = "";
+ if (element === null)
+ return [];
+ if (element.IBM_CSS_THB)
+ return element.IBM_CSS_THB;
+ var nodeName = element.nodeName.toLowerCase();
+ if (nodeName === "style") {
+ styleText = element.innerText;
+ if (styleText === undefined || styleText.trim() === "")
+ styleText = element.textContent;
+ }
+ else if (element.hasAttribute("style")) {
+ styleText = element.getAttribute("style");
+ }
+ else
+ return [];
+ if (styleText === null || styleText.trim().length === 0)
+ return [];
+ //remove comment blocks
+ var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g;
+ var subst = ' ';
+ styleText = styleText.replace(re, subst);
+ // Find all "key : val;" pairs with various whitespace inbetween
+ var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g;
+ // Find all "selector { csskeyvals } with various whitespace inbetween
+ var rSelectors = /\s*([^{]*){([^}]*)}/g;
+ if (styleText.indexOf("{") === -1) {
+ var keyVals = {};
+ var m = void 0;
+ while ((m = rKeyVals.exec(styleText)) != null) {
+ keyVals[m[1]] = m[2].trim().toLowerCase();
+ }
+ var retVal = [{
+ selector: null,
+ values: keyVals
+ }];
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+ else {
+ var retVal = [];
+ var m = void 0;
+ var m2 = void 0;
+ while ((m = rSelectors.exec(styleText)) != null) {
+ var keyVals = {};
+ var selKey = m[1];
+ var selVal = m[2];
+ while ((m2 = rKeyVals.exec(selVal)) != null) {
+ keyVals[m2[1]] = m2[2].trim().toLowerCase();
+ }
+ retVal.push({
+ selector: selKey,
+ values: keyVals
+ });
+ }
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+}
+exports.getCSSStyle = getCSSStyle;
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CacheUtil.ts":
+/*!**********************************!*\
+ !*** ./src/v4/util/CacheUtil.ts ***!
+ \**********************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.clearCaches = exports.setCache = exports.getCache = void 0;
+var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+/* Return a pointer to the given global variable
+ * with its initial value as given */
+function getCache(cacheSpot, keyName, initValue) {
+ var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot;
+ if (cacheObj.aceCache === undefined) {
+ cacheObj.aceCache = {};
+ }
+ if (cacheObj.aceCache[keyName] === undefined) {
+ cacheObj.aceCache[keyName] = initValue;
+ }
+ return cacheObj.aceCache[keyName];
+}
+exports.getCache = getCache;
+function setCache(cacheSpot, globalName, value) {
+ var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot;
+ if (cacheObj.aceCache === undefined) {
+ cacheObj.aceCache = {};
+ }
+ cacheObj.aceCache[globalName] = value;
+ return value;
+}
+exports.setCache = setCache;
+function clearCaches(cacheRoot) {
+ delete cacheRoot.ownerDocument.aceCache;
+ var nw = new DOMWalker_1.DOMWalker(cacheRoot);
+ do {
+ delete nw.node.aceCache;
+ nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache;
+ } while (nw.nextNode());
+}
+exports.clearCaches = clearCaches;
+
+
+/***/ }),
+
+/***/ "./src/v4/util/CommonUtil.ts":
+/*!***********************************!*\
+ !*** ./src/v4/util/CommonUtil.ts ***!
+ \***********************************/
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getDeprecatedAriaAttributes = exports.getDeprecatedAriaRoles = exports.isTableDescendant = exports.getConflictAriaAndHtmlAttributes = exports.getInvalidAriaAttributes = exports.getRolesUndefinedByAria = exports.getInvalidRoles = exports.areRolesDefined = void 0;
+var legacy_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts");
+var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts");
+/*
+ * check if any explicit role specified for the element is a valid ARIA role
+ * return: null if no explicit role is defined,
+ * true if the role(s) are defined in ARIA
+ * false if any role is not defined in ARIA
+*/
+function areRolesDefined(roles) {
+ if (!roles || roles.length === 0)
+ return null;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) {
+ var role = roles_1[_i];
+ if (!(role.toLowerCase() in designPatterns))
+ return false;
+ }
+ return true;
+}
+exports.areRolesDefined = areRolesDefined;
+/*
+ * check if any explicit role specified for the element is a valid ARIA role
+ * return: null if no explicit role is defined,
+ * true if the role(s) are defined in ARIA
+ * false if any role is not defined in ARIA
+*/
+function getInvalidRoles(ruleContext) {
+ var domRoles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ if (!domRoles || domRoles.length === 0)
+ return null;
+ // check the 'generic' role first
+ if (domRoles && domRoles.includes('generic'))
+ return ["generic"];
+ // Failing roles
+ var failRoleTokens = [];
+ // Passing roles
+ var passRoleTokens = [];
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var allowedRoles = legacy_1.RPTUtil.getAllowedAriaRoles(ruleContext, tagProperty);
+ if (!allowedRoles && allowedRoles.length === 0)
+ return domRoles;
+ var invalidRoles = [];
+ if (allowedRoles && allowedRoles.includes('any'))
+ return [];
+ for (var i = 0; i < domRoles.length; i++)
+ if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i]))
+ invalidRoles.push(domRoles[i]);
+ return invalidRoles;
+}
+exports.getInvalidRoles = getInvalidRoles;
+/*
+ * check if any explicit role specified for the element is not defined in ARIA
+ * return: list of specified roles not defined in ARIA
+*/
+function getRolesUndefinedByAria(element) {
+ if (!element)
+ return null;
+ var roles = legacy_1.RPTUtil.getRoles(element, false);
+ var undefinedRoles = [];
+ if (roles && roles.length > 0) {
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ for (var i = 0; i < roles.length; i++) {
+ if (!(roles[i] in designPatterns)) {
+ undefinedRoles.push(roles[i]);
+ }
+ }
+ }
+ return undefinedRoles;
+}
+exports.getRolesUndefinedByAria = getRolesUndefinedByAria;
+/*
+ * this method first checks explicit roles, if no explicit role, it will check the implicit role
+ * return: null if any explicit role is invalid,
+ * a list of invalid attributes
+ * empty list if all attributes are valid, or no aria attributes are specified
+ */
+function getInvalidAriaAttributes(ruleContext) {
+ var roles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ // for mutiple roles, skip if any role is invalid
+ var defined = areRolesDefined(roles);
+ if (defined !== null && !defined)
+ return null;
+ var attrs = [];
+ if (!roles || roles.length == 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var aria_attrs = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ // Attributes allowed on this node
+ var allowedAttributes = legacy_1.RPTUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty);
+ if (aria_attrs) {
+ for (var i = 0; i < aria_attrs.length; i++) {
+ var attrName = aria_attrs[i].trim().toLowerCase();
+ if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName))
+ attrs.push(attrName);
+ }
+ }
+ return attrs;
+}
+exports.getInvalidAriaAttributes = getInvalidAriaAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function getConflictAriaAndHtmlAttributes(elem) {
+ var ariaAttrs = legacy_1.RPTUtil.getUserDefinedAriaAttributeNameValuePairs(elem);
+ var htmlAttrs = legacy_1.RPTUtil.getUserDefinedHtmlAttributeNameValuePairs(elem);
+ var ret = [];
+ if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) {
+ var _loop_1 = function (i) {
+ var examinedHtmlAtrNames = legacy_1.RPTUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict');
+ if (examinedHtmlAtrNames === null)
+ return "continue";
+ examinedHtmlAtrNames.forEach(function (item) {
+ if (item['result'] === 'Failed') //failed
+ ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] });
+ });
+ };
+ for (var i = 0; i < ariaAttrs.length; i++) {
+ _loop_1(i);
+ }
+ }
+ return ret;
+}
+exports.getConflictAriaAndHtmlAttributes = getConflictAriaAndHtmlAttributes;
+/*
+ * get conflict Aria and Html attributes
+ * return: a list of Aria and Html attribute pairs that are conflict
+*/
+function isTableDescendant(contextHierarchies) {
+ if (!contextHierarchies)
+ return null;
+ return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); });
+}
+exports.isTableDescendant = isTableDescendant;
+/*
+ * get deprecated Aria roles
+ * return: a list of deprecated Aria roles
+*/
+function getDeprecatedAriaRoles(element) {
+ if (!element)
+ return null;
+ var roles = legacy_1.RPTUtil.getRoles(element, false);
+ var ret = [];
+ if (roles && roles.length > 0) {
+ var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles;
+ for (var i = 0; i < roles.length; i++) {
+ if (globalDeprecatedRoles.includes(roles[i]))
+ ret.push(roles[i]);
+ }
+ }
+ return ret;
+}
+exports.getDeprecatedAriaRoles = getDeprecatedAriaRoles;
+/*
+ * get deprecated Aria role-attributes
+ * return: a list of deprecated Aria role-attributes paris
+ * for global the role is marked as 'any'
+*/
+function getDeprecatedAriaAttributes(element) {
+ if (!element)
+ return null;
+ var domAttributes = element.attributes;
+ var ariaAttrs = [];
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name;
+ if (attrName.substring(0, 5) === 'aria-')
+ ariaAttrs.push(attrName);
+ }
+ }
+ if (ariaAttrs.length === 0)
+ return [];
+ var ret = [];
+ var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties;
+ for (var i = 0; i < ariaAttrs.length; i++) {
+ if (globalDeprecatedAttributes.includes(ariaAttrs[i]))
+ ret.push({ "role": "any", "attribute": ariaAttrs[i] });
+ }
+ var roles = legacy_1.RPTUtil.getRoles(element, false);
+ if (roles && roles.length > 0) {
+ for (var i = 0; i < roles.length; i++) {
+ var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]];
+ if (roleWithDeprecatedAttributes) {
+ var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps'];
+ if (deprecatedAttriNames && deprecatedAttriNames.length > 0) {
+ for (var j = 0; j < ariaAttrs.length; j++) {
+ if (deprecatedAttriNames.includes(ariaAttrs[j]))
+ ret.push({ "role": roles[i], "attribute": ariaAttrs[j] });
+ }
+ }
+ }
+ }
+ }
+ return ret;
+}
+exports.getDeprecatedAriaAttributes = getDeprecatedAriaAttributes;
+
+
+/***/ }),
+
+/***/ "./src/v4/sc-urls.json":
+/*!*****************************!*\
+ !*** ./src/v4/sc-urls.json ***!
+ \*****************************/
+/***/ ((module) => {
+
+module.exports = JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG21/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG21/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG21/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG21/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG21/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG21/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG21/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG21/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG21/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG21/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG21/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG21/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG21/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG21/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG21/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG21/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG21/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG21/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG21/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG21/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG21/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG21/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG21/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG21/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG21/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG21/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG21/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG21/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG21/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG21/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG21/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG21/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG21/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG21/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG21/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG21/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG21/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG21/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG21/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG21/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG21/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG21/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG21/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG21/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG21/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG21/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG21/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG21/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG21/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG21/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG21/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG21/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:WCAG2:pointer-gestures","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG21/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG21/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG21/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG21/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG21/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG21/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG21/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG21/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG21/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG21/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG21/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG21/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG21/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG21/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG21/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG21/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG21/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG21/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG21/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG21/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG21/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG21/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG21/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG21/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG21/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG21/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"HTML Messages","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://w3c.github.io/aria/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://w3c.github.io/aria/","understandingUrl":"https://w3c.github.io/aria/","handle":"ARIA Messages","level":"NA","wcagType":"NA"}}');
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+var exports = __webpack_exports__;
+/*!**********************!*\
+ !*** ./src/index.ts ***!
+ \**********************/
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.checkDemo = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0;
+var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts");
+Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } }));
+// import { Simulator } from "./v2/simulator"
+var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts");
+Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } }));
+var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts");
+Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } }));
+var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts");
+Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } }));
+var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts");
+Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } }));
+String.prototype.startsWith = String.prototype.startsWith || function (str) {
+ return this.indexOf(str) === 0;
+};
+String.prototype.includes = String.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+Array.prototype.includes = Array.prototype.includes || function (str) {
+ return this.indexOf(str) !== -1;
+};
+function checkDemo(timeout) {
+ if (!timeout)
+ timeout = 0;
+ var checker = new Checker_1.Checker();
+ setTimeout(function () {
+ checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"])
+ .then(function (report) {
+ console.log(report);
+ var vals = {
+ "FAIL": 0,
+ "POTENTIAL": 1,
+ "MANUAL": 2,
+ "PASS": 3
+ };
+ for (var idx = 0; idx < report.results.length; ++idx) {
+ if (report.results[idx].value[1] === "PASS") {
+ report.results.splice(idx--, 1);
+ }
+ }
+ report.results.sort(function (a, b) {
+ if (a.category != b.category) {
+ return a.category.localeCompare(b.category);
+ }
+ if (a.path["aria"] === b.path["aria"]) {
+ return vals[a.value[1]] - vals[b.value[1]];
+ }
+ return a.path["aria"].localeCompare(b.path["aria"]);
+ });
+ var lastPath = null;
+ var category = null;
+ for (var _i = 0, _a = report.results; _i < _a.length; _i++) {
+ var result = _a[_i];
+ if (category !== result.category) {
+ if (category !== null) {
+ console.groupEnd();
+ console.groupEnd();
+ lastPath = null;
+ }
+ category = result.category;
+ console.group(result.category);
+ }
+ if (result.path["aria"] != lastPath) {
+ if (lastPath !== null) {
+ console.groupEnd();
+ }
+ lastPath = result.path["aria"];
+ if (lastPath === "") {
+ console.group("page");
+ }
+ else {
+ console.group(lastPath);
+ }
+ }
+ console.log(result.value, result.message);
+ }
+ console.groupEnd();
+ console.groupEnd();
+ });
+ }, timeout);
+}
+exports.checkDemo = checkDemo;
+
+})();
+
+ace = __webpack_exports__;
+/******/ })()
+;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN21HLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdpRSxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzV6RCxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN6eEIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzakIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4a0UsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbnFDLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbGxDLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4MUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzM1SCxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN6akUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3YxSCxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzMrRixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDL2lDLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDL25FLENBQUUsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNuVyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzM5QixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3cEcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3hxRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ3h5QixDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNuakIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDaDNDLENBQUUsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUNuNUQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDMThDLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxF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RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7b0JBQ3pGLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO29CQUN0RixLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDMUYsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtvQkFDN0YsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDL0YsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSztvQkFDekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO29CQUM3RixJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFP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TyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuQixRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUNuQjtvQkFDRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2lCQUNqQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO29CQUNqQyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7d0JBQ25CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDdEI7b0JBQ0QsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQy9CLElBQUksUUFBUSxLQUFLLEVBQUUsRUFBRTt3QkFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDekI7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDM0I7aUJBQ0o7Z0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQXhERCw4QkF3REMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBRGVmaW5pdGlvbnMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBV2Fsa2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3Rvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbW1vbk1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9FbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbmZpZy9Db25maWcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9Db2xvclV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01VdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NV2Fsa2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vVmlzVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvc3R5bGUvU3R5bGVNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2FwaS9JR3VpZGVsaW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZ3JhcGhpY19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9oaWRkZW5fbm9udGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2ltZ19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcGFyZW50X3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlbWFudGljcy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV93aWRnZXRfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FzY2lpYXJ0X2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2Nzc19yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2VsZW1fZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxvY2txdW90ZV9jaXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYXB0aW9uX3RyYWNrX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZGVzaWduX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9wb3B1cF9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RlYnVnX3BhdGhzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZXRlY3Rvcl90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGlyX2F0dHJpYnV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9sYW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX25vZW1iZWRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbW90aWNvbnNfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZXJyb3JfbWVzc2FnZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sZWdlbmRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZ3VyZV9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fZm9udF9jb2xvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3NyY192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX21hcmt1cF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfbGFuZ19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfc2tpcG5hdl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VidXR0b25fYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VtYXBfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X251bGwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfaXNtYXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfbG9uZ2Rlc2NfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2ZpZWxkc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9oYXNwb3B1cF9jb25mbGljdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYWZ0ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2JlZm9yZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9vbmNoYW5nZV9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9uYW1lX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9jaGlsZHJlbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9tYXJrdXBfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X3N0cnVjdHVyZV9wcm9wZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21hcnF1ZWVfZWxlbV9hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2JyaWVmLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdWRpb190cmFuc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9saXZlX2NhcHRpb25lZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfdHJhY2tfYXZhaWxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZGlyZWN0X29wdGlvbmFsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZnJlc2hfZGVsYXkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfdmlld3BvcnRfem9vbWFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL25vZW1iZWRfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL29iamVjdF90ZXh0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X3NlbGVjdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NlbGVjdF9vcHRpb25zX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9kZXNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfY29sb3JfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9mb2N1c192aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaG92ZXJfcGVyc2lzdGVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX25lc3RlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlbGF0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2xheW91dF9saW5lYXJpemVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zY29wZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3RydWN0dXJlX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfYmxvY2tfaGVhZGluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9jb250cmFzdF9zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3F1b3RlZF9jb3JyZWN0bHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc2Vuc29yeV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc3BhY2luZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF93aGl0ZXNwYWNlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlc2V0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DU1NVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NhY2hlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db21tb25VdGlsLnRzIiwid2VicGFjazovL2FjZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKmdsb2JhbCBPcGVuQWpheCovXG4vLyBhbGwgcmVmZXJlbmNlcyB0byBXQUktQVJJQSBzcGVjaWZpY2F0aW9uIGlzIHRoZSBXQUktQVJJQSAxLjJcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvXG5cbmV4cG9ydCB0eXBlIElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSB7XG4gICAgaW1wbGljaXRSb2xlOiBzdHJpbmdbXSxcbiAgICB2YWxpZFJvbGVzOiBzdHJpbmdbXSxcbiAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBib29sZWFuLFxuICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sIFxuICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sXG4gICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgLy9yb2xlcywgb3RoZXIgdGhhbiBpbXBsaWNpdCBhbmQgdmFsaWQgcm9sZXMsIHdob3NlIGF0dHJpYnV0ZXMgYXJlIGFsc28gYWxsb3dlZFxuICAgIC8vIGEgZmV3IGVsZW1lbnRzIChzdWNoIGFzIGRhdGFsaXN0LCBodG1sLCBjYXB0aW9uKSB0aGF0IGhhdmUgYW4gaW1wbGljaXQgcm9sZSBidXQgZGlzYWxsb3cgc29tZSBvciBhbGwgYXR0cmlidXRlcyBhbGxvd2VkIGZvciB0aGUgcm9sZS5cbiAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlPzogYm9vbGVhbixcbiAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU/OiBzdHJpbmdbXSAgLy9zb21lIGVsZW1lbnRzICh2YXIsYWJiciBldGMuKSBoYXZlIG5vIGltcGxpY2l0IHJvbGUgYnV0IG5hbWluZyBwcm9oaWJpdGVkICAgXG59XG5cbmV4cG9ydCBjbGFzcyBBUklBRGVmaW5pdGlvbnMge1xuICAgIHN0YXRpYyBuYW1lRnJvbUNvbnRlbnQocm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogYXJyYXkgb2YgV0FJLUFSSUEgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllc1xuICAgICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jZ2xvYmFsX3N0YXRlc1xuICAgICAqL1xuICAgIHN0YXRpYyBnbG9iYWxQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLWF0b21pY1wiLCBcImFyaWEtYnVzeVwiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWN1cnJlbnRcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1oaWRkZW5cIiwgXCJhcmlhLWtleXNob3J0Y3V0c1wiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWxpdmVcIiwgXCJhcmlhLW93bnNcIiwgXCJhcmlhLXJlbGV2YW50XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIlxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4yLCB3aWxsIGluZGljYXRlIGRlcHJlY2F0aW9uIGluIGluZGl2aWR1YWwgcm9sZVxuICAgICAgICAsICdhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ1xuICAgIF07XG5cbiAgICAvL3Byb3BlcnRpZXMgY29udGFpbnMgaWQocykgdGhhdCByZWZlciB0byBvdGhlciBlbGVtZW50KHMpXG4gICAgc3RhdGljIHJlZmVyZW5jZVByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtb3duc1wiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIl07XG5cbiAgICAvLyBkZXByZWNhdGVkIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRSb2xlcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnZGlyZWN0b3J5JywgJ2RvYy1iaWJsaW9lbnRyeScsICdkb2MtZW5kbm90ZSdcbiAgICBdO1xuXG4gICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMSBmb3IgYWxsIHRoZSByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtZHJvcGVmZmVjdCdcbiAgICBdO1xuICAgIFxuICAgIC8qXG4gICAgICogWFNEIGRhdGEgdHlwZXMgZm9yIGFsbCBXQUktQVJJQSBwcm9wZXJ0aWVzXG4gICAgICogYWxvbmcgd2l0aCB2YWxpZCB2YWx1ZXMgd2hlbiB0aGUgZGF0YSB0eXBlIGlzIE5NVE9LRU5cbiAgICAgKiBXQUktQVJJQSBwcm9wZXJ0aWVzIGRhdGEgdHlwZXMgZXhwbGFuZWQ6XG4gICAgICogIHR5cGU6IFVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdmFsdWVzIGFsbG93ZWQgZm9yIHRoZSBXQUktQVJJQSBwcm9wZXJ0eVxuICAgICAqICB2YWx1ZXM6IFVzZWQgdG8gaWRlbnRpZnkgc3BlY2lmaWMgdmFsdWVzIG9mIGFuIFdBSS1BUklBIHByb3BlcnR5IHdoZW4gdHlwZSBpcyBubXRva2VuXG4gICAgICogIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBVc2VkIHRvIGlkZW50aWZ5IGlmIHRoZSBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyByZWZlcmVuY2luZyBoaWRkZW4gSURcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldCB0byBmYWxzZSwgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcHJvcGVydHlEYXRhVHlwZXMgOiB7IFxuICAgICAgICBbcHJvcDogc3RyaW5nXSA6IHsgXG4gICAgICAgICAgICB0eXBlOiBzdHJpbmcsIFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgdmFsdWVzPzogc3RyaW5nW10gXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXRvbWljXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImlubGluZVwiLCBcImxpc3RcIiwgXCJib3RoXCIsIFwibm9uZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgdG8gaGFuZGxlIHZhbHVlIGVtcHR5XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sY291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29saW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInBhZ2VcIiwgXCJzdGVwXCIsIFwibG9jYXRpb25cIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJjb3B5XCIsIFwibW92ZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCIsIFwicG9wdXBcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWZsb3d0b1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1ncmFiYmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtZW51XCIsIFwibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwic3BlbGxpbmdcIiwgXCJncmFtbWFyXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWtleXNob3J0Y3V0c1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGV2ZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wib2ZmXCIsIFwicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW93bnNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wb3NpbnNldFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlbGV2YW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYWRkaXRpb25zXCIsIFwicmVtb3ZhbHNcIiwgXCJ0ZXh0XCIsIFwiYWxsXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2NvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2luZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhc2NlbmRpbmdcIiwgXCJkZXNjZW5kaW5nXCIsIFwib3RoZXJcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZXRleHRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBkZXNpZ24gcGF0dGVybnMgZm9yIGNvbmNyZXRlIFdBSS1BUklBIHJvbGVzXG4gICAgICogbGVnaXRpbWF0ZSBrZXlzIGZvciBlYWNoIHJvbGUgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gY29udGFpbmVyOiBhcHByb3ByaWF0ZSBjb250YWluZXIocykgZm9yIHRoYXQgcm9sZVxuICAgICAqIC0gcHJvcHM6IHN0YXRlcyBhbmQgcHJvcGVydGllcyB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlIChpbiBhZGRpdGlvbiB0byB0aGUgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllcyBsaXN0ZWQgYWJvdmUpXG4gICAgICogLSByZXFQcm9wczogcmVxdWlyZWQgc3RhdGVzIG9yIHByb3BlcnRpZXMgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcmVxQ2hpbGRyZW46IHJlcXVpcmVkIGNoaWxkcmVuIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIGh0bWxFcXVpdjogSFRNTCBlcXVpdmFsZW50IGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJvbGVUeXBlOiBvbmUgb2Ygd2lkZ2V0LCBzdHJ1Y3R1cmUsIGxhbmRtYXJrLCBsaXZlUmVnaW9uLCB3aW5kb3cgKGFzIHNlZW4gaW4gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jcm9sZXNfY2F0ZWdvcml6YXRpb24pXG4gICAgICogLSBuYW1lUmVxdWlyZWQ6IGRldGVybWluZXMgd2hldGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGEgd2lkZ2V0IChzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIG5hbWVGcm9tOiBkZXRlcm1pbmVzIGhvdyBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgKGF1dGhvciBvciBjb250ZW50IC0gc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBkZXByZWNhdGVkOiBpZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcm9sZSBpcyBkZXByZWNhdGVkLCBhbmQgcHJvdmlkZXMgYSBsaXN0IG9mIGFsdGVybmF0aXZlIHJvbGUocylcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzaWduUGF0dGVybnMgOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IHN0cmluZ1tdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBzdHJpbmcsXG4gICAgICAgICAgICByb2xlVHlwZT86IHN0cmluZyxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBuYW1lRnJvbT86IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbj86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhbGVydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhbGVydGRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdlbmVyaWNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRpdiB8IHNwYW5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncmFwaGljcy1kb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLW9iamVjdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1zeW1ib2xcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiXSwgLy8gcm93Z3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRhYmxlXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW5zZXJ0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9sIHwgdWxcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcIm9wdGlvblwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm1hcmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFycXVlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibmF2aWdhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub25lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3JhZGlvJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9ncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJyb3dncm91cFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRyXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93Z3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0Ym9keSB8IHRmb290IHwgdGhlYWRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3doZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J3JvdyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdzZWFyY2gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1YnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1Z2dlc3Rpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCIsIFwiY2FwdGlvblwiXSwgLy8gcm93Z3JvdXAgYW5kIGNhcHRpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInRhYlwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJwYW5lbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGVybVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGZuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRleHRib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSd0ZXh0J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2x0aXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCAvLyBBUklBIDEuMiBoYXMgdGhpcyBhcyBuYW1lUmVxdWlyZWQ6IHRydWUsIGJ1dCBBUklBIDEuMyByZW1vdmVkIGl0IGJlY2F1c2UgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVxdWlyZSBhIG5hbWUgb24gYSB0b29sdGlwLlxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcInRyZWVpdGVtXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiXSwgLy8gcm93Z3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgfSAvLyBlbmQgZGVzaWduUGF0dGVybnNcblxuICAgIC8vIGNvcGllZCBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy1vdGhlci5odG1sI2Rpc2FibGVkLWVsZW1lbnRzXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWREaXNhYmxlZCA9IFtcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImZpZWxkc2V0XCJdOyAvLyBhbHNvIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZXF1aXJlZCA9IFtcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY3Vhc2UgcmVxdWlyZWQgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkgPSBbXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWNhdXNlIHJlYWRvbmx5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiZmlsZVwiLCBoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG5cblxuICAgIC8qIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgb2YgdGhlIHRhZ3MgcmVsYXRlZCB0byByb2xlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3MgY29udGFpbnMgdGhvc2UgdGFncyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uc1xuICAgICAgICAqL1xuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQ6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwibWFpblwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXNpZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21wbGVtZW50YXJ5XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb290bm90ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtdGlwXCIsIFwiZmVlZFwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJhc2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZG9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJvZHlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtaGlkZGVuJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhbnZhc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnY2FwdGlvbiddLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNpdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xncm91cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3Rib3hcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZm5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRpYWxvZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0ZGlhbG9nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgIFwiZGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1iZWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmllbGRzZXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmb3JtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImhncm91cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtcGFnZWJyZWFrXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwia2JkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsYWJlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxlZ2VuZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1haW5cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWF0aFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtZXRlclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJ10sXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5hdlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtaW5kZXhcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtdG9jXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJ0YWJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJub3NjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm9wdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtc2VsZWN0ZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJvdXRwdXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdGF0dXNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInBhcmFncmFwaFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWN0dXJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJvZ3Jlc3NiYXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJydFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwicnVieVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwic2FtcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnc2VhcmNoJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ3NlYXJjaCcsICdmb3JtJywgJ2dyb3VwJywgJ25vbmUnLCAncHJlc2VudGF0aW9uJywgJ3JlZ2lvbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNsb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic21hbGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGFuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdHJvbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ViXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Vic2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN1cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1cGVyc2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN2Z1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyYXBoaWNzLWRvY3VtZW50XCJdLCAvLyBhcyBkZWZpbmVkIGJ5IFNWRyBBQU1cbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRlbXBsYXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGZvb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0aW1lXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpdGxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRyYWNrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidmFyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3YnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcblxuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnczoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICAgICAgfSB8IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1iYWNrbGlua1wiLCBcImRvYy1iaWJsaW9yZWZcIiwgXCJkb2MtZ2xvc3NyZWZcIiwgXCJkb2Mtbm90ZXJlZlwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWQ9dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImF1dG9ub21vdXMgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSBubyBjb3JyZXNwb25kaW5nIHJvbGUuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImFueSByb2xlXCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuICAgICAgICBcImRpdlwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogWydkb2MtZXhhbXBsZSddLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWx0LXRleHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGhhcyB0ZXh0IChpcyBub3QgZW1wdHkpXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJzY3JvbGxiYXJcIiwgXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aC1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlIGlzIGVtcHR5XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGFsdCBhdHRyaWJ1dGUsIGFyaWEtbGFiZWwsIG9yIGFyaWEtbGFiZWxsZWRieSBhcmUgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2dlbmVyaWMnXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJ3aXRoLW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmVnaW9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiB7XG4gICAgICAgICAgICBcIm5vLW11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBhIG11bHRpcGxlIGF0dHJpYnV0ZSBvciBhIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggbm8gbXVsdGlwbGUgYXR0cmlidXRlIGFuZCBubyBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiB7XG4gICAgICAgICAgICBcImZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRib2R5XCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRkXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGhcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2x1bW5oZWFkZXJcIiwgXCJjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0clwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZGVmYXVsdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiXCIsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1xuXG4gICAgLy8gbWFwIGFyaWEgYXR0cmlidXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBhdHRyaWJ1dGUsIGFwcGx5IHRvIGFueSBlbGVtZW50IGFwcGxpY2FibGVcbiAgICAvLyBub3RlIHRoaXMgbWFwcGluZyBpcyBmb3IgdGhlIHJlbGF0ZWQgYXR0cmlidXRlcyBpbiB0aGUgc2FtZSBlbGVtZW50IHdpdGhvdXQgY2hlY2tpbmcgdGhlIHBhcmVudCB0cmVlLlxuICAgIC8vIHJlZmVyIHRvIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9odG1sLWFyaWEvXG4gICAgc3RhdGljIHJlbGF0ZWRBcmlhSHRtbEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgW2FyaWFBdHRyOiBzdHJpbmddIDoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBzdHJpbmdbXSB8IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZz86IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicGxhY2Vob2xkZXJcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWF4XCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjogQXV0aG9ycyBTSE9VTEQgTk9UIHVzZSBhcmlhLXZhbHVlbWF4IG9uIGFueSBlbGVtZW50IHdoaWNoIGFsbG93cyB0aGUgbWF4IGF0dHJpYnV0ZS4gVXNlIHRoZSBtYXggYXR0cmlidXRlIGluc3RlYWQuIFxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOkF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1pbiBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1pbiBhdHRyaWJ1dGUuIFVzZSB0aGUgbWluIGF0dHJpYnV0ZSBpbnN0ZWFkLlxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZWFkb25seVwiLCBcImNvbnRlbnRlZGl0YWJsZVwiLCBcImlzY29udGVudGVkaXRhYmxlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtudWxsLCBcImZhbHNlXCIsIFwiZmFsc2VcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJ0cnVlXCIsIFwidHJ1ZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0cyBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgY29uZmxpY3RcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIm9uXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gIFxuICAgIH1cblxuICAgIHN0YXRpYyBjb250YWluZXJzID0gW11cbn07XG5cbmxldCBjb250YWluZXJBcnJheSA9IFtdO1xuXG5mb3IgKGNvbnN0IHJvbGVEZXNpZ24gaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlRGVzaWduXS5jb250YWluZXI7XG4gICAgaWYgKGNvbnRhaW5lcnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgY29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckFycmF5LmluZGV4T2YoY29udGFpbmVyKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckFycmF5LnB1c2goY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbkFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzID0gY29udGFpbmVyQXJyYXk7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ29tbW9uTWFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9Db21tb25NYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCJcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbnR5cGUgRWxlbUNhbGMgPSAoZWxlbTogRWxlbWVudCkgPT4gc3RyaW5nO1xudHlwZSBOb2RlQ2FsYyA9IChub2RlOiBOb2RlKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjbGFzcyBBUklBTWFwcGVyIGV4dGVuZHMgQ29tbW9uTWFwcGVyIHtcbiAgICBjaGlsZHJlbkNhbkhhdmVSb2xlKG5vZGU6IE5vZGUsIHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuICEocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnByZXNlbnRhdGlvbmFsQ2hpbGRyZW4pO1xuICAgIH1cbiAgICBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJhcmlhXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbbmFtZS5zdWJzdHJpbmcoNSldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFwcGx5QXR0clJvbGU9IGZ1bmN0aW9uKG5vZGVOYW1lOnN0cmluZykge1xuICAgICAgICAgICAgICAgIGlmICghKG5vZGVOYW1lIGluIEFSSUFNYXBwZXIuZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXR0ciBpbiByZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yc1tub2RlTmFtZV1bYXR0cl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBOb2RlQ2FsYykoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGx5QXR0clJvbGUoXCJnbG9iYWxcIik7XG4gICAgICAgICAgICBhcHBseUF0dHJSb2xlKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzW2F0dHJdKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9IFwidW5kZWZpbmVkXCIgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXJpYU93bmVkQnkoZWxlbTogSFRNTEVsZW1lbnQpIDogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZG9jID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQoZWxlbSk7XG4gICAgICAgIGlmICghZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZXIsIG93bmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUob3duZWQsIFwiYXJpYS1vd25lZFwiLCBvd25lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRDYWNoZShlbGVtLCBcImFyaWEtb3duZWRcIiwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50SGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpKTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW107XG4gICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gZ2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCFub2RlSGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQgLSBidXQgOjpyZXNldCBwcm9jZXNzZXMgdGhlbSBhbGwgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgZGV0YWlscyBhYm91dCB0aGUgY29ycmVjdCBwYXJlbnQgZmlyc3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IFwibm9uZVwiIHx8IHBhcmVudEluZm8ucm9sZSA9PT0gXCIvbm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkocGFyZW50KSB8fCBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgbm9kZSBpbmZvXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVJbmZvIDoge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiBhbnksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiBib29sZWFuXG4gICAgICAgICAgICAgICAgfSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZWxlbS5ub2RlVHlwZSA9PT0gMSA/IHRoaXMuZ2V0QXR0cmlidXRlcyhlbGVtKToge30sICAgXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMoZWxlbSksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKGVsZW0pIHx8IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gPSAocGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoK1wiL1wiK25vZGVJbmZvLnJvbGUrXCJbXCIrcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0rXCJdXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2gobm9kZUluZm8pO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBub2RlSGllcmFyY2h5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICBBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuICAgICAgICAvLyBHZXQgdG8gdGhlIHRvcG1vc3Qgbm9kZVxuICAgICAgICBsZXQgZ29vZE5vZGUgPSBub2RlO1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKG5leHQgPSBET01XYWxrZXIucGFyZW50Tm9kZShnb29kTm9kZSkpIHtcbiAgICAgICAgICAgIGdvb2ROb2RlID0gbmV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2FsayB0aGUgdHJlZSBhbmQgc2V0IHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgbGV0IGFyaWFXYWxrZXIgPSBuZXcgQVJJQVdhbGtlcihnb29kTm9kZSwgZmFsc2UsIGdvb2ROb2RlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFyaWFXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShhcmlhV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChhcmlhV2Fsa2VyLm5leHROb2RlKCkpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcbiAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmhpZXJhcmNoeVJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGVbMF0gPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSA9IHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhbiBlbGVtZW50LCBubyBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91ciBub2RlIGluZm9cbiAgICAgICAgbm9kZUhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShub2RlKTtcbiAgICAgICAgbGV0IG5vZGVJbmZvID0gbm9kZUhpZXJhcmNoeVtub2RlSGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gobm9kZUluZm8ucm9sZSk7XG4gICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2gobm9kZUluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gbm9kZUhpZXJhcmNoeTtcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGUgPSBcIi9cIityZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBwYXJlbnQgPyBnZXRDYWNoZShwYXJlbnQgYXMgSFRNTEVsZW1lbnQsIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUluZm9cIiwgW10pIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIC8vLy9cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI21hcHBpbmctaHRtbC10by1hY2Nlc3NpYmlsaXR5LWFwaXNcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbbm9kZU5hbWU6c3RyaW5nXTogeyBbYXR0cjpzdHJpbmddOiBzdHJpbmcgfCBFbGVtQ2FsYyB9fSA9IHtcbiAgICAgICAgXCJnbG9iYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHRydWUsIG9yIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gLSB0eXBlPVwicmFkaW9cIiBzdGF0ZSBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuIFxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4geyBcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNoZWNrYm94XCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW0sIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVybGlzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGxpcy5sZW5ndGgtb3RoZXJsaXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBvc2l0aW9uIG9mIGxpIGVsZW1lbnQgd2l0aGluIHRoZSBvbCwgdWwsIG1lbnVcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykgcmV0dXJuIGN1ci5ub2RlVmFsdWU7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDExKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yIChcIkNhbiBvbmx5IGNvbXB1dGUgbmFtZSBvbiBFbGVtZW50IGFuZCBUZXh0IFwiICsgY3VyLm5vZGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW0gPSBjdXIgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gV2UndmUgYmVlbiBoZXJlIGJlZm9yZSAtIHByZXZlbnQgcmVjdXJzaW9uXG4gICAgICAgIGlmIChnZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIFwiXCIrd2Fsa0lkKTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2lucHV0LXR5cGUtdGV4dC1pbnB1dC10eXBlLXBhc3N3b3JkLWlucHV0LXR5cGUtc2VhcmNoLWlucHV0LXR5cGUtdGVsLWlucHV0LXR5cGUtdXJsLWFuZC10ZXh0YXJlYS1lbGVtZW50XG5cbiAgICAgICAgLy8gMmEuIE9ubHkgc2hvdyBoaWRkZW4gY29udGVudCBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYSBsYWJlbGxlZGJ5XG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICFET01XYWxrZXIuaXNOb2RlVmlzaWJsZShjdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJiLiBjb2xsZWN0IHZhbGlkIGlkIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbGxlZGJ5ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgbGV0IHZhbGlkRWxlbXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGxhYmVsbGVkYnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoY3VyLCByZWYpO1xuICAgICAgICAgICAgICAgIGlmIChyZWZFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJlZkVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkRWxlbXMucHVzaChyZWZFbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsaWRFbGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdmFsaWRFbGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgZWxlbSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luY2Ugbm9kZVRvUm9sZSBjYWxscyBiYWNrIGhlcmUgZm9yIGZvcm0gYW5kIHNlY3Rpb24sIHdlIG5lZWQgc3BlY2lhbCBjYXNpbmcgaGVyZSB0byBoYW5kbGUgdGhvc2UgdHdvIGNhc2VzXG4gICAgICAgIGlmIChbXCJzZWN0aW9uXCIsIFwiZm9ybVwiXS5pbmNsdWRlcyhjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJjLiBJZiBsYWJlbCBvciB3YWxrLCBhbmQgdGhpcyBpcyBhIGNvbnRyb2wsIHNraXAgdG8gdGhlIHZhbHVlLCBvdGhlcndpc2UgcHJvdmlkZSB0aGUgbGFiZWxcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShjdXIpO1xuICAgICAgICBsZXQgaXNFbWJlZGRlZENvbnRyb2wgPSBbXG4gICAgICAgICAgICBcInRleHRib3hcIiwgXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImxpc3Rib3hcIiwgXG4gICAgICAgICAgICBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXG4gICAgICAgIF0uaW5jbHVkZXMocm9sZSk7XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSB8fCAhaXNFbWJlZGRlZENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJkLiBcbiAgICAgICAgaWYgKHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCIgJiYgcm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIGlmICgoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgfHwgY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYXJlYVwiKSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBET01VdGlsLmNsZWFuV2hpdGVzcGFjZShlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKSkudHJpbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IChsYWJlbC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKGN1ciwgbGFiZWwuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGxhYmVsLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImZpZWxkc2V0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiggKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWdlbmQgPSAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVnZW5kLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgY3VyLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmUuXG4gICAgICAgIGlmICgod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgJiYgaXNFbWJlZGRlZENvbnRyb2wpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIHRleHRib3gsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgYnV0dG9uLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGJ1dHRvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbXCJidXR0b25cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwic3VibWl0XCIpIHJldHVybiBcIlN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwicmVzZXRcIikgcmV0dXJuIFwiUmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETzogSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgY29tYm9ib3ggb3IgbGlzdGJveCwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjaG9zZW4gb3B0aW9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICYmICFET01VdGlsLnNhbWVOb2RlKGVsZW0sIHNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIHJhbmdlIChlLmcuLCBhIHNwaW5idXR0b24gb3Igc2xpZGVyKTpcbiAgICAgICAgICAgIGlmIChbXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJpYS12YWx1ZXRleHQgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgYXJpYS12YWx1ZW5vdyBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogT3RoZXJ3aXNlLCB1c2UgdGhlIHZhbHVlIGFzIHNwZWNpZmllZCBieSBhIGhvc3QgbGFuZ3VhZ2UgYXR0cmlidXRlLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmYuIDJoLlxuICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IEFSSUFEZWZpbml0aW9ucy5uYW1lRnJvbUNvbnRlbnQocm9sZSkgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSB7XG4gICAgICAgICAgICAvLyAyZmkuIFNldCB0aGUgYWNjdW11bGF0ZWQgdGV4dCB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAgICAgICAgbGV0IGFjY3VtdWxhdGVkID0gXCJcIjtcbiAgICAgICAgICAgIC8vIDJmaWkuIENoZWNrIGZvciBDU1MgZ2VuZXJhdGVkIHRleHR1YWwgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBhbmQgXG4gICAgICAgICAgICAvLyBpbmNsdWRlIGl0IGluIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LiBUaGUgQ1NTIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIFxuICAgICAgICAgICAgLy8gY2FuIHByb3ZpZGUgdGV4dHVhbCBjb250ZW50IGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBjb250ZW50IG1vZGVsLlxuICAgICAgICAgICAgLy8gICBGb3IgOmJlZm9yZSBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgcHJlcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IFxuICAgICAgICAgICAgLy8gICAgIGEgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgRm9yIDphZnRlciBwc2V1ZG8gZWxlbWVudHMsIFVzZXIgYWdlbnRzIE1VU1QgYXBwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBcbiAgICAgICAgICAgIC8vICAgICBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG51bGw7XG4gICAgICAgICAgICBiZWZvcmUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYmVmb3JlXCIpLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpaWkuIEZvciBlYWNoIGNoaWxkIG5vZGUgb2YgdGhlIGN1cnJlbnQgbm9kZTpcbiAgICAgICAgICAgIC8vICAgU2V0IHRoZSBjdXJyZW50IG5vZGUgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAvLyAgIENvbXB1dGUgdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWdpbm5pbmcgd2l0aCBzdGVwIDIuIFNldCB0aGUgcmVzdWx0IFxuICAgICAgICAgICAgLy8gICAgIHRvIHRoYXQgdGV4dCBhbHRlcm5hdGl2ZS5cbiAgICAgICAgICAgIC8vICAgQXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNMT1RcIikge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gYXNzaWduZWROb2RlLCBjaGVjayBpdHMgb3duIHRleHQgXG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSB8fCAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyVGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJUZXh0ICYmIGlubmVyVGV4dCAhPT0gbnVsbCAmJiBpbm5lclRleHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSAgXCIgXCIgKyBpbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgYXNzaWduZWQgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzbG90Q2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3YWxrQ2hpbGQgPSBlbGVtLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgd2Fsa0NoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBcIiBcIiArIG5leHRDaGlsZENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZCA9IHdhbGtDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhZnRlciA9IG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImFmdGVyXCIpLmNvbnRlbnQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gYWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZml2LiBSZXR1cm4gdGhlIGFjY3VtdWxhdGVkIHRleHQuXG4gICAgICAgICAgICBhY2N1bXVsYXRlZCA9IGFjY3VtdWxhdGVkLnJlcGxhY2UoL1xccysvZyxcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGVkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmkuIE90aGVyd2lzZSwgaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgYSBUb29sdGlwIGF0dHJpYnV0ZSwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGUudGV4dENvbnRlbnQgfHwgdGl0bGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4vKiAgICAgICAgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkrXCInXVwiKS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgaWQpLnRleHRDb250ZW50ICsgXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYW1lID0gbmFtZS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSovXG5cbiAgICBwdWJsaWMgc3RhdGljIG5vZGVUb1JvbGUobm9kZSA6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBcInRleHRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIHJldHVybiAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgfVxuICAgIC8qKlxuICAgIHB1YmxpYyBzdGF0aWMgZWxlbVRvSW1wbGljaXRSb2xlKGVsZW0gOiBFbGVtZW50KSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIShub2RlTmFtZSBpbiBBUklBTWFwcGVyLmVsZW1Ub1JvbGVNYXApKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvUm9sZU1hcFtub2RlTmFtZV07XG4gICAgICAgIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvbGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGUoZWxlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIGhhc1BhcmVudFJvbGUoZWxlbWVudCwgcm9sZSkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAvLyBJZiBsaW5rIGlzIGluIGEgbWVudSwgaXQncyBhIG1lbnVpdGVtXG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGhhc0xpc3QgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsaXN0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBpZFJlZiA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRSZWYgJiYgaWRSZWYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRleHRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNMaXN0KGVsZW1lbnQpID8gXCJjb21ib2JveFwiIDogXCJ0ZXh0Ym94XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImltYWdlXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCI6IFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwicmFkaW9cIjogXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJlbWFpbFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInNlYXJjaFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0xpc3QoZWxlbWVudCkgPyBcImNvbWJvYm94XCIgOiBcInNlYXJjaGJveFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGVsXCI6IHRleHRTdWdnZXN0aW9ucyxcbiAgICAgICAgICAgIFwidGV4dFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInVybFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcIm51bWJlclwiOiBcInNwaW5idXR0b25cIixcbiAgICAgICAgICAgIFwicmFuZ2VcIjogXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwicmVzZXRcIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwic3VibWl0XCI6IFwiYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnB1dFRvUm9sZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZVR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShlVHlwZSBpbiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLmlucHV0VG9Sb2xlTWFwW2VUeXBlXTtcbiAgICAgICAgaWYgKHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9sZShlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgXG4gICAgcHJpdmF0ZSBzdGF0aWMgZWxlbVRvUm9sZU1hcCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb290cyA9IHtcbiAgICAgICAgICAgIFwiYmxvY2txdW90ZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJib2R5XCI6IHRydWUsXG4gICAgICAgICAgICBcImRldGFpbHNcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZGlhbG9nXCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IHRydWUsXG4gICAgICAgICAgICBcImZpZ3VyZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJ0ZFwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzZWN0aW9uaW5nQ29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJhc2lkZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJuYXZcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwic2VjdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtYWluXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNlY3Rpb25pbmdSb2xlID0ge1xuICAgICAgICAgICAgXCJhcnRpY2xlXCI6IHRydWUsXG4gICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibmF2aWdhdGlvblwiOiB0cnVlLFxuICAgICAgICAgICAgXCJyZWdpb25cIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWFpblwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBpbnB1dFRvUm9sZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmlucHV0VG9Sb2xlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcImFcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0IGRvZXNuJ3QgcmVwcmVzZW50IGEgaHlwZXJsaW5rLCAnZ2VuZXJpYycgcm9sZVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJsaW5rXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IHJlcHJlc2VudCBhIGh5cGVybGluaywgbm8gY29ycmVzcG9uZGluZyByb2xlXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImxpbmtcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImFydGljbGVcIjogXCJhcnRpY2xlXCIsXG4gICAgICAgICAgICBcImFzaWRlXCI6IFwiY29tcGxlbWVudGFyeVwiLFxuICAgICAgICAgICAgXCJidXR0b25cIjogXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiZGF0YWxpc3RcIjogXCJsaXN0Ym94XCIsXG4gICAgICAgICAgICBcImRkXCI6IFwiZGVmaW5pdGlvblwiLFxuICAgICAgICAgICAgXCJkZXRhaWxzXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZGZuXCI6IFwidGVybVwiLFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogXCJkaWFsb2dcIixcbiAgICAgICAgICAgIFwiZHRcIjogXCJ0ZXJtXCIsXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZmlndXJlXCI6IFwiZmlndXJlXCIsXG4gICAgICAgICAgICBcImZvb3RlclwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIC8vIElmIG5lYXJlc3Qgc2VjdGlvbmluZ1Jvb3Qgb3Igc2VjdGlvbmluZ0NvbnRlbnQgaXMgYm9keVxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gKHBhcmVudC5ub2RlVHlwZSA9PT0gMSAmJiAocGFyZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKSB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbmluZ1Jvb3RzW25vZGVOYW1lXSB8fCBzZWN0aW9uaW5nQ29udGVudFtub2RlTmFtZV0gfHwgc2VjdGlvbmluZ1JvbGVbcm9sZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobm9kZU5hbWUgPT09IFwiYm9keVwiKSA/IFwiY29udGVudGluZm9cIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApID8gXCJmb3JtXCIgOiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRPRE8gXCJmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRcIlxuICAgICAgICAgICAgXCJoMVwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDJcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImgzXCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoNFwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDVcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImg2XCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoZWFkZXJcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWFyZXN0IHNlY3Rpb25pbmdSb290IG9yIHNlY3Rpb25pbmdDb250ZW50IGlzIGJvZHlcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSAocGFyZW50Lm5vZGVUeXBlID09PSAxICYmIChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIikpIHx8IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25pbmdSb290c1tub2RlTmFtZV0gfHwgc2VjdGlvbmluZ0NvbnRlbnRbbm9kZU5hbWVdIHx8IHNlY3Rpb25pbmdSb2xlW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSBcImJvZHlcIikgPyBcImJhbm5lclwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhyXCI6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICBcImh0bWxcIjogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJpbWdcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFsdFwiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiaW1nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5wdXRcIjogaW5wdXRUb1JvbGUsXG4gICAgICAgICAgICBcImtleWdlblwiOiBcImxpc3Rib3hcIiwgLy8gZGVwcmVjYXRlZCwgYnV0IGtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdFxuICAgICAgICAgICAgXCJsaVwiOiBcImxpc3RpdGVtXCIsXG4gICAgICAgICAgICBcIm1haW5cIjogXCJtYWluXCIsXG4gICAgICAgICAgICBcIm1hdGhcIjogXCJtYXRoXCIsXG4gICAgICAgICAgICBcIm1lbnVcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm5hdlwiOiBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIFwib2xcIjogXCJsaXN0XCIsXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICBcIm91dHB1dFwiOiBcInN0YXR1c1wiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc1wiOiBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcInNlY3Rpb25cIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUgJiYgbmFtZS50cmltKCkubGVuZ3RoID4gMCkgPyBcInJlZ2lvblwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIikgfHwgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJzaXplXCIpICYmIHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSkgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29tYm9ib3hcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdW1tYXJ5XCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN2Z1wiOiBcImdyYXBoaWNzLWRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInRhYmxlXCI6IFwidGFibGVcIixcbiAgICAgICAgICAgIFwidGJvZHlcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRhYmxlXCIgfHwgcm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJyb3dncm91cFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJ0ZFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGFibGVcIikgcmV0dXJuIFwiY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJncmlkXCIgfHwgcm9sZSA9PT0gXCJ0cmVlZ3JpZFwiKSByZXR1cm4gXCJncmlkY2VsbFwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRoXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgIT09IFwidGFibGVcIiAmJiByb2xlICE9PSBcImdyaWRcIiAmJiByb2xlICE9PSBcInRyZWVncmlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEVhc2llc3QgYW5zd2VyIGlzIGlmIHNjb3BlIGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjb3BlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcInJvd1wiIHx8IHNjb3BlID09PSAncm93Z3JvdXAnKSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSA9PT0gXCJjb2xcIiB8fCBzY29wZSA9PT0gJ2NvbGdyb3VwJykgcmV0dXJuIFwiY29sdW1uaGVhZGVyXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpYmxpbmdzID0gZWxlbWVudCA9PiBbLi4uZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIobm9kZT0+bm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUgIT0gXCJUSFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmdzID09PSBudWxsIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbHVtbmhlYWRlclwiOyBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gXCJyb3doZWFkZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGZvb3RcIjogXCJyb3dncm91cFwiLFxuICAgICAgICAgICAgXCJ0aGVhZFwiOiBcInJvd2dyb3VwXCIsXG4gICAgICAgICAgICBcInRyXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0YWJsZVwiIHx8IHJvbGUgPT09IFwiZ3JpZFwiIHx8IHJvbGUgPT09IFwidHJlZWdyaWRcIikgcmV0dXJuIFwicm93XCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidWxcIjogXCJsaXN0XCJcbiAgICAgICAgfVxuICAgIH0pKClcbiAgICovXG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuXG4vKipcbiAqIFdhbGtzIGluIGFuIEFSSUEgb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vZG9tL0RPTVdhbGtlclxuICovXG5leHBvcnQgY2xhc3MgQVJJQVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSkge1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubm9kZS5ub2RlTmFtZSwgdGhpcy5iRW5kVGFnP1wiRU5EXCI6XCJTVEFSVFwiLCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBhbnkpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggPSBuZXh0U2xvdEluZGV4OyAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBBbmNlc3RvclV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInByZXNlbnRhdGlvblwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGcmFtZShjb250ZXh0SGllcmFyY2h5OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRleHRIaWVyYXJjaHkgJiYgY29udGV4dEhpZXJhcmNoeS5kb20pIHtcbiAgICAgICAgICAgIC8vIFNraXAgY3VycmVudCBub2RlIGJlY2F1c2Ugd2Ugd2FudCBhbmNlc3RyeVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PWNvbnRleHRIaWVyYXJjaHkuZG9tLmxlbmd0aC0yOyBpZHggPj0gMDsgLS1pZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gKGNvbnRleHRIaWVyYXJjaHkuZG9tW2lkeF0ubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEZyYWdtZW50VXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRPd25lckZyYWdtZW50KG5vZGU6IE5vZGUpIDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHtcbiAgICAgICAgbGV0IG4gOiBOb2RlID0gbm9kZTtcbiAgICAgICAgd2hpbGUobi5wYXJlbnROb2RlICYmIChuID0gbi5wYXJlbnROb2RlKSl7XG4gICAgICAgICAgICBpZiAobi5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRCeUlkKG5vZGU6IE5vZGUsIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3duZXJGcmFnbWVudChub2RlKS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIGVsZW1OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImRvbVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IGVsZW1OYW1lKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCByb2xlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBoaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSByb2xlKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID4gMCAmJiBtYXRjaGVzWzBdLm5vZGUgfHwgbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIxLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBGcm9tIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeS9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnlcbmNvbnN0IHZhbGlkUHJpbWFyeUxhbmdzID0gWyAvLyBcInFhYS4ucXR6XCIsXG5bIFwiYWFcIixcImFiXCIsXCJhZVwiLFwiYWZcIixcImFrXCIsXCJhbVwiLFwiYW5cIixcImFyXCIsXCJhc1wiLFwiYXZcIixcImF5XCIsXCJhelwiLFwiYWFhXCIsXCJhYWJcIixcImFhY1wiLFwiYWFkXCIsXCJhYWVcIixcImFhZlwiLFwiYWFnXCIsXCJhYWhcIixcImFhaVwiLFwiYWFrXCIsXCJhYWxcIixcImFhbVwiLFwiYWFuXCIsXCJhYW9cIixcImFhcFwiLFwiYWFxXCIsXCJhYXNcIixcImFhdFwiLFwiYWF1XCIsXCJhYXZcIixcImFhd1wiLFwiYWF4XCIsXCJhYXpcIixcImFiYVwiLFwiYWJiXCIsXCJhYmNcIixcImFiZFwiLFwiYWJlXCIsXCJhYmZcIixcImFiZ1wiLFwiYWJoXCIsXCJhYmlcIixcImFialwiLFwiYWJsXCIsXCJhYm1cIixcImFiblwiLFwiYWJvXCIsXCJhYnBcIixcImFicVwiLFwiYWJyXCIsXCJhYnNcIixcImFidFwiLFwiYWJ1XCIsXCJhYnZcIixcImFid1wiLFwiYWJ4XCIsXCJhYnlcIixcImFielwiLFwiYWNhXCIsXCJhY2JcIixcImFjZFwiLFwiYWNlXCIsXCJhY2ZcIixcImFjaFwiLFwiYWNpXCIsXCJhY2tcIixcImFjbFwiLFwiYWNtXCIsXCJhY25cIixcImFjcFwiLFwiYWNxXCIsXCJhY3JcIixcImFjc1wiLFwiYWN0XCIsXCJhY3VcIixcImFjdlwiLFwiYWN3XCIsXCJhY3hcIixcImFjeVwiLFwiYWN6XCIsXCJhZGFcIixcImFkYlwiLFwiYWRkXCIsXCJhZGVcIixcImFkZlwiLFwiYWRnXCIsXCJhZGhcIixcImFkaVwiLFwiYWRqXCIsXCJhZGxcIixcImFkblwiLFwiYWRvXCIsXCJhZHBcIixcImFkcVwiLFwiYWRyXCIsXCJhZHNcIixcImFkdFwiLFwiYWR1XCIsXCJhZHdcIixcImFkeFwiLFwiYWR5XCIsXCJhZHpcIixcImFlYVwiLFwiYWViXCIsXCJhZWNcIixcImFlZFwiLFwiYWVlXCIsXCJhZWtcIixcImFlbFwiLFwiYWVtXCIsXCJhZW5cIixcImFlcVwiLFwiYWVyXCIsXCJhZXNcIixcImFldVwiLFwiYWV3XCIsXCJhZXlcIixcImFlelwiLFwiYWZhXCIsXCJhZmJcIixcImFmZFwiLFwiYWZlXCIsXCJhZmdcIixcImFmaFwiLFwiYWZpXCIsXCJhZmtcIixcImFmblwiLFwiYWZvXCIsXCJhZnBcIixcImFmc1wiLFwiYWZ0XCIsXCJhZnVcIixcImFmelwiLFwiYWdhXCIsXCJhZ2JcIixcImFnY1wiLFwiYWdkXCIsXCJhZ2VcIixcImFnZlwiLFwiYWdnXCIsXCJhZ2hcIixcImFnaVwiLFwiYWdqXCIsXCJhZ2tcIixcImFnbFwiLFwiYWdtXCIsXCJhZ25cIixcImFnb1wiLFwiYWdwXCIsXCJhZ3FcIixcImFnclwiLFwiYWdzXCIsXCJhZ3RcIixcImFndVwiLFwiYWd2XCIsXCJhZ3dcIixcImFneFwiLFwiYWd5XCIsXCJhZ3pcIixcImFoYVwiLFwiYWhiXCIsXCJhaGdcIixcImFoaFwiLFwiYWhpXCIsXCJhaGtcIixcImFobFwiLFwiYWhtXCIsXCJhaG5cIixcImFob1wiLFwiYWhwXCIsXCJhaHJcIixcImFoc1wiLFwiYWh0XCIsXCJhaWFcIixcImFpYlwiLFwiYWljXCIsXCJhaWRcIixcImFpZVwiLFwiYWlmXCIsXCJhaWdcIixcImFpaFwiLFwiYWlpXCIsXCJhaWpcIixcImFpa1wiLFwiYWlsXCIsXCJhaW1cIixcImFpblwiLFwiYWlvXCIsXCJhaXBcIixcImFpcVwiLFwiYWlyXCIsXCJhaXNcIixcImFpdFwiLFwiYWl3XCIsXCJhaXhcIixcImFpeVwiLFwiYWphXCIsXCJhamdcIixcImFqaVwiLFwiYWpuXCIsXCJhanBcIixcImFqdFwiLFwiYWp1XCIsXCJhandcIixcImFqelwiLFwiYWtiXCIsXCJha2NcIixcImFrZFwiLFwiYWtlXCIsXCJha2ZcIixcImFrZ1wiLFwiYWtoXCIsXCJha2lcIixcImFralwiLFwiYWtrXCIsXCJha2xcIixcImFrbVwiLFwiYWtvXCIsXCJha3BcIixcImFrcVwiLFwiYWtyXCIsXCJha3NcIixcImFrdFwiLFwiYWt1XCIsXCJha3ZcIixcImFrd1wiLFwiYWt4XCIsXCJha3lcIixcImFrelwiLFwiYWxhXCIsXCJhbGNcIixcImFsZFwiLFwiYWxlXCIsXCJhbGZcIixcImFsZ1wiLFwiYWxoXCIsXCJhbGlcIixcImFsalwiLFwiYWxrXCIsXCJhbGxcIixcImFsbVwiLFwiYWxuXCIsXCJhbG9cIixcImFscFwiLFwiYWxxXCIsXCJhbHJcIixcImFsc1wiLFwiYWx0XCIsXCJhbHVcIixcImFsdlwiLFwiYWx3XCIsXCJhbHhcIixcImFseVwiLFwiYWx6XCIsXCJhbWFcIixcImFtYlwiLFwiYW1jXCIsXCJhbWVcIixcImFtZlwiLFwiYW1nXCIsXCJhbWlcIixcImFtalwiLFwiYW1rXCIsXCJhbWxcIixcImFtbVwiLFwiYW1uXCIsXCJhbW9cIixcImFtcFwiLFwiYW1xXCIsXCJhbXJcIixcImFtc1wiLFwiYW10XCIsXCJhbXVcIixcImFtdlwiLFwiYW13XCIsXCJhbXhcIixcImFteVwiLFwiYW16XCIsXCJhbmFcIixcImFuYlwiLFwiYW5jXCIsXCJhbmRcIixcImFuZVwiLFwiYW5mXCIsXCJhbmdcIixcImFuaFwiLFwiYW5pXCIsXCJhbmpcIixcImFua1wiLFwiYW5sXCIsXCJhbm1cIixcImFublwiLFwiYW5vXCIsXCJhbnBcIixcImFucVwiLFwiYW5yXCIsXCJhbnNcIixcImFudFwiLFwiYW51XCIsXCJhbnZcIixcImFud1wiLFwiYW54XCIsXCJhbnlcIixcImFuelwiLFwiYW9hXCIsXCJhb2JcIixcImFvY1wiLFwiYW9kXCIsXCJhb2VcIixcImFvZlwiLFwiYW9nXCIsXCJhb2hcIixcImFvaVwiLFwiYW9qXCIsXCJhb2tcIixcImFvbFwiLFwiYW9tXCIsXCJhb25cIixcImFvclwiLFwiYW9zXCIsXCJhb3RcIixcImFvdVwiLFwiYW94XCIsXCJhb3pcIixcImFwYVwiLFwiYXBiXCIsXCJhcGNcIixcImFwZFwiLFwiYXBlXCIsXCJhcGZcIixcImFwZ1wiLFwiYXBoXCIsXCJhcGlcIixcImFwalwiLFwiYXBrXCIsXCJhcGxcIixcImFwbVwiLFwiYXBuXCIsXCJhcG9cIixcImFwcFwiLFwiYXBxXCIsXCJhcHJcIixcImFwc1wiLFwiYXB0XCIsXCJhcHVcIixcImFwdlwiLFwiYXB3XCIsXCJhcHhcIixcImFweVwiLFwiYXB6XCIsXCJhcWFcIixcImFxY1wiLFwiYXFkXCIsXCJhcWdcIixcImFxa1wiLFwiYXFsXCIsXCJhcW1cIixcImFxblwiLFwiYXFwXCIsXCJhcXJcIixcImFxdFwiLFwiYXF6XCIsXCJhcmJcIixcImFyY1wiLFwiYXJkXCIsXCJhcmVcIixcImFyaFwiLFwiYXJpXCIsXCJhcmpcIixcImFya1wiLFwiYXJsXCIsXCJhcm5cIixcImFyb1wiLFwiYXJwXCIsXCJhcnFcIixcImFyclwiLFwiYXJzXCIsXCJhcnRcIixcImFydVwiLFwiYXJ2XCIsXCJhcndcIixcImFyeFwiLFwiYXJ5XCIsXCJhcnpcIixcImFzYVwiLFwiYXNiXCIsXCJhc2NcIixcImFzZFwiLFwiYXNlXCIsXCJhc2ZcIixcImFzZ1wiLFwiYXNoXCIsXCJhc2lcIixcImFzalwiLFwiYXNrXCIsXCJhc2xcIixcImFzblwiLFwiYXNvXCIsXCJhc3BcIixcImFzcVwiLFwiYXNyXCIsXCJhc3NcIixcImFzdFwiLFwiYXN1XCIsXCJhc3ZcIixcImFzd1wiLFwiYXN4XCIsXCJhc3lcIixcImFzelwiLFwiYXRhXCIsXCJhdGJcIixcImF0Y1wiLFwiYXRkXCIsXCJhdGVcIixcImF0Z1wiLFwiYXRoXCIsXCJhdGlcIixcImF0alwiLFwiYXRrXCIsXCJhdGxcIixcImF0bVwiLFwiYXRuXCIsXCJhdG9cIixcImF0cFwiLFwiYXRxXCIsXCJhdHJcIixcImF0c1wiLFwiYXR0XCIsXCJhdHVcIixcImF0dlwiLFwiYXR3XCIsXCJhdHhcIixcImF0eVwiLFwiYXR6XCIsXCJhdWFcIixcImF1YlwiLFwiYXVjXCIsXCJhdWRcIixcImF1ZVwiLFwiYXVmXCIsXCJhdWdcIixcImF1aFwiLFwiYXVpXCIsXCJhdWpcIixcImF1a1wiLFwiYXVsXCIsXCJhdW1cIixcImF1blwiLFwiYXVvXCIsXCJhdXBcIixcImF1cVwiLFwiYXVyXCIsXCJhdXNcIixcImF1dFwiLFwiYXV1XCIsXCJhdXdcIixcImF1eFwiLFwiYXV5XCIsXCJhdXpcIixcImF2YlwiLFwiYXZkXCIsXCJhdmlcIixcImF2a1wiLFwiYXZsXCIsXCJhdm1cIixcImF2blwiLFwiYXZvXCIsXCJhdnNcIixcImF2dFwiLFwiYXZ1XCIsXCJhdnZcIixcImF3YVwiLFwiYXdiXCIsXCJhd2NcIixcImF3ZFwiLFwiYXdlXCIsXCJhd2dcIixcImF3aFwiLFwiYXdpXCIsXCJhd2tcIixcImF3bVwiLFwiYXduXCIsXCJhd29cIixcImF3clwiLFwiYXdzXCIsXCJhd3RcIixcImF3dVwiLFwiYXd2XCIsXCJhd3dcIixcImF3eFwiLFwiYXd5XCIsXCJheGJcIixcImF4ZVwiLFwiYXhnXCIsXCJheGtcIixcImF4bFwiLFwiYXhtXCIsXCJheHhcIixcImF5YVwiLFwiYXliXCIsXCJheWNcIixcImF5ZFwiLFwiYXllXCIsXCJheWdcIixcImF5aFwiLFwiYXlpXCIsXCJheWtcIixcImF5bFwiLFwiYXluXCIsXCJheW9cIixcImF5cFwiLFwiYXlxXCIsXCJheXJcIixcImF5c1wiLFwiYXl0XCIsXCJheXVcIixcImF5eFwiLFwiYXl5XCIsXCJheXpcIixcImF6YVwiLFwiYXpiXCIsXCJhemNcIixcImF6ZFwiLFwiYXpnXCIsXCJhempcIixcImF6bVwiLFwiYXpuXCIsXCJhem9cIixcImF6dFwiLFwiYXp6XCJdXG4sWyBcImJhXCIsXCJiZVwiLFwiYmdcIixcImJoXCIsXCJiaVwiLFwiYm1cIixcImJuXCIsXCJib1wiLFwiYnJcIixcImJzXCIsXCJiYWFcIixcImJhYlwiLFwiYmFjXCIsXCJiYWRcIixcImJhZVwiLFwiYmFmXCIsXCJiYWdcIixcImJhaFwiLFwiYmFpXCIsXCJiYWpcIixcImJhbFwiLFwiYmFuXCIsXCJiYW9cIixcImJhcFwiLFwiYmFyXCIsXCJiYXNcIixcImJhdFwiLFwiYmF1XCIsXCJiYXZcIixcImJhd1wiLFwiYmF4XCIsXCJiYXlcIixcImJhelwiLFwiYmJhXCIsXCJiYmJcIixcImJiY1wiLFwiYmJkXCIsXCJiYmVcIixcImJiZlwiLFwiYmJnXCIsXCJiYmhcIixcImJiaVwiLFwiYmJqXCIsXCJiYmtcIixcImJibFwiLFwiYmJtXCIsXCJiYm5cIixcImJib1wiLFwiYmJwXCIsXCJiYnFcIixcImJiclwiLFwiYmJzXCIsXCJiYnRcIixcImJidVwiLFwiYmJ2XCIsXCJiYndcIixcImJieFwiLFwiYmJ5XCIsXCJiYnpcIixcImJjYVwiLFwiYmNiXCIsXCJiY2NcIixcImJjZFwiLFwiYmNlXCIsXCJiY2ZcIixcImJjZ1wiLFwiYmNoXCIsXCJiY2lcIixcImJjalwiLFwiYmNrXCIsXCJiY2xcIixcImJjbVwiLFwiYmNuXCIsXCJiY29cIixcImJjcFwiLFwiYmNxXCIsXCJiY3JcIixcImJjc1wiLFwiYmN0XCIsXCJiY3VcIixcImJjdlwiLFwiYmN3XCIsXCJiY3lcIixcImJjelwiLFwiYmRhXCIsXCJiZGJcIixcImJkY1wiLFwiYmRkXCIsXCJiZGVcIixcImJkZlwiLFwiYmRnXCIsXCJiZGhcIixcImJkaVwiLFwiYmRqXCIsXCJiZGtcIixcImJkbFwiLFwiYmRtXCIsXCJiZG5cIixcImJkb1wiLFwiYmRwXCIsXCJiZHFcIixcImJkclwiLFwiYmRzXCIsXCJiZHRcIixcImJkdVwiLFwiYmR2XCIsXCJiZHdcIixcImJkeFwiLFwiYmR5XCIsXCJiZHpcIixcImJlYVwiLFwiYmViXCIsXCJiZWNcIixcImJlZFwiLFwiYmVlXCIsXCJiZWZcIixcImJlZ1wiLFwiYmVoXCIsXCJiZWlcIixcImJlalwiLFwiYmVrXCIsXCJiZW1cIixcImJlb1wiLFwiYmVwXCIsXCJiZXFcIixcImJlclwiLFwiYmVzXCIsXCJiZXRcIixcImJldVwiLFwiYmV2XCIsXCJiZXdcIixcImJleFwiLFwiYmV5XCIsXCJiZXpcIixcImJmYVwiLFwiYmZiXCIsXCJiZmNcIixcImJmZFwiLFwiYmZlXCIsXCJiZmZcIixcImJmZ1wiLFwiYmZoXCIsXCJiZmlcIixcImJmalwiLFwiYmZrXCIsXCJiZmxcIixcImJmbVwiLFwiYmZuXCIsXCJiZm9cIixcImJmcFwiLFwiYmZxXCIsXCJiZnJcIixcImJmc1wiLFwiYmZ0XCIsXCJiZnVcIixcImJmd1wiLFwiYmZ4XCIsXCJiZnlcIixcImJmelwiLFwiYmdhXCIsXCJiZ2JcIixcImJnY1wiLFwiYmdkXCIsXCJiZ2VcIixcImJnZlwiLFwiYmdnXCIsXCJiZ2lcIixcImJnalwiLFwiYmdrXCIsXCJiZ2xcIixcImJnbVwiLFwiYmduXCIsXCJiZ29cIixcImJncFwiLFwiYmdxXCIsXCJiZ3JcIixcImJnc1wiLFwiYmd0XCIsXCJiZ3VcIixcImJndlwiLFwiYmd3XCIsXCJiZ3hcIixcImJneVwiLFwiYmd6XCIsXCJiaGFcIixcImJoYlwiLFwiYmhjXCIsXCJiaGRcIixcImJoZVwiLFwiYmhmXCIsXCJiaGdcIixcImJoaFwiLFwiYmhpXCIsXCJiaGpcIixcImJoa1wiLFwiYmhsXCIsXCJiaG1cIixcImJoblwiLFwiYmhvXCIsXCJiaHBcIixcImJocVwiLFwiYmhyXCIsXCJiaHNcIixcImJodFwiLFwiYmh1XCIsXCJiaHZcIixcImJod1wiLFwiYmh4XCIsXCJiaHlcIixcImJoelwiLFwiYmlhXCIsXCJiaWJcIixcImJpY1wiLFwiYmlkXCIsXCJiaWVcIixcImJpZlwiLFwiYmlnXCIsXCJiaWpcIixcImJpa1wiLFwiYmlsXCIsXCJiaW1cIixcImJpblwiLFwiYmlvXCIsXCJiaXBcIixcImJpcVwiLFwiYmlyXCIsXCJiaXRcIixcImJpdVwiLFwiYml2XCIsXCJiaXdcIixcImJpeFwiLFwiYml5XCIsXCJiaXpcIixcImJqYVwiLFwiYmpiXCIsXCJiamNcIixcImJqZFwiLFwiYmplXCIsXCJiamZcIixcImJqZ1wiLFwiYmpoXCIsXCJiamlcIixcImJqalwiLFwiYmprXCIsXCJiamxcIixcImJqbVwiLFwiYmpuXCIsXCJiam9cIixcImJqcFwiLFwiYmpxXCIsXCJianJcIixcImJqc1wiLFwiYmp0XCIsXCJianVcIixcImJqdlwiLFwiYmp3XCIsXCJianhcIixcImJqeVwiLFwiYmp6XCIsXCJia2FcIixcImJrYlwiLFwiYmtjXCIsXCJia2RcIixcImJrZlwiLFwiYmtnXCIsXCJia2hcIixcImJraVwiLFwiYmtqXCIsXCJia2tcIixcImJrbFwiLFwiYmttXCIsXCJia25cIixcImJrb1wiLFwiYmtwXCIsXCJia3FcIixcImJrclwiLFwiYmtzXCIsXCJia3RcIixcImJrdVwiLFwiYmt2XCIsXCJia3dcIixcImJreFwiLFwiYmt5XCIsXCJia3pcIixcImJsYVwiLFwiYmxiXCIsXCJibGNcIixcImJsZFwiLFwiYmxlXCIsXCJibGZcIixcImJsZ1wiLFwiYmxoXCIsXCJibGlcIixcImJsalwiLFwiYmxrXCIsXCJibGxcIixcImJsbVwiLFwiYmxuXCIsXCJibG9cIixcImJscFwiLFwiYmxxXCIsXCJibHJcIixcImJsc1wiLFwiYmx0XCIsXCJibHZcIixcImJsd1wiLFwiYmx4XCIsXCJibHlcIixcImJselwiLFwiYm1hXCIsXCJibWJcIixcImJtY1wiLFwiYm1kXCIsXCJibWVcIixcImJtZlwiLFwiYm1nXCIsXCJibWhcIixcImJtaVwiLFwiYm1qXCIsXCJibWtcIixcImJtbFwiLFwiYm1tXCIsXCJibW5cIixcImJtb1wiLFwiYm1wXCIsXCJibXFcIixcImJtclwiLFwiYm1zXCIsXCJibXRcIixcImJtdVwiLFwiYm12XCIsXCJibXdcIixcImJteFwiLFwiYm15XCIsXCJibXpcIixcImJuYVwiLFwiYm5iXCIsXCJibmNcIixcImJuZFwiLFwiYm5lXCIsXCJibmZcIixcImJuZ1wiLFwiYm5pXCIsXCJibmpcIixcImJua1wiLFwiYm5sXCIsXCJibm1cIixcImJublwiLFwiYm5vXCIsXCJibnBcIixcImJucVwiLFwiYm5yXCIsXCJibnNcIixcImJudFwiLFwiYm51XCIsXCJibnZcIixcImJud1wiLFwiYm54XCIsXCJibnlcIixcImJuelwiLFwiYm9hXCIsXCJib2JcIixcImJvZVwiLFwiYm9mXCIsXCJib2dcIixcImJvaFwiLFwiYm9pXCIsXCJib2pcIixcImJva1wiLFwiYm9sXCIsXCJib21cIixcImJvblwiLFwiYm9vXCIsXCJib3BcIixcImJvcVwiLFwiYm9yXCIsXCJib3RcIixcImJvdVwiLFwiYm92XCIsXCJib3dcIixcImJveFwiLFwiYm95XCIsXCJib3pcIixcImJwYVwiLFwiYnBiXCIsXCJicGRcIixcImJwZVwiLFwiYnBnXCIsXCJicGhcIixcImJwaVwiLFwiYnBqXCIsXCJicGtcIixcImJwbFwiLFwiYnBtXCIsXCJicG5cIixcImJwb1wiLFwiYnBwXCIsXCJicHFcIixcImJwclwiLFwiYnBzXCIsXCJicHRcIixcImJwdVwiLFwiYnB2XCIsXCJicHdcIixcImJweFwiLFwiYnB5XCIsXCJicHpcIixcImJxYVwiLFwiYnFiXCIsXCJicWNcIixcImJxZFwiLFwiYnFmXCIsXCJicWdcIixcImJxaFwiLFwiYnFpXCIsXCJicWpcIixcImJxa1wiLFwiYnFsXCIsXCJicW1cIixcImJxblwiLFwiYnFvXCIsXCJicXBcIixcImJxcVwiLFwiYnFyXCIsXCJicXNcIixcImJxdFwiLFwiYnF1XCIsXCJicXZcIixcImJxd1wiLFwiYnF4XCIsXCJicXlcIixcImJxelwiLFwiYnJhXCIsXCJicmJcIixcImJyY1wiLFwiYnJkXCIsXCJicmZcIixcImJyZ1wiLFwiYnJoXCIsXCJicmlcIixcImJyalwiLFwiYnJrXCIsXCJicmxcIixcImJybVwiLFwiYnJuXCIsXCJicm9cIixcImJycFwiLFwiYnJxXCIsXCJicnJcIixcImJyc1wiLFwiYnJ0XCIsXCJicnVcIixcImJydlwiLFwiYnJ3XCIsXCJicnhcIixcImJyeVwiLFwiYnJ6XCIsXCJic2FcIixcImJzYlwiLFwiYnNjXCIsXCJic2VcIixcImJzZlwiLFwiYnNnXCIsXCJic2hcIixcImJzaVwiLFwiYnNqXCIsXCJic2tcIixcImJzbFwiLFwiYnNtXCIsXCJic25cIixcImJzb1wiLFwiYnNwXCIsXCJic3FcIixcImJzclwiLFwiYnNzXCIsXCJic3RcIixcImJzdVwiLFwiYnN2XCIsXCJic3dcIixcImJzeFwiLFwiYnN5XCIsXCJidGFcIixcImJ0YlwiLFwiYnRjXCIsXCJidGRcIixcImJ0ZVwiLFwiYnRmXCIsXCJidGdcIixcImJ0aFwiLFwiYnRpXCIsXCJidGpcIixcImJ0a1wiLFwiYnRsXCIsXCJidG1cIixcImJ0blwiLFwiYnRvXCIsXCJidHBcIixcImJ0cVwiLFwiYnRyXCIsXCJidHNcIixcImJ0dFwiLFwiYnR1XCIsXCJidHZcIixcImJ0d1wiLFwiYnR4XCIsXCJidHlcIixcImJ0elwiLFwiYnVhXCIsXCJidWJcIixcImJ1Y1wiLFwiYnVkXCIsXCJidWVcIixcImJ1ZlwiLFwiYnVnXCIsXCJidWhcIixcImJ1aVwiLFwiYnVqXCIsXCJidWtcIixcImJ1bVwiLFwiYnVuXCIsXCJidW9cIixcImJ1cFwiLFwiYnVxXCIsXCJidXNcIixcImJ1dFwiLFwiYnV1XCIsXCJidXZcIixcImJ1d1wiLFwiYnV4XCIsXCJidXlcIixcImJ1elwiLFwiYnZhXCIsXCJidmJcIixcImJ2Y1wiLFwiYnZkXCIsXCJidmVcIixcImJ2ZlwiLFwiYnZnXCIsXCJidmhcIixcImJ2aVwiLFwiYnZqXCIsXCJidmtcIixcImJ2bFwiLFwiYnZtXCIsXCJidm5cIixcImJ2b1wiLFwiYnZwXCIsXCJidnFcIixcImJ2clwiLFwiYnZ0XCIsXCJidnVcIixcImJ2dlwiLFwiYnZ3XCIsXCJidnhcIixcImJ2eVwiLFwiYnZ6XCIsXCJid2FcIixcImJ3YlwiLFwiYndjXCIsXCJid2RcIixcImJ3ZVwiLFwiYndmXCIsXCJid2dcIixcImJ3aFwiLFwiYndpXCIsXCJid2pcIixcImJ3a1wiLFwiYndsXCIsXCJid21cIixcImJ3blwiLFwiYndvXCIsXCJid3BcIixcImJ3cVwiLFwiYndyXCIsXCJid3NcIixcImJ3dFwiLFwiYnd1XCIsXCJid3dcIixcImJ3eFwiLFwiYnd5XCIsXCJid3pcIixcImJ4YVwiLFwiYnhiXCIsXCJieGNcIixcImJ4ZFwiLFwiYnhlXCIsXCJieGZcIixcImJ4Z1wiLFwiYnhoXCIsXCJieGlcIixcImJ4alwiLFwiYnhrXCIsXCJieGxcIixcImJ4bVwiLFwiYnhuXCIsXCJieG9cIixcImJ4cFwiLFwiYnhxXCIsXCJieHJcIixcImJ4c1wiLFwiYnh1XCIsXCJieHZcIixcImJ4d1wiLFwiYnh4XCIsXCJieHpcIixcImJ5YVwiLFwiYnliXCIsXCJieWNcIixcImJ5ZFwiLFwiYnllXCIsXCJieWZcIixcImJ5Z1wiLFwiYnloXCIsXCJieWlcIixcImJ5alwiLFwiYnlrXCIsXCJieWxcIixcImJ5bVwiLFwiYnluXCIsXCJieW9cIixcImJ5cFwiLFwiYnlxXCIsXCJieXJcIixcImJ5c1wiLFwiYnl0XCIsXCJieXZcIixcImJ5d1wiLFwiYnl4XCIsXCJieXlcIixcImJ5elwiLFwiYnphXCIsXCJiemJcIixcImJ6Y1wiLFwiYnpkXCIsXCJiemVcIixcImJ6ZlwiLFwiYnpnXCIsXCJiemhcIixcImJ6aVwiLFwiYnpqXCIsXCJiemtcIixcImJ6bFwiLFwiYnptXCIsXCJiem5cIixcImJ6b1wiLFwiYnpwXCIsXCJienFcIixcImJ6clwiLFwiYnpzXCIsXCJienRcIixcImJ6dVwiLFwiYnp2XCIsXCJiendcIixcImJ6eFwiLFwiYnp5XCIsXCJienpcIl1cbixbIFwiY2FcIixcImNlXCIsXCJjaFwiLFwiY29cIixcImNyXCIsXCJjc1wiLFwiY3VcIixcImN2XCIsXCJjeVwiLFwiY2FhXCIsXCJjYWJcIixcImNhY1wiLFwiY2FkXCIsXCJjYWVcIixcImNhZlwiLFwiY2FnXCIsXCJjYWhcIixcImNhaVwiLFwiY2FqXCIsXCJjYWtcIixcImNhbFwiLFwiY2FtXCIsXCJjYW5cIixcImNhb1wiLFwiY2FwXCIsXCJjYXFcIixcImNhclwiLFwiY2FzXCIsXCJjYXVcIixcImNhdlwiLFwiY2F3XCIsXCJjYXhcIixcImNheVwiLFwiY2F6XCIsXCJjYmFcIixcImNiYlwiLFwiY2JjXCIsXCJjYmRcIixcImNiZVwiLFwiY2JnXCIsXCJjYmhcIixcImNiaVwiLFwiY2JqXCIsXCJjYmtcIixcImNibFwiLFwiY2JuXCIsXCJjYm9cIixcImNicVwiLFwiY2JyXCIsXCJjYnNcIixcImNidFwiLFwiY2J1XCIsXCJjYnZcIixcImNid1wiLFwiY2J5XCIsXCJjY2FcIixcImNjY1wiLFwiY2NkXCIsXCJjY2VcIixcImNjZ1wiLFwiY2NoXCIsXCJjY2pcIixcImNjbFwiLFwiY2NtXCIsXCJjY25cIixcImNjb1wiLFwiY2NwXCIsXCJjY3FcIixcImNjclwiLFwiY2NzXCIsXCJjZGFcIixcImNkY1wiLFwiY2RkXCIsXCJjZGVcIixcImNkZlwiLFwiY2RnXCIsXCJjZGhcIixcImNkaVwiLFwiY2RqXCIsXCJjZG1cIixcImNkblwiLFwiY2RvXCIsXCJjZHJcIixcImNkc1wiLFwiY2R5XCIsXCJjZHpcIixcImNlYVwiLFwiY2ViXCIsXCJjZWdcIixcImNla1wiLFwiY2VsXCIsXCJjZW5cIixcImNldFwiLFwiY2V5XCIsXCJjZmFcIixcImNmZFwiLFwiY2ZnXCIsXCJjZm1cIixcImNnYVwiLFwiY2djXCIsXCJjZ2dcIixcImNna1wiLFwiY2hiXCIsXCJjaGNcIixcImNoZFwiLFwiY2hmXCIsXCJjaGdcIixcImNoaFwiLFwiY2hqXCIsXCJjaGtcIixcImNobFwiLFwiY2htXCIsXCJjaG5cIixcImNob1wiLFwiY2hwXCIsXCJjaHFcIixcImNoclwiLFwiY2h0XCIsXCJjaHdcIixcImNoeFwiLFwiY2h5XCIsXCJjaHpcIixcImNpYVwiLFwiY2liXCIsXCJjaWNcIixcImNpZFwiLFwiY2llXCIsXCJjaWhcIixcImNpa1wiLFwiY2ltXCIsXCJjaW5cIixcImNpcFwiLFwiY2lyXCIsXCJjaXdcIixcImNpeVwiLFwiY2phXCIsXCJjamVcIixcImNqaFwiLFwiY2ppXCIsXCJjamtcIixcImNqbVwiLFwiY2puXCIsXCJjam9cIixcImNqcFwiLFwiY2pyXCIsXCJjanNcIixcImNqdlwiLFwiY2p5XCIsXCJja2FcIixcImNrYlwiLFwiY2toXCIsXCJja2xcIixcImNrbVwiLFwiY2tuXCIsXCJja29cIixcImNrcVwiLFwiY2tyXCIsXCJja3NcIixcImNrdFwiLFwiY2t1XCIsXCJja3ZcIixcImNreFwiLFwiY2t5XCIsXCJja3pcIixcImNsYVwiLFwiY2xjXCIsXCJjbGRcIixcImNsZVwiLFwiY2xoXCIsXCJjbGlcIixcImNsalwiLFwiY2xrXCIsXCJjbGxcIixcImNsbVwiLFwiY2xvXCIsXCJjbHRcIixcImNsdVwiLFwiY2x3XCIsXCJjbHlcIixcImNtYVwiLFwiY21jXCIsXCJjbWVcIixcImNtZ1wiLFwiY21pXCIsXCJjbWtcIixcImNtbFwiLFwiY21tXCIsXCJjbW5cIixcImNtb1wiLFwiY21yXCIsXCJjbXNcIixcImNtdFwiLFwiY25hXCIsXCJjbmJcIixcImNuY1wiLFwiY25nXCIsXCJjbmhcIixcImNuaVwiLFwiY25rXCIsXCJjbmxcIixcImNub1wiLFwiY25wXCIsXCJjbnJcIixcImNuc1wiLFwiY250XCIsXCJjbnVcIixcImNud1wiLFwiY254XCIsXCJjb2FcIixcImNvYlwiLFwiY29jXCIsXCJjb2RcIixcImNvZVwiLFwiY29mXCIsXCJjb2dcIixcImNvaFwiLFwiY29qXCIsXCJjb2tcIixcImNvbFwiLFwiY29tXCIsXCJjb25cIixcImNvb1wiLFwiY29wXCIsXCJjb3FcIixcImNvdFwiLFwiY291XCIsXCJjb3ZcIixcImNvd1wiLFwiY294XCIsXCJjb3lcIixcImNvelwiLFwiY3BhXCIsXCJjcGJcIixcImNwY1wiLFwiY3BlXCIsXCJjcGZcIixcImNwZ1wiLFwiY3BpXCIsXCJjcG5cIixcImNwb1wiLFwiY3BwXCIsXCJjcHNcIixcImNwdVwiLFwiY3B4XCIsXCJjcHlcIixcImNxZFwiLFwiY3F1XCIsXCJjcmFcIixcImNyYlwiLFwiY3JjXCIsXCJjcmRcIixcImNyZlwiLFwiY3JnXCIsXCJjcmhcIixcImNyaVwiLFwiY3JqXCIsXCJjcmtcIixcImNybFwiLFwiY3JtXCIsXCJjcm5cIixcImNyb1wiLFwiY3JwXCIsXCJjcnFcIixcImNyclwiLFwiY3JzXCIsXCJjcnRcIixcImNydlwiLFwiY3J3XCIsXCJjcnhcIixcImNyeVwiLFwiY3J6XCIsXCJjc2FcIixcImNzYlwiLFwiY3NjXCIsXCJjc2RcIixcImNzZVwiLFwiY3NmXCIsXCJjc2dcIixcImNzaFwiLFwiY3NpXCIsXCJjc2pcIixcImNza1wiLFwiY3NsXCIsXCJjc21cIixcImNzblwiLFwiY3NvXCIsXCJjc3BcIixcImNzcVwiLFwiY3NyXCIsXCJjc3NcIixcImNzdFwiLFwiY3N1XCIsXCJjc3ZcIixcImNzd1wiLFwiY3N4XCIsXCJjc3lcIixcImNzelwiLFwiY3RhXCIsXCJjdGNcIixcImN0ZFwiLFwiY3RlXCIsXCJjdGdcIixcImN0aFwiLFwiY3RsXCIsXCJjdG1cIixcImN0blwiLFwiY3RvXCIsXCJjdHBcIixcImN0c1wiLFwiY3R0XCIsXCJjdHVcIixcImN0eVwiLFwiY3R6XCIsXCJjdWFcIixcImN1YlwiLFwiY3VjXCIsXCJjdWdcIixcImN1aFwiLFwiY3VpXCIsXCJjdWpcIixcImN1a1wiLFwiY3VsXCIsXCJjdW1cIixcImN1b1wiLFwiY3VwXCIsXCJjdXFcIixcImN1clwiLFwiY3VzXCIsXCJjdXRcIixcImN1dVwiLFwiY3V2XCIsXCJjdXdcIixcImN1eFwiLFwiY3V5XCIsXCJjdmdcIixcImN2blwiLFwiY3dhXCIsXCJjd2JcIixcImN3ZFwiLFwiY3dlXCIsXCJjd2dcIixcImN3dFwiLFwiY3lhXCIsXCJjeWJcIixcImN5b1wiLFwiY3poXCIsXCJjemtcIixcImN6blwiLFwiY3pvXCIsXCJjenRcIl1cbixbIFwiZGFcIixcImRlXCIsXCJkdlwiLFwiZHpcIixcImRhYVwiLFwiZGFjXCIsXCJkYWRcIixcImRhZVwiLFwiZGFmXCIsXCJkYWdcIixcImRhaFwiLFwiZGFpXCIsXCJkYWpcIixcImRha1wiLFwiZGFsXCIsXCJkYW1cIixcImRhb1wiLFwiZGFwXCIsXCJkYXFcIixcImRhclwiLFwiZGFzXCIsXCJkYXVcIixcImRhdlwiLFwiZGF3XCIsXCJkYXhcIixcImRheVwiLFwiZGF6XCIsXCJkYmFcIixcImRiYlwiLFwiZGJkXCIsXCJkYmVcIixcImRiZlwiLFwiZGJnXCIsXCJkYmlcIixcImRialwiLFwiZGJsXCIsXCJkYm1cIixcImRiblwiLFwiZGJvXCIsXCJkYnBcIixcImRicVwiLFwiZGJyXCIsXCJkYnRcIixcImRidVwiLFwiZGJ2XCIsXCJkYndcIixcImRieVwiLFwiZGNjXCIsXCJkY3JcIixcImRkYVwiLFwiZGRkXCIsXCJkZGVcIixcImRkZ1wiLFwiZGRpXCIsXCJkZGpcIixcImRkblwiLFwiZGRvXCIsXCJkZHJcIixcImRkc1wiLFwiZGR3XCIsXCJkZWNcIixcImRlZFwiLFwiZGVlXCIsXCJkZWZcIixcImRlZ1wiLFwiZGVoXCIsXCJkZWlcIixcImRla1wiLFwiZGVsXCIsXCJkZW1cIixcImRlblwiLFwiZGVwXCIsXCJkZXFcIixcImRlclwiLFwiZGVzXCIsXCJkZXZcIixcImRlelwiLFwiZGdhXCIsXCJkZ2JcIixcImRnY1wiLFwiZGdkXCIsXCJkZ2VcIixcImRnZ1wiLFwiZGdoXCIsXCJkZ2lcIixcImRna1wiLFwiZGdsXCIsXCJkZ25cIixcImRnb1wiLFwiZGdyXCIsXCJkZ3NcIixcImRndFwiLFwiZGd1XCIsXCJkZ3dcIixcImRneFwiLFwiZGd6XCIsXCJkaGFcIixcImRoZFwiLFwiZGhnXCIsXCJkaGlcIixcImRobFwiLFwiZGhtXCIsXCJkaG5cIixcImRob1wiLFwiZGhyXCIsXCJkaHNcIixcImRodVwiLFwiZGh2XCIsXCJkaHdcIixcImRoeFwiLFwiZGlhXCIsXCJkaWJcIixcImRpY1wiLFwiZGlkXCIsXCJkaWZcIixcImRpZ1wiLFwiZGloXCIsXCJkaWlcIixcImRpalwiLFwiZGlrXCIsXCJkaWxcIixcImRpbVwiLFwiZGluXCIsXCJkaW9cIixcImRpcFwiLFwiZGlxXCIsXCJkaXJcIixcImRpc1wiLFwiZGl0XCIsXCJkaXVcIixcImRpd1wiLFwiZGl4XCIsXCJkaXlcIixcImRpelwiLFwiZGphXCIsXCJkamJcIixcImRqY1wiLFwiZGpkXCIsXCJkamVcIixcImRqZlwiLFwiZGppXCIsXCJkampcIixcImRqa1wiLFwiZGpsXCIsXCJkam1cIixcImRqblwiLFwiZGpvXCIsXCJkanJcIixcImRqdVwiLFwiZGp3XCIsXCJka2FcIixcImRrZ1wiLFwiZGtrXCIsXCJka2xcIixcImRrclwiLFwiZGtzXCIsXCJka3hcIixcImRsZ1wiLFwiZGxrXCIsXCJkbG1cIixcImRsblwiLFwiZG1hXCIsXCJkbWJcIixcImRtY1wiLFwiZG1kXCIsXCJkbWVcIixcImRtZlwiLFwiZG1nXCIsXCJkbWtcIixcImRtbFwiLFwiZG1tXCIsXCJkbW5cIixcImRtb1wiLFwiZG1yXCIsXCJkbXNcIixcImRtdVwiLFwiZG12XCIsXCJkbXdcIixcImRteFwiLFwiZG15XCIsXCJkbmFcIixcImRuZFwiLFwiZG5lXCIsXCJkbmdcIixcImRuaVwiLFwiZG5qXCIsXCJkbmtcIixcImRublwiLFwiZG5vXCIsXCJkbnJcIixcImRudFwiLFwiZG51XCIsXCJkbnZcIixcImRud1wiLFwiZG55XCIsXCJkb2FcIixcImRvYlwiLFwiZG9jXCIsXCJkb2VcIixcImRvZlwiLFwiZG9oXCIsXCJkb2lcIixcImRva1wiLFwiZG9sXCIsXCJkb25cIixcImRvb1wiLFwiZG9wXCIsXCJkb3FcIixcImRvclwiLFwiZG9zXCIsXCJkb3RcIixcImRvdlwiLFwiZG93XCIsXCJkb3hcIixcImRveVwiLFwiZG96XCIsXCJkcHBcIixcImRyYVwiLFwiZHJiXCIsXCJkcmNcIixcImRyZFwiLFwiZHJlXCIsXCJkcmdcIixcImRyaFwiLFwiZHJpXCIsXCJkcmxcIixcImRyblwiLFwiZHJvXCIsXCJkcnFcIixcImRyclwiLFwiZHJzXCIsXCJkcnRcIixcImRydVwiLFwiZHJ3XCIsXCJkcnlcIixcImRzYlwiLFwiZHNlXCIsXCJkc2hcIixcImRzaVwiLFwiZHNsXCIsXCJkc25cIixcImRzb1wiLFwiZHNxXCIsXCJkdGFcIixcImR0YlwiLFwiZHRkXCIsXCJkdGhcIixcImR0aVwiLFwiZHRrXCIsXCJkdG1cIixcImR0blwiLFwiZHRvXCIsXCJkdHBcIixcImR0clwiLFwiZHRzXCIsXCJkdHRcIixcImR0dVwiLFwiZHR5XCIsXCJkdWFcIixcImR1YlwiLFwiZHVjXCIsXCJkdWRcIixcImR1ZVwiLFwiZHVmXCIsXCJkdWdcIixcImR1aFwiLFwiZHVpXCIsXCJkdWpcIixcImR1a1wiLFwiZHVsXCIsXCJkdW1cIixcImR1blwiLFwiZHVvXCIsXCJkdXBcIixcImR1cVwiLFwiZHVyXCIsXCJkdXNcIixcImR1dVwiLFwiZHV2XCIsXCJkdXdcIixcImR1eFwiLFwiZHV5XCIsXCJkdXpcIixcImR2YVwiLFwiZHdhXCIsXCJkd2tcIixcImR3bFwiLFwiZHdyXCIsXCJkd3NcIixcImR3dVwiLFwiZHd3XCIsXCJkd3lcIixcImR3elwiLFwiZHlhXCIsXCJkeWJcIixcImR5ZFwiLFwiZHlnXCIsXCJkeWlcIixcImR5bVwiLFwiZHluXCIsXCJkeW9cIixcImR5dVwiLFwiZHl5XCIsXCJkemFcIixcImR6ZFwiLFwiZHplXCIsXCJkemdcIixcImR6bFwiLFwiZHpuXCJdXG4sWyBcImVlXCIsXCJlbFwiLFwiZW5cIixcImVvXCIsXCJlc1wiLFwiZXRcIixcImV1XCIsXCJlYWFcIixcImViY1wiLFwiZWJnXCIsXCJlYmtcIixcImVib1wiLFwiZWJyXCIsXCJlYnVcIixcImVjclwiLFwiZWNzXCIsXCJlY3lcIixcImVlZVwiLFwiZWZhXCIsXCJlZmVcIixcImVmaVwiLFwiZWdhXCIsXCJlZ2xcIixcImVnb1wiLFwiZWd4XCIsXCJlZ3lcIixcImVoc1wiLFwiZWh1XCIsXCJlaXBcIixcImVpdFwiLFwiZWl2XCIsXCJlamFcIixcImVrYVwiLFwiZWtjXCIsXCJla2VcIixcImVrZ1wiLFwiZWtpXCIsXCJla2tcIixcImVrbFwiLFwiZWttXCIsXCJla29cIixcImVrcFwiLFwiZWtyXCIsXCJla3lcIixcImVsZVwiLFwiZWxoXCIsXCJlbGlcIixcImVsa1wiLFwiZWxtXCIsXCJlbG9cIixcImVscFwiLFwiZWx1XCIsXCJlbHhcIixcImVtYVwiLFwiZW1iXCIsXCJlbWVcIixcImVtZ1wiLFwiZW1pXCIsXCJlbWtcIixcImVtbVwiLFwiZW1uXCIsXCJlbW9cIixcImVtcFwiLFwiZW1xXCIsXCJlbXNcIixcImVtdVwiLFwiZW13XCIsXCJlbXhcIixcImVteVwiLFwiZW16XCIsXCJlbmFcIixcImVuYlwiLFwiZW5jXCIsXCJlbmRcIixcImVuZlwiLFwiZW5oXCIsXCJlbmxcIixcImVubVwiLFwiZW5uXCIsXCJlbm9cIixcImVucVwiLFwiZW5yXCIsXCJlbnVcIixcImVudlwiLFwiZW53XCIsXCJlbnhcIixcImVvdFwiLFwiZXBpXCIsXCJlcmFcIixcImVyZ1wiLFwiZXJoXCIsXCJlcmlcIixcImVya1wiLFwiZXJvXCIsXCJlcnJcIixcImVyc1wiLFwiZXJ0XCIsXCJlcndcIixcImVzZVwiLFwiZXNnXCIsXCJlc2hcIixcImVzaVwiLFwiZXNrXCIsXCJlc2xcIixcImVzbVwiLFwiZXNuXCIsXCJlc29cIixcImVzcVwiLFwiZXNzXCIsXCJlc3VcIixcImVzeFwiLFwiZXN5XCIsXCJldGJcIixcImV0Y1wiLFwiZXRoXCIsXCJldG5cIixcImV0b1wiLFwiZXRyXCIsXCJldHNcIixcImV0dFwiLFwiZXR1XCIsXCJldHhcIixcImV0elwiLFwiZXVxXCIsXCJldmVcIixcImV2aFwiLFwiZXZuXCIsXCJld29cIixcImV4dFwiLFwiZXlhXCIsXCJleW9cIixcImV6YVwiLFwiZXplXCJdXG4sWyBcImZhXCIsXCJmZlwiLFwiZmlcIixcImZqXCIsXCJmb1wiLFwiZnJcIixcImZ5XCIsXCJmYWFcIixcImZhYlwiLFwiZmFkXCIsXCJmYWZcIixcImZhZ1wiLFwiZmFoXCIsXCJmYWlcIixcImZhalwiLFwiZmFrXCIsXCJmYWxcIixcImZhbVwiLFwiZmFuXCIsXCJmYXBcIixcImZhclwiLFwiZmF0XCIsXCJmYXVcIixcImZheFwiLFwiZmF5XCIsXCJmYXpcIixcImZibFwiLFwiZmNzXCIsXCJmZXJcIixcImZmaVwiLFwiZmZtXCIsXCJmZ3JcIixcImZpYVwiLFwiZmllXCIsXCJmaWZcIixcImZpbFwiLFwiZmlwXCIsXCJmaXJcIixcImZpdFwiLFwiZml1XCIsXCJmaXdcIixcImZra1wiLFwiZmt2XCIsXCJmbGFcIixcImZsaFwiLFwiZmxpXCIsXCJmbGxcIixcImZsblwiLFwiZmxyXCIsXCJmbHlcIixcImZtcFwiLFwiZm11XCIsXCJmbmJcIixcImZuZ1wiLFwiZm5pXCIsXCJmb2RcIixcImZvaVwiLFwiZm9tXCIsXCJmb25cIixcImZvclwiLFwiZm9zXCIsXCJmb3hcIixcImZwZVwiLFwiZnFzXCIsXCJmcmNcIixcImZyZFwiLFwiZnJrXCIsXCJmcm1cIixcImZyb1wiLFwiZnJwXCIsXCJmcnFcIixcImZyclwiLFwiZnJzXCIsXCJmcnRcIixcImZzZVwiLFwiZnNsXCIsXCJmc3NcIixcImZ1YlwiLFwiZnVjXCIsXCJmdWRcIixcImZ1ZVwiLFwiZnVmXCIsXCJmdWhcIixcImZ1aVwiLFwiZnVqXCIsXCJmdW1cIixcImZ1blwiLFwiZnVxXCIsXCJmdXJcIixcImZ1dFwiLFwiZnV1XCIsXCJmdXZcIixcImZ1eVwiLFwiZnZyXCIsXCJmd2FcIixcImZ3ZVwiXVxuLFsgXCJnYVwiLFwiZ2RcIixcImdsXCIsXCJnblwiLFwiZ3VcIixcImd2XCIsXCJnYWFcIixcImdhYlwiLFwiZ2FjXCIsXCJnYWRcIixcImdhZVwiLFwiZ2FmXCIsXCJnYWdcIixcImdhaFwiLFwiZ2FpXCIsXCJnYWpcIixcImdha1wiLFwiZ2FsXCIsXCJnYW1cIixcImdhblwiLFwiZ2FvXCIsXCJnYXBcIixcImdhcVwiLFwiZ2FyXCIsXCJnYXNcIixcImdhdFwiLFwiZ2F1XCIsXCJnYXZcIixcImdhd1wiLFwiZ2F4XCIsXCJnYXlcIixcImdhelwiLFwiZ2JhXCIsXCJnYmJcIixcImdiY1wiLFwiZ2JkXCIsXCJnYmVcIixcImdiZlwiLFwiZ2JnXCIsXCJnYmhcIixcImdiaVwiLFwiZ2JqXCIsXCJnYmtcIixcImdibFwiLFwiZ2JtXCIsXCJnYm5cIixcImdib1wiLFwiZ2JwXCIsXCJnYnFcIixcImdiclwiLFwiZ2JzXCIsXCJnYnVcIixcImdidlwiLFwiZ2J3XCIsXCJnYnhcIixcImdieVwiLFwiZ2J6XCIsXCJnY2NcIixcImdjZFwiLFwiZ2NlXCIsXCJnY2ZcIixcImdjbFwiLFwiZ2NuXCIsXCJnY3JcIixcImdjdFwiLFwiZ2RhXCIsXCJnZGJcIixcImdkY1wiLFwiZ2RkXCIsXCJnZGVcIixcImdkZlwiLFwiZ2RnXCIsXCJnZGhcIixcImdkaVwiLFwiZ2RqXCIsXCJnZGtcIixcImdkbFwiLFwiZ2RtXCIsXCJnZG5cIixcImdkb1wiLFwiZ2RxXCIsXCJnZHJcIixcImdkc1wiLFwiZ2R0XCIsXCJnZHVcIixcImdkeFwiLFwiZ2VhXCIsXCJnZWJcIixcImdlY1wiLFwiZ2VkXCIsXCJnZWZcIixcImdlZ1wiLFwiZ2VoXCIsXCJnZWlcIixcImdlalwiLFwiZ2VrXCIsXCJnZWxcIixcImdlbVwiLFwiZ2VxXCIsXCJnZXNcIixcImdldlwiLFwiZ2V3XCIsXCJnZXhcIixcImdleVwiLFwiZ2V6XCIsXCJnZmtcIixcImdmdFwiLFwiZ2Z4XCIsXCJnZ2FcIixcImdnYlwiLFwiZ2dkXCIsXCJnZ2VcIixcImdnZ1wiLFwiZ2drXCIsXCJnZ2xcIixcImdnblwiLFwiZ2dvXCIsXCJnZ3JcIixcImdndFwiLFwiZ2d1XCIsXCJnZ3dcIixcImdoYVwiLFwiZ2hjXCIsXCJnaGVcIixcImdoaFwiLFwiZ2hrXCIsXCJnaGxcIixcImdoblwiLFwiZ2hvXCIsXCJnaHJcIixcImdoc1wiLFwiZ2h0XCIsXCJnaWFcIixcImdpYlwiLFwiZ2ljXCIsXCJnaWRcIixcImdpZVwiLFwiZ2lnXCIsXCJnaWhcIixcImdpaVwiLFwiZ2lsXCIsXCJnaW1cIixcImdpblwiLFwiZ2lvXCIsXCJnaXBcIixcImdpcVwiLFwiZ2lyXCIsXCJnaXNcIixcImdpdFwiLFwiZ2l1XCIsXCJnaXdcIixcImdpeFwiLFwiZ2l5XCIsXCJnaXpcIixcImdqaVwiLFwiZ2prXCIsXCJnam1cIixcImdqblwiLFwiZ2pyXCIsXCJnanVcIixcImdrYVwiLFwiZ2tkXCIsXCJna2VcIixcImdrblwiLFwiZ2tvXCIsXCJna3BcIixcImdrdVwiLFwiZ2xiXCIsXCJnbGNcIixcImdsZFwiLFwiZ2xoXCIsXCJnbGlcIixcImdsalwiLFwiZ2xrXCIsXCJnbGxcIixcImdsb1wiLFwiZ2xyXCIsXCJnbHVcIixcImdsd1wiLFwiZ2x5XCIsXCJnbWFcIixcImdtYlwiLFwiZ21kXCIsXCJnbWVcIixcImdtZ1wiLFwiZ21oXCIsXCJnbWxcIixcImdtbVwiLFwiZ21uXCIsXCJnbXFcIixcImdtclwiLFwiZ211XCIsXCJnbXZcIixcImdtd1wiLFwiZ214XCIsXCJnbXlcIixcImdtelwiLFwiZ25hXCIsXCJnbmJcIixcImduY1wiLFwiZ25kXCIsXCJnbmVcIixcImduZ1wiLFwiZ25oXCIsXCJnbmlcIixcImdualwiLFwiZ25rXCIsXCJnbmxcIixcImdubVwiLFwiZ25uXCIsXCJnbm9cIixcImducVwiLFwiZ25yXCIsXCJnbnRcIixcImdudVwiLFwiZ253XCIsXCJnbnpcIixcImdvYVwiLFwiZ29iXCIsXCJnb2NcIixcImdvZFwiLFwiZ29lXCIsXCJnb2ZcIixcImdvZ1wiLFwiZ29oXCIsXCJnb2lcIixcImdvalwiLFwiZ29rXCIsXCJnb2xcIixcImdvbVwiLFwiZ29uXCIsXCJnb29cIixcImdvcFwiLFwiZ29xXCIsXCJnb3JcIixcImdvc1wiLFwiZ290XCIsXCJnb3VcIixcImdvd1wiLFwiZ294XCIsXCJnb3lcIixcImdvelwiLFwiZ3BhXCIsXCJncGVcIixcImdwblwiLFwiZ3FhXCIsXCJncWlcIixcImdxblwiLFwiZ3FyXCIsXCJncXVcIixcImdyYVwiLFwiZ3JiXCIsXCJncmNcIixcImdyZFwiLFwiZ3JnXCIsXCJncmhcIixcImdyaVwiLFwiZ3JqXCIsXCJncmtcIixcImdybVwiLFwiZ3JvXCIsXCJncnFcIixcImdyclwiLFwiZ3JzXCIsXCJncnRcIixcImdydVwiLFwiZ3J2XCIsXCJncndcIixcImdyeFwiLFwiZ3J5XCIsXCJncnpcIixcImdzZVwiLFwiZ3NnXCIsXCJnc2xcIixcImdzbVwiLFwiZ3NuXCIsXCJnc29cIixcImdzcFwiLFwiZ3NzXCIsXCJnc3dcIixcImd0YVwiLFwiZ3RpXCIsXCJndHVcIixcImd1YVwiLFwiZ3ViXCIsXCJndWNcIixcImd1ZFwiLFwiZ3VlXCIsXCJndWZcIixcImd1Z1wiLFwiZ3VoXCIsXCJndWlcIixcImd1a1wiLFwiZ3VsXCIsXCJndW1cIixcImd1blwiLFwiZ3VvXCIsXCJndXBcIixcImd1cVwiLFwiZ3VyXCIsXCJndXNcIixcImd1dFwiLFwiZ3V1XCIsXCJndXZcIixcImd1d1wiLFwiZ3V4XCIsXCJndXpcIixcImd2YVwiLFwiZ3ZjXCIsXCJndmVcIixcImd2ZlwiLFwiZ3ZqXCIsXCJndmxcIixcImd2bVwiLFwiZ3ZuXCIsXCJndm9cIixcImd2cFwiLFwiZ3ZyXCIsXCJndnNcIixcImd2eVwiLFwiZ3dhXCIsXCJnd2JcIixcImd3Y1wiLFwiZ3dkXCIsXCJnd2VcIixcImd3ZlwiLFwiZ3dnXCIsXCJnd2lcIixcImd3alwiLFwiZ3dtXCIsXCJnd25cIixcImd3clwiLFwiZ3d0XCIsXCJnd3VcIixcImd3d1wiLFwiZ3d4XCIsXCJneHhcIixcImd5YVwiLFwiZ3liXCIsXCJneWRcIixcImd5ZVwiLFwiZ3lmXCIsXCJneWdcIixcImd5aVwiLFwiZ3lsXCIsXCJneW1cIixcImd5blwiLFwiZ3lvXCIsXCJneXJcIixcImd5eVwiLFwiZ3l6XCIsXCJnemFcIixcImd6aVwiLFwiZ3puXCJdXG4sWyBcImhhXCIsXCJoZVwiLFwiaGlcIixcImhvXCIsXCJoclwiLFwiaHRcIixcImh1XCIsXCJoeVwiLFwiaHpcIixcImhhYVwiLFwiaGFiXCIsXCJoYWNcIixcImhhZFwiLFwiaGFlXCIsXCJoYWZcIixcImhhZ1wiLFwiaGFoXCIsXCJoYWlcIixcImhhalwiLFwiaGFrXCIsXCJoYWxcIixcImhhbVwiLFwiaGFuXCIsXCJoYW9cIixcImhhcFwiLFwiaGFxXCIsXCJoYXJcIixcImhhc1wiLFwiaGF2XCIsXCJoYXdcIixcImhheFwiLFwiaGF5XCIsXCJoYXpcIixcImhiYVwiLFwiaGJiXCIsXCJoYm5cIixcImhib1wiLFwiaGJ1XCIsXCJoY2FcIixcImhjaFwiLFwiaGRuXCIsXCJoZHNcIixcImhkeVwiLFwiaGVhXCIsXCJoZWRcIixcImhlZ1wiLFwiaGVoXCIsXCJoZWlcIixcImhlbVwiLFwiaGdtXCIsXCJoZ3dcIixcImhoaVwiLFwiaGhyXCIsXCJoaHlcIixcImhpYVwiLFwiaGliXCIsXCJoaWRcIixcImhpZlwiLFwiaGlnXCIsXCJoaWhcIixcImhpaVwiLFwiaGlqXCIsXCJoaWtcIixcImhpbFwiLFwiaGltXCIsXCJoaW9cIixcImhpclwiLFwiaGl0XCIsXCJoaXdcIixcImhpeFwiLFwiaGppXCIsXCJoa2FcIixcImhrZVwiLFwiaGtoXCIsXCJoa2tcIixcImhrblwiLFwiaGtzXCIsXCJobGFcIixcImhsYlwiLFwiaGxkXCIsXCJobGVcIixcImhsdFwiLFwiaGx1XCIsXCJobWFcIixcImhtYlwiLFwiaG1jXCIsXCJobWRcIixcImhtZVwiLFwiaG1mXCIsXCJobWdcIixcImhtaFwiLFwiaG1pXCIsXCJobWpcIixcImhta1wiLFwiaG1sXCIsXCJobW1cIixcImhtblwiLFwiaG1wXCIsXCJobXFcIixcImhtclwiLFwiaG1zXCIsXCJobXRcIixcImhtdVwiLFwiaG12XCIsXCJobXdcIixcImhteFwiLFwiaG15XCIsXCJobXpcIixcImhuYVwiLFwiaG5kXCIsXCJobmVcIixcImhuZ1wiLFwiaG5oXCIsXCJobmlcIixcImhualwiLFwiaG5uXCIsXCJobm9cIixcImhuc1wiLFwiaG51XCIsXCJob2FcIixcImhvYlwiLFwiaG9jXCIsXCJob2RcIixcImhvZVwiLFwiaG9oXCIsXCJob2lcIixcImhvalwiLFwiaG9rXCIsXCJob2xcIixcImhvbVwiLFwiaG9vXCIsXCJob3BcIixcImhvclwiLFwiaG9zXCIsXCJob3RcIixcImhvdlwiLFwiaG93XCIsXCJob3lcIixcImhvelwiLFwiaHBvXCIsXCJocHNcIixcImhyYVwiLFwiaHJjXCIsXCJocmVcIixcImhya1wiLFwiaHJtXCIsXCJocm9cIixcImhycFwiLFwiaHJyXCIsXCJocnRcIixcImhydVwiLFwiaHJ3XCIsXCJocnhcIixcImhyelwiLFwiaHNiXCIsXCJoc2hcIixcImhzbFwiLFwiaHNuXCIsXCJoc3NcIixcImh0aVwiLFwiaHRvXCIsXCJodHNcIixcImh0dVwiLFwiaHR4XCIsXCJodWJcIixcImh1Y1wiLFwiaHVkXCIsXCJodWVcIixcImh1ZlwiLFwiaHVnXCIsXCJodWhcIixcImh1aVwiLFwiaHVqXCIsXCJodWtcIixcImh1bFwiLFwiaHVtXCIsXCJodW9cIixcImh1cFwiLFwiaHVxXCIsXCJodXJcIixcImh1c1wiLFwiaHV0XCIsXCJodXVcIixcImh1dlwiLFwiaHV3XCIsXCJodXhcIixcImh1eVwiLFwiaHV6XCIsXCJodmNcIixcImh2ZVwiLFwiaHZrXCIsXCJodm5cIixcImh2dlwiLFwiaHdhXCIsXCJod2NcIixcImh3b1wiLFwiaHlhXCIsXCJoeXdcIixcImh5eFwiXVxuLFsgXCJpYVwiLFwiaWRcIixcImllXCIsXCJpZ1wiLFwiaWlcIixcImlrXCIsXCJpblwiLFwiaW9cIixcImlzXCIsXCJpdFwiLFwiaXVcIixcIml3XCIsXCJpYWlcIixcImlhblwiLFwiaWFwXCIsXCJpYXJcIixcImliYVwiLFwiaWJiXCIsXCJpYmRcIixcImliZVwiLFwiaWJnXCIsXCJpYmhcIixcImliaVwiLFwiaWJsXCIsXCJpYm1cIixcImliblwiLFwiaWJyXCIsXCJpYnVcIixcImlieVwiLFwiaWNhXCIsXCJpY2hcIixcImljbFwiLFwiaWNyXCIsXCJpZGFcIixcImlkYlwiLFwiaWRjXCIsXCJpZGRcIixcImlkZVwiLFwiaWRpXCIsXCJpZHJcIixcImlkc1wiLFwiaWR0XCIsXCJpZHVcIixcImlmYVwiLFwiaWZiXCIsXCJpZmVcIixcImlmZlwiLFwiaWZrXCIsXCJpZm1cIixcImlmdVwiLFwiaWZ5XCIsXCJpZ2JcIixcImlnZVwiLFwiaWdnXCIsXCJpZ2xcIixcImlnbVwiLFwiaWduXCIsXCJpZ29cIixcImlnc1wiLFwiaWd3XCIsXCJpaGJcIixcImloaVwiLFwiaWhwXCIsXCJpaHdcIixcImlpblwiLFwiaWlyXCIsXCJpamNcIixcImlqZVwiLFwiaWpqXCIsXCJpam5cIixcImlqb1wiLFwiaWpzXCIsXCJpa2VcIixcImlraVwiLFwiaWtrXCIsXCJpa2xcIixcImlrb1wiLFwiaWtwXCIsXCJpa3JcIixcImlrc1wiLFwiaWt0XCIsXCJpa3ZcIixcImlrd1wiLFwiaWt4XCIsXCJpa3pcIixcImlsYVwiLFwiaWxiXCIsXCJpbGdcIixcImlsaVwiLFwiaWxrXCIsXCJpbGxcIixcImlsbVwiLFwiaWxvXCIsXCJpbHBcIixcImlsc1wiLFwiaWx1XCIsXCJpbHZcIixcImlsd1wiLFwiaW1hXCIsXCJpbWVcIixcImltaVwiLFwiaW1sXCIsXCJpbW5cIixcImltb1wiLFwiaW1yXCIsXCJpbXNcIixcImlteVwiLFwiaW5iXCIsXCJpbmNcIixcImluZVwiLFwiaW5nXCIsXCJpbmhcIixcImlualwiLFwiaW5sXCIsXCJpbm1cIixcImlublwiLFwiaW5vXCIsXCJpbnBcIixcImluc1wiLFwiaW50XCIsXCJpbnpcIixcImlvclwiLFwiaW91XCIsXCJpb3dcIixcImlwaVwiLFwiaXBvXCIsXCJpcXVcIixcImlxd1wiLFwiaXJhXCIsXCJpcmVcIixcImlyaFwiLFwiaXJpXCIsXCJpcmtcIixcImlyblwiLFwiaXJvXCIsXCJpcnJcIixcImlydVwiLFwiaXJ4XCIsXCJpcnlcIixcImlzYVwiLFwiaXNjXCIsXCJpc2RcIixcImlzZVwiLFwiaXNnXCIsXCJpc2hcIixcImlzaVwiLFwiaXNrXCIsXCJpc21cIixcImlzblwiLFwiaXNvXCIsXCJpc3JcIixcImlzdFwiLFwiaXN1XCIsXCJpdGJcIixcIml0Y1wiLFwiaXRkXCIsXCJpdGVcIixcIml0aVwiLFwiaXRrXCIsXCJpdGxcIixcIml0bVwiLFwiaXRvXCIsXCJpdHJcIixcIml0c1wiLFwiaXR0XCIsXCJpdHZcIixcIml0d1wiLFwiaXR4XCIsXCJpdHlcIixcIml0elwiLFwiaXVtXCIsXCJpdmJcIixcIml2dlwiLFwiaXdrXCIsXCJpd21cIixcIml3b1wiLFwiaXdzXCIsXCJpeGNcIixcIml4bFwiLFwiaXlhXCIsXCJpeW9cIixcIml5eFwiLFwiaXpoXCIsXCJpemlcIixcIml6clwiLFwiaXp6XCJdXG4sWyBcImphXCIsXCJqaVwiLFwianZcIixcImp3XCIsXCJqYWFcIixcImphYlwiLFwiamFjXCIsXCJqYWRcIixcImphZVwiLFwiamFmXCIsXCJqYWhcIixcImphalwiLFwiamFrXCIsXCJqYWxcIixcImphbVwiLFwiamFuXCIsXCJqYW9cIixcImphcVwiLFwiamFyXCIsXCJqYXNcIixcImphdFwiLFwiamF1XCIsXCJqYXhcIixcImpheVwiLFwiamF6XCIsXCJqYmVcIixcImpiaVwiLFwiamJqXCIsXCJqYmtcIixcImpibVwiLFwiamJuXCIsXCJqYm9cIixcImpiclwiLFwiamJ0XCIsXCJqYnVcIixcImpid1wiLFwiamNzXCIsXCJqY3RcIixcImpkYVwiLFwiamRnXCIsXCJqZHRcIixcImplYlwiLFwiamVlXCIsXCJqZWdcIixcImplaFwiLFwiamVpXCIsXCJqZWtcIixcImplbFwiLFwiamVuXCIsXCJqZXJcIixcImpldFwiLFwiamV1XCIsXCJqZ2JcIixcImpnZVwiLFwiamdrXCIsXCJqZ29cIixcImpoaVwiLFwiamhzXCIsXCJqaWFcIixcImppYlwiLFwiamljXCIsXCJqaWRcIixcImppZVwiLFwiamlnXCIsXCJqaWhcIixcImppaVwiLFwiamlsXCIsXCJqaW1cIixcImppb1wiLFwiamlxXCIsXCJqaXRcIixcImppdVwiLFwiaml2XCIsXCJqaXlcIixcImpqZVwiLFwiampyXCIsXCJqa2FcIixcImprbVwiLFwiamtvXCIsXCJqa3BcIixcImprclwiLFwiamtzXCIsXCJqa3VcIixcImpsZVwiLFwiamxzXCIsXCJqbWFcIixcImptYlwiLFwiam1jXCIsXCJqbWRcIixcImptaVwiLFwiam1sXCIsXCJqbW5cIixcImptclwiLFwiam1zXCIsXCJqbXdcIixcImpteFwiLFwiam5hXCIsXCJqbmRcIixcImpuZ1wiLFwiam5pXCIsXCJqbmpcIixcImpubFwiLFwiam5zXCIsXCJqb2JcIixcImpvZFwiLFwiam9nXCIsXCJqb3JcIixcImpvc1wiLFwiam93XCIsXCJqcGFcIixcImpwclwiLFwianB4XCIsXCJqcXJcIixcImpyYVwiLFwianJiXCIsXCJqcnJcIixcImpydFwiLFwianJ1XCIsXCJqc2xcIixcImp1YVwiLFwianViXCIsXCJqdWNcIixcImp1ZFwiLFwianVoXCIsXCJqdWlcIixcImp1a1wiLFwianVsXCIsXCJqdW1cIixcImp1blwiLFwianVvXCIsXCJqdXBcIixcImp1clwiLFwianVzXCIsXCJqdXRcIixcImp1dVwiLFwianV3XCIsXCJqdXlcIixcImp2ZFwiLFwianZuXCIsXCJqd2lcIixcImp5YVwiLFwianllXCIsXCJqeXlcIl1cbixbIFwia2FcIixcImtnXCIsXCJraVwiLFwia2pcIixcImtrXCIsXCJrbFwiLFwia21cIixcImtuXCIsXCJrb1wiLFwia3JcIixcImtzXCIsXCJrdVwiLFwia3ZcIixcImt3XCIsXCJreVwiLFwia2FhXCIsXCJrYWJcIixcImthY1wiLFwia2FkXCIsXCJrYWVcIixcImthZlwiLFwia2FnXCIsXCJrYWhcIixcImthaVwiLFwia2FqXCIsXCJrYWtcIixcImthbVwiLFwia2FvXCIsXCJrYXBcIixcImthcVwiLFwia2FyXCIsXCJrYXZcIixcImthd1wiLFwia2F4XCIsXCJrYXlcIixcImtiYVwiLFwia2JiXCIsXCJrYmNcIixcImtiZFwiLFwia2JlXCIsXCJrYmZcIixcImtiZ1wiLFwia2JoXCIsXCJrYmlcIixcImtialwiLFwia2JrXCIsXCJrYmxcIixcImtibVwiLFwia2JuXCIsXCJrYm9cIixcImticFwiLFwia2JxXCIsXCJrYnJcIixcImtic1wiLFwia2J0XCIsXCJrYnVcIixcImtidlwiLFwia2J3XCIsXCJrYnhcIixcImtieVwiLFwia2J6XCIsXCJrY2FcIixcImtjYlwiLFwia2NjXCIsXCJrY2RcIixcImtjZVwiLFwia2NmXCIsXCJrY2dcIixcImtjaFwiLFwia2NpXCIsXCJrY2pcIixcImtja1wiLFwia2NsXCIsXCJrY21cIixcImtjblwiLFwia2NvXCIsXCJrY3BcIixcImtjcVwiLFwia2NyXCIsXCJrY3NcIixcImtjdFwiLFwia2N1XCIsXCJrY3ZcIixcImtjd1wiLFwia2N4XCIsXCJrY3lcIixcImtjelwiLFwia2RhXCIsXCJrZGNcIixcImtkZFwiLFwia2RlXCIsXCJrZGZcIixcImtkZ1wiLFwia2RoXCIsXCJrZGlcIixcImtkalwiLFwia2RrXCIsXCJrZGxcIixcImtkbVwiLFwia2RuXCIsXCJrZG9cIixcImtkcFwiLFwia2RxXCIsXCJrZHJcIixcImtkdFwiLFwia2R1XCIsXCJrZHZcIixcImtkd1wiLFwia2R4XCIsXCJrZHlcIixcImtkelwiLFwia2VhXCIsXCJrZWJcIixcImtlY1wiLFwia2VkXCIsXCJrZWVcIixcImtlZlwiLFwia2VnXCIsXCJrZWhcIixcImtlaVwiLFwia2VqXCIsXCJrZWtcIixcImtlbFwiLFwia2VtXCIsXCJrZW5cIixcImtlb1wiLFwia2VwXCIsXCJrZXFcIixcImtlclwiLFwia2VzXCIsXCJrZXRcIixcImtldVwiLFwia2V2XCIsXCJrZXdcIixcImtleFwiLFwia2V5XCIsXCJrZXpcIixcImtmYVwiLFwia2ZiXCIsXCJrZmNcIixcImtmZFwiLFwia2ZlXCIsXCJrZmZcIixcImtmZ1wiLFwia2ZoXCIsXCJrZmlcIixcImtmalwiLFwia2ZrXCIsXCJrZmxcIixcImtmbVwiLFwia2ZuXCIsXCJrZm9cIixcImtmcFwiLFwia2ZxXCIsXCJrZnJcIixcImtmc1wiLFwia2Z0XCIsXCJrZnVcIixcImtmdlwiLFwia2Z3XCIsXCJrZnhcIixcImtmeVwiLFwia2Z6XCIsXCJrZ2FcIixcImtnYlwiLFwia2djXCIsXCJrZ2RcIixcImtnZVwiLFwia2dmXCIsXCJrZ2dcIixcImtnaFwiLFwia2dpXCIsXCJrZ2pcIixcImtna1wiLFwia2dsXCIsXCJrZ21cIixcImtnblwiLFwia2dvXCIsXCJrZ3BcIixcImtncVwiLFwia2dyXCIsXCJrZ3NcIixcImtndFwiLFwia2d1XCIsXCJrZ3ZcIixcImtnd1wiLFwia2d4XCIsXCJrZ3lcIixcImtoYVwiLFwibHlnXCIsXCJraGJcIixcImtoY1wiLFwia2hkXCIsXCJraGVcIixcImtoZlwiLFwia2hnXCIsXCJraGhcIixcImtoaVwiLFwia2hqXCIsXCJraGtcIixcImtobFwiLFwia2huXCIsXCJraG9cIixcImtocFwiLFwia2hxXCIsXCJraHJcIixcImtoc1wiLFwia2h0XCIsXCJraHVcIixcImtodlwiLFwia2h3XCIsXCJraHhcIixcImtoeVwiLFwia2h6XCIsXCJraWFcIixcImtpYlwiLFwia2ljXCIsXCJraWRcIixcImtpZVwiLFwia2lmXCIsXCJraWdcIixcImtpaFwiLFwia2lpXCIsXCJraWpcIixcImtpbFwiLFwia2ltXCIsXCJraW9cIixcImtpcFwiLFwia2lxXCIsXCJraXNcIixcImtpdFwiLFwia2l1XCIsXCJraXZcIixcImtpd1wiLFwia2l4XCIsXCJraXlcIixcImtpelwiLFwia2phXCIsXCJramJcIixcImtqY1wiLFwia2pkXCIsXCJramVcIixcImtqZlwiLFwia2pnXCIsXCJramhcIixcImtqaVwiLFwia2pqXCIsXCJramtcIixcImtqbFwiLFwia2ptXCIsXCJram5cIixcImtqb1wiLFwia2pwXCIsXCJranFcIixcImtqclwiLFwia2pzXCIsXCJranRcIixcImtqdVwiLFwia2p2XCIsXCJranhcIixcImtqeVwiLFwia2p6XCIsXCJra2FcIixcImtrYlwiLFwia2tjXCIsXCJra2RcIixcImtrZVwiLFwia2tmXCIsXCJra2dcIixcImtraFwiLFwia2tpXCIsXCJra2pcIixcImtra1wiLFwia2tsXCIsXCJra21cIixcImtrblwiLFwia2tvXCIsXCJra3BcIixcImtrcVwiLFwia2tyXCIsXCJra3NcIixcImtrdFwiLFwia2t1XCIsXCJra3ZcIixcImtrd1wiLFwia2t4XCIsXCJra3lcIixcImtrelwiLFwia2xhXCIsXCJrbGJcIixcImtsY1wiLFwia2xkXCIsXCJrbGVcIixcImtsZlwiLFwia2xnXCIsXCJrbGhcIixcImtsaVwiLFwia2xqXCIsXCJrbGtcIixcImtsbFwiLFwia2xtXCIsXCJrbG5cIixcImtsb1wiLFwia2xwXCIsXCJrbHFcIixcImtsclwiLFwia2xzXCIsXCJrbHRcIixcImtsdVwiLFwia2x2XCIsXCJrbHdcIixcImtseFwiLFwia2x5XCIsXCJrbHpcIixcImttYVwiLFwia21iXCIsXCJrbWNcIixcImttZFwiLFwia21lXCIsXCJrbWZcIixcImttZ1wiLFwia21oXCIsXCJrbWlcIixcImttalwiLFwia21rXCIsXCJrbWxcIixcImttbVwiLFwia21uXCIsXCJrbW9cIixcImttcFwiLFwia21xXCIsXCJrbXJcIixcImttc1wiLFwia210XCIsXCJrbXVcIixcImttdlwiLFwia213XCIsXCJrbXhcIixcImtteVwiLFwia216XCIsXCJrbmFcIixcImtuYlwiLFwia25jXCIsXCJrbmRcIixcImtuZVwiLFwia25mXCIsXCJrbmdcIixcImtuaVwiLFwia25qXCIsXCJrbmtcIixcImtubFwiLFwia25tXCIsXCJrbm5cIixcImtub1wiLFwia25wXCIsXCJrbnFcIixcImtuclwiLFwia25zXCIsXCJrbnRcIixcImtudVwiLFwia252XCIsXCJrbndcIixcImtueFwiLFwia255XCIsXCJrbnpcIixcImtvYVwiLFwia29jXCIsXCJrb2RcIixcImtvZVwiLFwia29mXCIsXCJrb2dcIixcImtvaFwiLFwia29pXCIsXCJrb2pcIixcImtva1wiLFwia29sXCIsXCJrb29cIixcImtvcFwiLFwia29xXCIsXCJrb3NcIixcImtvdFwiLFwia291XCIsXCJrb3ZcIixcImtvd1wiLFwia294XCIsXCJrb3lcIixcImtvelwiLFwia3BhXCIsXCJrcGJcIixcImtwY1wiLFwia3BkXCIsXCJrcGVcIixcImtwZlwiLFwia3BnXCIsXCJrcGhcIixcImtwaVwiLFwia3BqXCIsXCJrcGtcIixcImtwbFwiLFwia3BtXCIsXCJrcG5cIixcImtwb1wiLFwia3BwXCIsXCJrcHFcIixcImtwclwiLFwia3BzXCIsXCJrcHRcIixcImtwdVwiLFwia3B2XCIsXCJrcHdcIixcImtweFwiLFwia3B5XCIsXCJrcHpcIixcImtxYVwiLFwia3FiXCIsXCJrcWNcIixcImtxZFwiLFwia3FlXCIsXCJrcWZcIixcImtxZ1wiLFwia3FoXCIsXCJrcWlcIixcImtxalwiLFwia3FrXCIsXCJrcWxcIixcImtxbVwiLFwia3FuXCIsXCJrcW9cIixcImtxcFwiLFwia3FxXCIsXCJrcXJcIixcImtxc1wiLFwia3F0XCIsXCJrcXVcIixcImtxdlwiLFwia3F3XCIsXCJrcXhcIixcImtxeVwiLFwia3F6XCIsXCJrcmFcIixcImtyYlwiLFwia3JjXCIsXCJrcmRcIixcImtyZVwiLFwia3JmXCIsXCJrcmhcIixcImtyaVwiLFwia3JqXCIsXCJrcmtcIixcImtybFwiLFwia3JtXCIsXCJrcm5cIixcImtyb1wiLFwia3JwXCIsXCJrcnJcIixcImtyc1wiLFwia3J0XCIsXCJrcnVcIixcImtydlwiLFwia3J3XCIsXCJrcnhcIixcImtyeVwiLFwia3J6XCIsXCJrc2FcIixcImtzYlwiLFwia3NjXCIsXCJrc2RcIixcImtzZVwiLFwia3NmXCIsXCJrc2dcIixcImtzaFwiLFwia3NpXCIsXCJrc2pcIixcImtza1wiLFwia3NsXCIsXCJrc21cIixcImtzblwiLFwia3NvXCIsXCJrc3BcIixcImtzcVwiLFwia3NyXCIsXCJrc3NcIixcImtzdFwiLFwia3N1XCIsXCJrc3ZcIixcImtzd1wiLFwia3N4XCIsXCJrc3lcIixcImtzelwiLFwia3RhXCIsXCJrdGJcIixcImt0Y1wiLFwia3RkXCIsXCJrdGVcIixcImt0ZlwiLFwia3RnXCIsXCJrdGhcIixcImt0aVwiLFwia3RqXCIsXCJrdGtcIixcImt0bFwiLFwia3RtXCIsXCJrdG5cIixcImt0b1wiLFwia3RwXCIsXCJrdHFcIixcImt0clwiLFwia3RzXCIsXCJrdHRcIixcImt0dVwiLFwia3R2XCIsXCJrdHdcIixcImt0eFwiLFwia3R5XCIsXCJrdHpcIixcImt1YlwiLFwia3VjXCIsXCJrdWRcIixcImt1ZVwiLFwia3VmXCIsXCJrdWdcIixcImt1aFwiLFwia3VpXCIsXCJrdWpcIixcImt1a1wiLFwia3VsXCIsXCJrdW1cIixcImt1blwiLFwia3VvXCIsXCJrdXBcIixcImt1cVwiLFwia3VzXCIsXCJrdXRcIixcImt1dVwiLFwia3V2XCIsXCJrdXdcIixcImt1eFwiLFwia3V5XCIsXCJrdXpcIixcImt2YVwiLFwia3ZiXCIsXCJrdmNcIixcImt2ZFwiLFwia3ZlXCIsXCJrdmZcIixcImt2Z1wiLFwia3ZoXCIsXCJrdmlcIixcImt2alwiLFwia3ZrXCIsXCJrdmxcIixcImt2bVwiLFwia3ZuXCIsXCJrdm9cIixcImt2cFwiLFwia3ZxXCIsXCJrdnJcIixcImt2c1wiLFwia3Z0XCIsXCJrdnVcIixcImt2dlwiLFwia3Z3XCIsXCJrdnhcIixcImt2eVwiLFwia3Z6XCIsXCJrd2FcIixcImt3YlwiLFwia3djXCIsXCJrd2RcIixcImt3ZVwiLFwia3dmXCIsXCJrd2dcIixcImt3aFwiLFwia3dpXCIsXCJrd2pcIixcImt3a1wiLFwia3dsXCIsXCJrd21cIixcImt3blwiLFwia3dvXCIsXCJrd3BcIixcImt3cVwiLFwia3dyXCIsXCJrd3NcIixcImt3dFwiLFwia3d1XCIsXCJrd3ZcIixcImt3d1wiLFwia3d4XCIsXCJrd3lcIixcImt3elwiLFwia3hhXCIsXCJreGJcIixcImt4Y1wiLFwia3hkXCIsXCJreGVcIixcImt4ZlwiLFwia3hoXCIsXCJreGlcIixcImt4alwiLFwia3hrXCIsXCJreGxcIixcImt4bVwiLFwia3huXCIsXCJreG9cIixcImt4cFwiLFwia3hxXCIsXCJreHJcIixcImt4c1wiLFwia3h0XCIsXCJreHVcIixcImt4dlwiLFwia3h3XCIsXCJreHhcIixcImt4eVwiLFwia3h6XCIsXCJreWFcIixcImt5YlwiLFwia3ljXCIsXCJreWRcIixcImt5ZVwiLFwia3lmXCIsXCJreWdcIixcImt5aFwiLFwia3lpXCIsXCJreWpcIixcImt5a1wiLFwia3lsXCIsXCJreW1cIixcImt5blwiLFwia3lvXCIsXCJreXBcIixcImt5cVwiLFwia3lyXCIsXCJreXNcIixcImt5dFwiLFwia3l1XCIsXCJreXZcIixcImt5d1wiLFwia3l4XCIsXCJreXlcIixcImt5elwiLFwia3phXCIsXCJremJcIixcImt6Y1wiLFwia3pkXCIsXCJremVcIixcImt6ZlwiLFwia3pnXCIsXCJremhcIixcImt6aVwiLFwia3pqXCIsXCJremtcIixcImt6bFwiLFwia3ptXCIsXCJrem5cIixcImt6b1wiLFwia3pwXCIsXCJrenFcIixcImt6clwiLFwia3pzXCIsXCJrenRcIixcImt6dVwiLFwia3p2XCIsXCJrendcIixcImt6eFwiLFwia3p5XCIsXCJrenpcIl1cbixbIFwibGFcIixcImxiXCIsXCJsZ1wiLFwibGlcIixcImxuXCIsXCJsb1wiLFwibHRcIixcImx1XCIsXCJsdlwiLFwibGFhXCIsXCJsYWJcIixcImxhY1wiLFwibGFkXCIsXCJsYWVcIixcImxhZlwiLFwibGFnXCIsXCJsYWhcIixcImxhaVwiLFwibGFqXCIsXCJsYWtcIixcImxhbFwiLFwibGFtXCIsXCJsYW5cIixcImxhcFwiLFwibGFxXCIsXCJsYXJcIixcImxhc1wiLFwibGF1XCIsXCJsYXdcIixcImxheFwiLFwibGF5XCIsXCJsYXpcIixcImxiYVwiLFwibGJiXCIsXCJsYmNcIixcImxiZVwiLFwibGJmXCIsXCJsYmdcIixcImxiaVwiLFwibGJqXCIsXCJsYmtcIixcImxibFwiLFwibGJtXCIsXCJsYm5cIixcImxib1wiLFwibGJxXCIsXCJsYnJcIixcImxic1wiLFwibGJ0XCIsXCJsYnVcIixcImxidlwiLFwibGJ3XCIsXCJsYnhcIixcImxieVwiLFwibGJ6XCIsXCJsY2NcIixcImxjZFwiLFwibGNlXCIsXCJsY2ZcIixcImxjaFwiLFwibGNsXCIsXCJsY21cIixcImxjcFwiLFwibGNxXCIsXCJsY3NcIixcImxkYVwiLFwibGRiXCIsXCJsZGRcIixcImxkZ1wiLFwibGRoXCIsXCJsZGlcIixcImxkalwiLFwibGRrXCIsXCJsZGxcIixcImxkbVwiLFwibGRuXCIsXCJsZG9cIixcImxkcFwiLFwibGRxXCIsXCJsZWFcIixcImxlYlwiLFwibGVjXCIsXCJsZWRcIixcImxlZVwiLFwibGVmXCIsXCJsZWdcIixcImxlaFwiLFwibGVpXCIsXCJsZWpcIixcImxla1wiLFwibGVsXCIsXCJsZW1cIixcImxlblwiLFwibGVvXCIsXCJsZXBcIixcImxlcVwiLFwibGVyXCIsXCJsZXNcIixcImxldFwiLFwibGV1XCIsXCJsZXZcIixcImxld1wiLFwibGV4XCIsXCJsZXlcIixcImxlelwiLFwibGZhXCIsXCJsZm5cIixcImxnYVwiLFwibGdiXCIsXCJsZ2dcIixcImxnaFwiLFwibGdpXCIsXCJsZ2tcIixcImxnbFwiLFwibGdtXCIsXCJsZ25cIixcImxncVwiLFwibGdyXCIsXCJsZ3RcIixcImxndVwiLFwibGd6XCIsXCJsaGFcIixcImxoaFwiLFwibGhpXCIsXCJsaGxcIixcImxobVwiLFwibGhuXCIsXCJsaHBcIixcImxoc1wiLFwibGh0XCIsXCJsaHVcIixcImxpYVwiLFwibGliXCIsXCJsaWNcIixcImxpZFwiLFwibGllXCIsXCJsaWZcIixcImxpZ1wiLFwibGloXCIsXCJsaWlcIixcImxpalwiLFwibGlrXCIsXCJsaWxcIixcImxpb1wiLFwibGlwXCIsXCJsaXFcIixcImxpclwiLFwibGlzXCIsXCJsaXVcIixcImxpdlwiLFwibGl3XCIsXCJsaXhcIixcImxpeVwiLFwibGl6XCIsXCJsamFcIixcImxqZVwiLFwibGppXCIsXCJsamxcIixcImxqcFwiLFwibGp3XCIsXCJsanhcIixcImxrYVwiLFwibGtiXCIsXCJsa2NcIixcImxrZFwiLFwibGtlXCIsXCJsa2hcIixcImxraVwiLFwibGtqXCIsXCJsa2xcIixcImxrbVwiLFwibGtuXCIsXCJsa29cIixcImxrclwiLFwibGtzXCIsXCJsa3RcIixcImxrdVwiLFwibGt5XCIsXCJsbGFcIixcImxsYlwiLFwibGxjXCIsXCJsbGRcIixcImxsZVwiLFwibGxmXCIsXCJsbGdcIixcImxsaFwiLFwibGxpXCIsXCJsbGpcIixcImxsa1wiLFwibGxsXCIsXCJsbG1cIixcImxsblwiLFwibGxvXCIsXCJsbHBcIixcImxscVwiLFwibGxzXCIsXCJsbHVcIixcImxseFwiLFwibG1hXCIsXCJsbWJcIixcImxtY1wiLFwibG1kXCIsXCJsbWVcIixcImxtZlwiLFwibG1nXCIsXCJsbWhcIixcImxtaVwiLFwibG1qXCIsXCJsbWtcIixcImxtbFwiLFwibG1tXCIsXCJsbW5cIixcImxtb1wiLFwibG1wXCIsXCJsbXFcIixcImxtclwiLFwibG11XCIsXCJsbXZcIixcImxtd1wiLFwibG14XCIsXCJsbXlcIixcImxtelwiLFwibG5hXCIsXCJsbmJcIixcImxuZFwiLFwibG5nXCIsXCJsbmhcIixcImxuaVwiLFwibG5qXCIsXCJsbmxcIixcImxubVwiLFwibG5uXCIsXCJsbm9cIixcImxuc1wiLFwibG51XCIsXCJsbndcIixcImxuelwiLFwibG9hXCIsXCJsb2JcIixcImxvY1wiLFwibG9lXCIsXCJsb2ZcIixcImxvZ1wiLFwibG9oXCIsXCJsb2lcIixcImxvalwiLFwibG9rXCIsXCJsb2xcIixcImxvbVwiLFwibG9uXCIsXCJsb29cIixcImxvcFwiLFwibG9xXCIsXCJsb3JcIixcImxvc1wiLFwibG90XCIsXCJsb3VcIixcImxvdlwiLFwibG93XCIsXCJsb3hcIixcImxveVwiLFwibG96XCIsXCJscGFcIixcImxwZVwiLFwibHBuXCIsXCJscG9cIixcImxweFwiLFwibHJhXCIsXCJscmNcIixcImxyZVwiLFwibHJnXCIsXCJscmlcIixcImxya1wiLFwibHJsXCIsXCJscm1cIixcImxyblwiLFwibHJvXCIsXCJscnJcIixcImxydFwiLFwibHJ2XCIsXCJscnpcIixcImxzYVwiLFwibHNiXCIsXCJsc2RcIixcImxzZVwiLFwibHNnXCIsXCJsc2hcIixcImxzaVwiLFwibHNsXCIsXCJsc21cIixcImxzblwiLFwibHNvXCIsXCJsc3BcIixcImxzclwiLFwibHNzXCIsXCJsc3RcIixcImxzdlwiLFwibHN5XCIsXCJsdGNcIixcImx0Z1wiLFwibHRoXCIsXCJsdGlcIixcImx0blwiLFwibHRvXCIsXCJsdHNcIixcImx0dVwiLFwibHVhXCIsXCJsdWNcIixcImx1ZFwiLFwibHVlXCIsXCJsdWZcIixcImx1aVwiLFwibHVqXCIsXCJsdWtcIixcImx1bFwiLFwibHVtXCIsXCJsdW5cIixcImx1b1wiLFwibHVwXCIsXCJsdXFcIixcImx1clwiLFwibHVzXCIsXCJsdXRcIixcImx1dVwiLFwibHV2XCIsXCJsdXdcIixcImx1eVwiLFwibHV6XCIsXCJsdmFcIixcImx2aVwiLFwibHZrXCIsXCJsdnNcIixcImx2dVwiLFwibHdhXCIsXCJsd2VcIixcImx3Z1wiLFwibHdoXCIsXCJsd2xcIixcImx3bVwiLFwibHdvXCIsXCJsd3NcIixcImx3dFwiLFwibHd1XCIsXCJsd3dcIixcImx4bVwiLFwibHlhXCIsXCJseWdcIixcImx5blwiLFwibHpoXCIsXCJsemxcIixcImx6blwiLFwibHp6XCJdXG4sWyBcIm1nXCIsXCJtaFwiLFwibWlcIixcIm1rXCIsXCJtbFwiLFwibW5cIixcIm1vXCIsXCJtclwiLFwibXNcIixcIm10XCIsXCJteVwiLFwibWFhXCIsXCJtYWJcIixcIm1hZFwiLFwibWFlXCIsXCJtYWZcIixcIm1hZ1wiLFwibWFpXCIsXCJtYWpcIixcIm1ha1wiLFwibWFtXCIsXCJtYW5cIixcIm1hcFwiLFwibWFxXCIsXCJtYXNcIixcIm1hdFwiLFwibWF1XCIsXCJtYXZcIixcIm1hd1wiLFwibWF4XCIsXCJtYXpcIixcIm1iYVwiLFwibWJiXCIsXCJtYmNcIixcIm1iZFwiLFwibWJlXCIsXCJtYmZcIixcIm1iaFwiLFwibWJpXCIsXCJtYmpcIixcIm1ia1wiLFwibWJsXCIsXCJtYm1cIixcIm1iblwiLFwibWJvXCIsXCJtYnBcIixcIm1icVwiLFwibWJyXCIsXCJtYnNcIixcIm1idFwiLFwibWJ1XCIsXCJtYnZcIixcIm1id1wiLFwibWJ4XCIsXCJtYnlcIixcIm1ielwiLFwibWNhXCIsXCJtY2JcIixcIm1jY1wiLFwibWNkXCIsXCJtY2VcIixcIm1jZlwiLFwibWNnXCIsXCJtY2hcIixcIm1jaVwiLFwibWNqXCIsXCJtY2tcIixcIm1jbFwiLFwibWNtXCIsXCJtY25cIixcIm1jb1wiLFwibWNwXCIsXCJtY3FcIixcIm1jclwiLFwibWNzXCIsXCJtY3RcIixcIm1jdVwiLFwibWN2XCIsXCJtY3dcIixcIm1jeFwiLFwibWN5XCIsXCJtY3pcIixcIm1kYVwiLFwibWRiXCIsXCJtZGNcIixcIm1kZFwiLFwibWRlXCIsXCJtZGZcIixcIm1kZ1wiLFwibWRoXCIsXCJtZGlcIixcIm1kalwiLFwibWRrXCIsXCJtZGxcIixcIm1kbVwiLFwibWRuXCIsXCJtZHBcIixcIm1kcVwiLFwibWRyXCIsXCJtZHNcIixcIm1kdFwiLFwibWR1XCIsXCJtZHZcIixcIm1kd1wiLFwibWR4XCIsXCJtZHlcIixcIm1kelwiLFwibWVhXCIsXCJtZWJcIixcIm1lY1wiLFwibWVkXCIsXCJtZWVcIixcIm1lZlwiLFwibWVnXCIsXCJtZWhcIixcIm1laVwiLFwibWVqXCIsXCJtZWtcIixcIm1lbFwiLFwibWVtXCIsXCJtZW5cIixcIm1lb1wiLFwibWVwXCIsXCJtZXFcIixcIm1lclwiLFwibWVzXCIsXCJtZXRcIixcIm1ldVwiLFwibWV2XCIsXCJtZXdcIixcIm1leVwiLFwibWV6XCIsXCJtZmFcIixcIm1mYlwiLFwibWZjXCIsXCJtZmRcIixcIm1mZVwiLFwibWZmXCIsXCJtZmdcIixcIm1maFwiLFwibWZpXCIsXCJtZmpcIixcIm1ma1wiLFwibWZsXCIsXCJtZm1cIixcIm1mblwiLFwibWZvXCIsXCJtZnBcIixcIm1mcVwiLFwibWZyXCIsXCJtZnNcIixcIm1mdFwiLFwibWZ1XCIsXCJtZnZcIixcIm1md1wiLFwibWZ4XCIsXCJtZnlcIixcIm1melwiLFwibWdhXCIsXCJtZ2JcIixcIm1nY1wiLFwibWdkXCIsXCJtZ2VcIixcIm1nZlwiLFwibWdnXCIsXCJtZ2hcIixcIm1naVwiLFwibWdqXCIsXCJtZ2tcIixcIm1nbFwiLFwibWdtXCIsXCJtZ25cIixcIm1nb1wiLFwibWdwXCIsXCJtZ3FcIixcIm1nclwiLFwibWdzXCIsXCJtZ3RcIixcIm1ndVwiLFwibWd2XCIsXCJtZ3dcIixcIm1neFwiLFwibWd5XCIsXCJtZ3pcIixcIm1oYVwiLFwibWhiXCIsXCJtaGNcIixcIm1oZFwiLFwibWhlXCIsXCJtaGZcIixcIm1oZ1wiLFwibWhoXCIsXCJtaGlcIixcIm1oalwiLFwibWhrXCIsXCJtaGxcIixcIm1obVwiLFwibWhuXCIsXCJtaG9cIixcIm1ocFwiLFwibWhxXCIsXCJtaHJcIixcIm1oc1wiLFwibWh0XCIsXCJtaHVcIixcIm1od1wiLFwibWh4XCIsXCJtaHlcIixcIm1oelwiLFwibWlhXCIsXCJtaWJcIixcIm1pY1wiLFwibWlkXCIsXCJtaWVcIixcIm1pZlwiLFwibWlnXCIsXCJtaWhcIixcIm1paVwiLFwibWlqXCIsXCJtaWtcIixcIm1pbFwiLFwibWltXCIsXCJtaW5cIixcIm1pb1wiLFwibWlwXCIsXCJtaXFcIixcIm1pclwiLFwibWlzXCIsXCJtaXRcIixcIm1pdVwiLFwibWl3XCIsXCJtaXhcIixcIm1peVwiLFwibWl6XCIsXCJtamFcIixcIm1qYlwiLFwibWpjXCIsXCJtamRcIixcIm1qZVwiLFwibWpnXCIsXCJtamhcIixcIm1qaVwiLFwibWpqXCIsXCJtamtcIixcIm1qbFwiLFwibWptXCIsXCJtam5cIixcIm1qb1wiLFwibWpwXCIsXCJtanFcIixcIm1qclwiLFwibWpzXCIsXCJtanRcIixcIm1qdVwiLFwibWp2XCIsXCJtandcIixcIm1qeFwiLFwibWp5XCIsXCJtanpcIixcIm1rYVwiLFwibWtiXCIsXCJta2NcIixcIm1rZVwiLFwibWtmXCIsXCJta2dcIixcIm1raFwiLFwibWtpXCIsXCJta2pcIixcIm1ra1wiLFwibWtsXCIsXCJta21cIixcIm1rblwiLFwibWtvXCIsXCJta3BcIixcIm1rcVwiLFwibWtyXCIsXCJta3NcIixcIm1rdFwiLFwibWt1XCIsXCJta3ZcIixcIm1rd1wiLFwibWt4XCIsXCJta3lcIixcIm1relwiLFwibWxhXCIsXCJtbGJcIixcIm1sY1wiLFwibWxkXCIsXCJtbGVcIixcIm1sZlwiLFwibWxoXCIsXCJtbGlcIixcIm1salwiLFwibWxrXCIsXCJtbGxcIixcIm1sbVwiLFwibWxuXCIsXCJtbG9cIixcIm1scFwiLFwibWxxXCIsXCJtbHJcIixcIm1sc1wiLFwibWx1XCIsXCJtbHZcIixcIm1sd1wiLFwibWx4XCIsXCJtbHpcIixcIm1tYVwiLFwibW1iXCIsXCJtbWNcIixcIm1tZFwiLFwibW1lXCIsXCJtbWZcIixcIm1tZ1wiLFwibW1oXCIsXCJtbWlcIixcIm1talwiLFwibW1rXCIsXCJtbWxcIixcIm1tbVwiLFwibW1uXCIsXCJtbW9cIixcIm1tcFwiLFwibW1xXCIsXCJtbXJcIixcIm1tdFwiLFwibW11XCIsXCJtbXZcIixcIm1td1wiLFwibW14XCIsXCJtbXlcIixcIm1telwiLFwibW5hXCIsXCJtbmJcIixcIm1uY1wiLFwibW5kXCIsXCJtbmVcIixcIm1uZlwiLFwibW5nXCIsXCJtbmhcIixcIm1uaVwiLFwibW5qXCIsXCJtbmtcIixcIm1ubFwiLFwibW5tXCIsXCJtbm5cIixcIm1ub1wiLFwibW5wXCIsXCJtbnFcIixcIm1uclwiLFwibW5zXCIsXCJtbnRcIixcIm1udVwiLFwibW52XCIsXCJtbndcIixcIm1ueFwiLFwibW55XCIsXCJtbnpcIixcIm1vYVwiLFwibW9jXCIsXCJtb2RcIixcIm1vZVwiLFwibW9mXCIsXCJtb2dcIixcIm1vaFwiLFwibW9pXCIsXCJtb2pcIixcIm1va1wiLFwibW9tXCIsXCJtb29cIixcIm1vcFwiLFwibW9xXCIsXCJtb3JcIixcIm1vc1wiLFwibW90XCIsXCJtb3VcIixcIm1vdlwiLFwibW93XCIsXCJtb3hcIixcIm1veVwiLFwibW96XCIsXCJtcGFcIixcIm1wYlwiLFwibXBjXCIsXCJtcGRcIixcIm1wZVwiLFwibXBnXCIsXCJtcGhcIixcIm1waVwiLFwibXBqXCIsXCJtcGtcIixcIm1wbFwiLFwibXBtXCIsXCJtcG5cIixcIm1wb1wiLFwibXBwXCIsXCJtcHFcIixcIm1wclwiLFwibXBzXCIsXCJtcHRcIixcIm1wdVwiLFwibXB2XCIsXCJtcHdcIixcIm1weFwiLFwibXB5XCIsXCJtcHpcIixcIm1xYVwiLFwibXFiXCIsXCJtcWNcIixcIm1xZVwiLFwibXFmXCIsXCJtcWdcIixcIm1xaFwiLFwibXFpXCIsXCJtcWpcIixcIm1xa1wiLFwibXFsXCIsXCJtcW1cIixcIm1xblwiLFwibXFvXCIsXCJtcXBcIixcIm1xcVwiLFwibXFyXCIsXCJtcXNcIixcIm1xdFwiLFwibXF1XCIsXCJtcXZcIixcIm1xd1wiLFwibXF4XCIsXCJtcXlcIixcIm1xelwiLFwibXJhXCIsXCJtcmJcIixcIm1yY1wiLFwibXJkXCIsXCJtcmVcIixcIm1yZlwiLFwibXJnXCIsXCJtcmhcIixcIm1yalwiLFwibXJrXCIsXCJtcmxcIixcIm1ybVwiLFwibXJuXCIsXCJtcm9cIixcIm1ycFwiLFwibXJxXCIsXCJtcnJcIixcIm1yc1wiLFwibXJ0XCIsXCJtcnVcIixcIm1ydlwiLFwibXJ3XCIsXCJtcnhcIixcIm1yeVwiLFwibXJ6XCIsXCJtc2JcIixcIm1zY1wiLFwibXNkXCIsXCJtc2VcIixcIm1zZlwiLFwibXNnXCIsXCJtc2hcIixcIm1zaVwiLFwibXNqXCIsXCJtc2tcIixcIm1zbFwiLFwibXNtXCIsXCJtc25cIixcIm1zb1wiLFwibXNwXCIsXCJtc3FcIixcIm1zclwiLFwibXNzXCIsXCJtc3RcIixcIm1zdVwiLFwibXN2XCIsXCJtc3dcIixcIm1zeFwiLFwibXN5XCIsXCJtc3pcIixcIm10YVwiLFwibXRiXCIsXCJtdGNcIixcIm10ZFwiLFwibXRlXCIsXCJtdGZcIixcIm10Z1wiLFwibXRoXCIsXCJtdGlcIixcIm10alwiLFwibXRrXCIsXCJtdGxcIixcIm10bVwiLFwibXRuXCIsXCJtdG9cIixcIm10cFwiLFwibXRxXCIsXCJtdHJcIixcIm10c1wiLFwibXR0XCIsXCJtdHVcIixcIm10dlwiLFwibXR3XCIsXCJtdHhcIixcIm10eVwiLFwibXVhXCIsXCJtdWJcIixcIm11Y1wiLFwibXVkXCIsXCJtdWVcIixcIm11Z1wiLFwibXVoXCIsXCJtdWlcIixcIm11alwiLFwibXVrXCIsXCJtdWxcIixcIm11bVwiLFwibXVuXCIsXCJtdW9cIixcIm11cFwiLFwibXVxXCIsXCJtdXJcIixcIm11c1wiLFwibXV0XCIsXCJtdXVcIixcIm11dlwiLFwibXV4XCIsXCJtdXlcIixcIm11elwiLFwibXZhXCIsXCJtdmJcIixcIm12ZFwiLFwibXZlXCIsXCJtdmZcIixcIm12Z1wiLFwibXZoXCIsXCJtdmlcIixcIm12a1wiLFwibXZsXCIsXCJtdm1cIixcIm12blwiLFwibXZvXCIsXCJtdnBcIixcIm12cVwiLFwibXZyXCIsXCJtdnNcIixcIm12dFwiLFwibXZ1XCIsXCJtdnZcIixcIm12d1wiLFwibXZ4XCIsXCJtdnlcIixcIm12elwiLFwibXdhXCIsXCJtd2JcIixcIm13Y1wiLFwibXdkXCIsXCJtd2VcIixcIm13ZlwiLFwibXdnXCIsXCJtd2hcIixcIm13aVwiLFwibXdqXCIsXCJtd2tcIixcIm13bFwiLFwibXdtXCIsXCJtd25cIixcIm13b1wiLFwibXdwXCIsXCJtd3FcIixcIm13clwiLFwibXdzXCIsXCJtd3RcIixcIm13dVwiLFwibXd2XCIsXCJtd3dcIixcIm13eFwiLFwibXd5XCIsXCJtd3pcIixcIm14YVwiLFwibXhiXCIsXCJteGNcIixcIm14ZFwiLFwibXhlXCIsXCJteGZcIixcIm14Z1wiLFwibXhoXCIsXCJteGlcIixcIm14alwiLFwibXhrXCIsXCJteGxcIixcIm14bVwiLFwibXhuXCIsXCJteG9cIixcIm14cFwiLFwibXhxXCIsXCJteHJcIixcIm14c1wiLFwibXh0XCIsXCJteHVcIixcIm14dlwiLFwibXh3XCIsXCJteHhcIixcIm14eVwiLFwibXh6XCIsXCJteWJcIixcIm15Y1wiLFwibXlkXCIsXCJteWVcIixcIm15ZlwiLFwibXlnXCIsXCJteWhcIixcIm15aVwiLFwibXlqXCIsXCJteWtcIixcIm15bFwiLFwibXltXCIsXCJteW5cIixcIm15b1wiLFwibXlwXCIsXCJteXFcIixcIm15clwiLFwibXlzXCIsXCJteXRcIixcIm15dVwiLFwibXl2XCIsXCJteXdcIixcIm15eFwiLFwibXl5XCIsXCJteXpcIixcIm16YVwiLFwibXpiXCIsXCJtemNcIixcIm16ZFwiLFwibXplXCIsXCJtemdcIixcIm16aFwiLFwibXppXCIsXCJtempcIixcIm16a1wiLFwibXpsXCIsXCJtem1cIixcIm16blwiLFwibXpvXCIsXCJtenBcIixcIm16cVwiLFwibXpyXCIsXCJtenNcIixcIm16dFwiLFwibXp1XCIsXCJtenZcIixcIm16d1wiLFwibXp4XCIsXCJtenlcIixcIm16elwiXVxuLFsgXCJuYVwiLFwibmJcIixcIm5kXCIsXCJuZVwiLFwibmdcIixcIm5sXCIsXCJublwiLFwibm9cIixcIm5yXCIsXCJudlwiLFwibnlcIixcIm5hYVwiLFwibmFiXCIsXCJuYWNcIixcIm5hZFwiLFwibmFlXCIsXCJuYWZcIixcIm5hZ1wiLFwibmFoXCIsXCJuYWlcIixcIm5halwiLFwibmFrXCIsXCJuYWxcIixcIm5hbVwiLFwibmFuXCIsXCJuYW9cIixcIm5hcFwiLFwibmFxXCIsXCJuYXJcIixcIm5hc1wiLFwibmF0XCIsXCJuYXdcIixcIm5heFwiLFwibmF5XCIsXCJuYXpcIixcIm5iYVwiLFwibmJiXCIsXCJuYmNcIixcIm5iZFwiLFwibmJlXCIsXCJuYmZcIixcIm5iZ1wiLFwibmJoXCIsXCJuYmlcIixcIm5ialwiLFwibmJrXCIsXCJuYm1cIixcIm5iblwiLFwibmJvXCIsXCJuYnBcIixcIm5icVwiLFwibmJyXCIsXCJuYnNcIixcIm5idFwiLFwibmJ1XCIsXCJuYnZcIixcIm5id1wiLFwibmJ4XCIsXCJuYnlcIixcIm5jYVwiLFwibmNiXCIsXCJuY2NcIixcIm5jZFwiLFwibmNlXCIsXCJuY2ZcIixcIm5jZ1wiLFwibmNoXCIsXCJuY2lcIixcIm5jalwiLFwibmNrXCIsXCJuY2xcIixcIm5jbVwiLFwibmNuXCIsXCJuY29cIixcIm5jcFwiLFwibmNxXCIsXCJuY3JcIixcIm5jc1wiLFwibmN0XCIsXCJuY3VcIixcIm5jeFwiLFwibmN6XCIsXCJuZGFcIixcIm5kYlwiLFwibmRjXCIsXCJuZGRcIixcIm5kZlwiLFwibmRnXCIsXCJuZGhcIixcIm5kaVwiLFwibmRqXCIsXCJuZGtcIixcIm5kbFwiLFwibmRtXCIsXCJuZG5cIixcIm5kcFwiLFwibmRxXCIsXCJuZHJcIixcIm5kc1wiLFwibmR0XCIsXCJuZHVcIixcIm5kdlwiLFwibmR3XCIsXCJuZHhcIixcIm5keVwiLFwibmR6XCIsXCJuZWFcIixcIm5lYlwiLFwibmVjXCIsXCJuZWRcIixcIm5lZVwiLFwibmVmXCIsXCJuZWdcIixcIm5laFwiLFwibmVpXCIsXCJuZWpcIixcIm5la1wiLFwibmVtXCIsXCJuZW5cIixcIm5lb1wiLFwibmVxXCIsXCJuZXJcIixcIm5lc1wiLFwibmV0XCIsXCJuZXVcIixcIm5ldlwiLFwibmV3XCIsXCJuZXhcIixcIm5leVwiLFwibmV6XCIsXCJuZmFcIixcIm5mZFwiLFwibmZsXCIsXCJuZnJcIixcIm5mdVwiLFwibmdhXCIsXCJuZ2JcIixcIm5nY1wiLFwibmdkXCIsXCJuZ2VcIixcIm5nZlwiLFwibmdnXCIsXCJuZ2hcIixcIm5naVwiLFwibmdqXCIsXCJuZ2tcIixcIm5nbFwiLFwibmdtXCIsXCJuZ25cIixcIm5nb1wiLFwibmdwXCIsXCJuZ3FcIixcIm5nclwiLFwibmdzXCIsXCJuZ3RcIixcIm5ndVwiLFwibmd2XCIsXCJuZ3dcIixcIm5neFwiLFwibmd5XCIsXCJuZ3pcIixcIm5oYVwiLFwibmhiXCIsXCJuaGNcIixcIm5oZFwiLFwibmhlXCIsXCJuaGZcIixcIm5oZ1wiLFwibmhoXCIsXCJuaGlcIixcIm5oa1wiLFwibmhtXCIsXCJuaG5cIixcIm5ob1wiLFwibmhwXCIsXCJuaHFcIixcIm5oclwiLFwibmh0XCIsXCJuaHVcIixcIm5odlwiLFwibmh3XCIsXCJuaHhcIixcIm5oeVwiLFwibmh6XCIsXCJuaWFcIixcIm5pYlwiLFwibmljXCIsXCJuaWRcIixcIm5pZVwiLFwibmlmXCIsXCJuaWdcIixcIm5paFwiLFwibmlpXCIsXCJuaWpcIixcIm5pa1wiLFwibmlsXCIsXCJuaW1cIixcIm5pblwiLFwibmlvXCIsXCJuaXFcIixcIm5pclwiLFwibmlzXCIsXCJuaXRcIixcIm5pdVwiLFwibml2XCIsXCJuaXdcIixcIm5peFwiLFwibml5XCIsXCJuaXpcIixcIm5qYVwiLFwibmpiXCIsXCJuamRcIixcIm5qaFwiLFwibmppXCIsXCJuampcIixcIm5qbFwiLFwibmptXCIsXCJuam5cIixcIm5qb1wiLFwibmpyXCIsXCJuanNcIixcIm5qdFwiLFwibmp1XCIsXCJuanhcIixcIm5qeVwiLFwibmp6XCIsXCJua2FcIixcIm5rYlwiLFwibmtjXCIsXCJua2RcIixcIm5rZVwiLFwibmtmXCIsXCJua2dcIixcIm5raFwiLFwibmtpXCIsXCJua2pcIixcIm5ra1wiLFwibmttXCIsXCJua25cIixcIm5rb1wiLFwibmtwXCIsXCJua3FcIixcIm5rclwiLFwibmtzXCIsXCJua3RcIixcIm5rdVwiLFwibmt2XCIsXCJua3dcIixcIm5reFwiLFwibmt6XCIsXCJubGFcIixcIm5sY1wiLFwibmxlXCIsXCJubGdcIixcIm5saVwiLFwibmxqXCIsXCJubGtcIixcIm5sbFwiLFwibmxtXCIsXCJubG5cIixcIm5sb1wiLFwibmxxXCIsXCJubHJcIixcIm5sdVwiLFwibmx2XCIsXCJubHdcIixcIm5seFwiLFwibmx5XCIsXCJubHpcIixcIm5tYVwiLFwibm1iXCIsXCJubWNcIixcIm5tZFwiLFwibm1lXCIsXCJubWZcIixcIm5tZ1wiLFwibm1oXCIsXCJubWlcIixcIm5talwiLFwibm1rXCIsXCJubWxcIixcIm5tbVwiLFwibm1uXCIsXCJubW9cIixcIm5tcFwiLFwibm1xXCIsXCJubXJcIixcIm5tc1wiLFwibm10XCIsXCJubXVcIixcIm5tdlwiLFwibm13XCIsXCJubXhcIixcIm5teVwiLFwibm16XCIsXCJubmFcIixcIm5uYlwiLFwibm5jXCIsXCJubmRcIixcIm5uZVwiLFwibm5mXCIsXCJubmdcIixcIm5uaFwiLFwibm5pXCIsXCJubmpcIixcIm5ua1wiLFwibm5sXCIsXCJubm1cIixcIm5ublwiLFwibm5wXCIsXCJubnFcIixcIm5uclwiLFwibm5zXCIsXCJubnRcIixcIm5udVwiLFwibm52XCIsXCJubndcIixcIm5ueFwiLFwibm55XCIsXCJubnpcIixcIm5vYVwiLFwibm9jXCIsXCJub2RcIixcIm5vZVwiLFwibm9mXCIsXCJub2dcIixcIm5vaFwiLFwibm9pXCIsXCJub2pcIixcIm5va1wiLFwibm9sXCIsXCJub21cIixcIm5vblwiLFwibm9vXCIsXCJub3BcIixcIm5vcVwiLFwibm9zXCIsXCJub3RcIixcIm5vdVwiLFwibm92XCIsXCJub3dcIixcIm5veVwiLFwibm96XCIsXCJucGFcIixcIm5wYlwiLFwibnBnXCIsXCJucGhcIixcIm5waVwiLFwibnBsXCIsXCJucG5cIixcIm5wb1wiLFwibnBzXCIsXCJucHVcIixcIm5weFwiLFwibnB5XCIsXCJucWdcIixcIm5xa1wiLFwibnFsXCIsXCJucW1cIixcIm5xblwiLFwibnFvXCIsXCJucXFcIixcIm5xdFwiLFwibnF5XCIsXCJucmFcIixcIm5yYlwiLFwibnJjXCIsXCJucmVcIixcIm5yZlwiLFwibnJnXCIsXCJucmlcIixcIm5ya1wiLFwibnJsXCIsXCJucm1cIixcIm5yblwiLFwibnJwXCIsXCJucnJcIixcIm5ydFwiLFwibnJ1XCIsXCJucnhcIixcIm5yelwiLFwibnNhXCIsXCJuc2JcIixcIm5zY1wiLFwibnNkXCIsXCJuc2VcIixcIm5zZlwiLFwibnNnXCIsXCJuc2hcIixcIm5zaVwiLFwibnNrXCIsXCJuc2xcIixcIm5zbVwiLFwibnNuXCIsXCJuc29cIixcIm5zcFwiLFwibnNxXCIsXCJuc3JcIixcIm5zc1wiLFwibnN0XCIsXCJuc3VcIixcIm5zdlwiLFwibnN3XCIsXCJuc3hcIixcIm5zeVwiLFwibnN6XCIsXCJudGRcIixcIm50ZVwiLFwibnRnXCIsXCJudGlcIixcIm50alwiLFwibnRrXCIsXCJudG1cIixcIm50b1wiLFwibnRwXCIsXCJudHJcIixcIm50c1wiLFwibnR1XCIsXCJudHdcIixcIm50eFwiLFwibnR5XCIsXCJudHpcIixcIm51YVwiLFwibnViXCIsXCJudWNcIixcIm51ZFwiLFwibnVlXCIsXCJudWZcIixcIm51Z1wiLFwibnVoXCIsXCJudWlcIixcIm51alwiLFwibnVrXCIsXCJudWxcIixcIm51bVwiLFwibnVuXCIsXCJudW9cIixcIm51cFwiLFwibnVxXCIsXCJudXJcIixcIm51c1wiLFwibnV0XCIsXCJudXVcIixcIm51dlwiLFwibnV3XCIsXCJudXhcIixcIm51eVwiLFwibnV6XCIsXCJudmhcIixcIm52bVwiLFwibnZvXCIsXCJud2FcIixcIm53YlwiLFwibndjXCIsXCJud2VcIixcIm53Z1wiLFwibndpXCIsXCJud21cIixcIm53b1wiLFwibndyXCIsXCJud3hcIixcIm53eVwiLFwibnhhXCIsXCJueGRcIixcIm54ZVwiLFwibnhnXCIsXCJueGlcIixcIm54a1wiLFwibnhsXCIsXCJueG1cIixcIm54blwiLFwibnhvXCIsXCJueHFcIixcIm54clwiLFwibnh1XCIsXCJueHhcIixcIm55YlwiLFwibnljXCIsXCJueWRcIixcIm55ZVwiLFwibnlmXCIsXCJueWdcIixcIm55aFwiLFwibnlpXCIsXCJueWpcIixcIm55a1wiLFwibnlsXCIsXCJueW1cIixcIm55blwiLFwibnlvXCIsXCJueXBcIixcIm55cVwiLFwibnlyXCIsXCJueXNcIixcIm55dFwiLFwibnl1XCIsXCJueXZcIixcIm55d1wiLFwibnl4XCIsXCJueXlcIixcIm56YVwiLFwibnpiXCIsXCJuemRcIixcIm56aVwiLFwibnprXCIsXCJuem1cIixcIm56c1wiLFwibnp1XCIsXCJuenlcIixcIm56elwiXVxuLFsgXCJvY1wiLFwib2pcIixcIm9tXCIsXCJvclwiLFwib3NcIixcIm9hYVwiLFwib2FjXCIsXCJvYXJcIixcIm9hdlwiLFwib2JpXCIsXCJvYmtcIixcIm9ibFwiLFwib2JtXCIsXCJvYm9cIixcIm9iclwiLFwib2J0XCIsXCJvYnVcIixcIm9jYVwiLFwib2NoXCIsXCJvY21cIixcIm9jb1wiLFwib2N1XCIsXCJvZGFcIixcIm9ka1wiLFwib2R0XCIsXCJvZHVcIixcIm9mb1wiLFwib2ZzXCIsXCJvZnVcIixcIm9nYlwiLFwib2djXCIsXCJvZ2VcIixcIm9nZ1wiLFwib2dvXCIsXCJvZ3VcIixcIm9odFwiLFwib2h1XCIsXCJvaWFcIixcIm9pblwiLFwib2piXCIsXCJvamNcIixcIm9qZ1wiLFwib2pwXCIsXCJvanNcIixcIm9qdlwiLFwib2p3XCIsXCJva2FcIixcIm9rYlwiLFwib2tjXCIsXCJva2RcIixcIm9rZVwiLFwib2tnXCIsXCJva2hcIixcIm9raVwiLFwib2tqXCIsXCJva2tcIixcIm9rbFwiLFwib2ttXCIsXCJva25cIixcIm9rb1wiLFwib2tyXCIsXCJva3NcIixcIm9rdVwiLFwib2t2XCIsXCJva3hcIixcIm9relwiLFwib2xhXCIsXCJvbGRcIixcIm9sZVwiLFwib2xrXCIsXCJvbG1cIixcIm9sb1wiLFwib2xyXCIsXCJvbHRcIixcIm9sdVwiLFwib21hXCIsXCJvbWJcIixcIm9tY1wiLFwib21lXCIsXCJvbWdcIixcIm9taVwiLFwib21rXCIsXCJvbWxcIixcIm9tblwiLFwib21vXCIsXCJvbXBcIixcIm9tcVwiLFwib21yXCIsXCJvbXRcIixcIm9tdVwiLFwib212XCIsXCJvbXdcIixcIm9teFwiLFwib215XCIsXCJvbmFcIixcIm9uYlwiLFwib25lXCIsXCJvbmdcIixcIm9uaVwiLFwib25qXCIsXCJvbmtcIixcIm9ublwiLFwib25vXCIsXCJvbnBcIixcIm9uclwiLFwib25zXCIsXCJvbnRcIixcIm9udVwiLFwib253XCIsXCJvbnhcIixcIm9vZFwiLFwib29nXCIsXCJvb25cIixcIm9vclwiLFwib29zXCIsXCJvcGFcIixcIm9wa1wiLFwib3BtXCIsXCJvcG9cIixcIm9wdFwiLFwib3B5XCIsXCJvcmFcIixcIm9yY1wiLFwib3JlXCIsXCJvcmdcIixcIm9yaFwiLFwib3JuXCIsXCJvcm9cIixcIm9yclwiLFwib3JzXCIsXCJvcnRcIixcIm9ydVwiLFwib3J2XCIsXCJvcndcIixcIm9yeFwiLFwib3J5XCIsXCJvcnpcIixcIm9zYVwiLFwib3NjXCIsXCJvc2lcIixcIm9zblwiLFwib3NvXCIsXCJvc3BcIixcIm9zdFwiLFwib3N1XCIsXCJvc3hcIixcIm90YVwiLFwib3RiXCIsXCJvdGRcIixcIm90ZVwiLFwib3RpXCIsXCJvdGtcIixcIm90bFwiLFwib3RtXCIsXCJvdG5cIixcIm90b1wiLFwib3RxXCIsXCJvdHJcIixcIm90c1wiLFwib3R0XCIsXCJvdHVcIixcIm90d1wiLFwib3R4XCIsXCJvdHlcIixcIm90elwiLFwib3VhXCIsXCJvdWJcIixcIm91ZVwiLFwib3VpXCIsXCJvdW1cIixcIm91blwiLFwib3ZkXCIsXCJvd2lcIixcIm93bFwiLFwib3liXCIsXCJveWRcIixcIm95bVwiLFwib3l5XCIsXCJvem1cIl1cbixbIFwicGFcIixcInBpXCIsXCJwbFwiLFwicHNcIixcInB0XCIsXCJwYWFcIixcInBhYlwiLFwicGFjXCIsXCJwYWRcIixcInBhZVwiLFwicGFmXCIsXCJwYWdcIixcInBhaFwiLFwicGFpXCIsXCJwYWtcIixcInBhbFwiLFwicGFtXCIsXCJwYW9cIixcInBhcFwiLFwicGFxXCIsXCJwYXJcIixcInBhc1wiLFwicGF0XCIsXCJwYXVcIixcInBhdlwiLFwicGF3XCIsXCJwYXhcIixcInBheVwiLFwicGF6XCIsXCJwYmJcIixcInBiY1wiLFwicGJlXCIsXCJwYmZcIixcInBiZ1wiLFwicGJoXCIsXCJwYmlcIixcInBibFwiLFwicGJtXCIsXCJwYm5cIixcInBib1wiLFwicGJwXCIsXCJwYnJcIixcInBic1wiLFwicGJ0XCIsXCJwYnVcIixcInBidlwiLFwicGJ5XCIsXCJwYnpcIixcInBjYVwiLFwicGNiXCIsXCJwY2NcIixcInBjZFwiLFwicGNlXCIsXCJwY2ZcIixcInBjZ1wiLFwicGNoXCIsXCJwY2lcIixcInBjalwiLFwicGNrXCIsXCJwY2xcIixcInBjbVwiLFwicGNuXCIsXCJwY3BcIixcInBjclwiLFwicGN3XCIsXCJwZGFcIixcInBkY1wiLFwicGRpXCIsXCJwZG5cIixcInBkb1wiLFwicGR0XCIsXCJwZHVcIixcInBlYVwiLFwicGViXCIsXCJwZWRcIixcInBlZVwiLFwicGVmXCIsXCJwZWdcIixcInBlaFwiLFwicGVpXCIsXCJwZWpcIixcInBla1wiLFwicGVsXCIsXCJwZW1cIixcInBlb1wiLFwicGVwXCIsXCJwZXFcIixcInBlc1wiLFwicGV2XCIsXCJwZXhcIixcInBleVwiLFwicGV6XCIsXCJwZmFcIixcInBmZVwiLFwicGZsXCIsXCJwZ2FcIixcInBnZFwiLFwicGdnXCIsXCJwZ2lcIixcInBna1wiLFwicGdsXCIsXCJwZ25cIixcInBnc1wiLFwicGd1XCIsXCJwZ3lcIixcInBnelwiLFwicGhhXCIsXCJwaGRcIixcInBoZ1wiLFwicGhoXCIsXCJwaGlcIixcInBoa1wiLFwicGhsXCIsXCJwaG1cIixcInBoblwiLFwicGhvXCIsXCJwaHFcIixcInBoclwiLFwicGh0XCIsXCJwaHVcIixcInBodlwiLFwicGh3XCIsXCJwaWFcIixcInBpYlwiLFwicGljXCIsXCJwaWRcIixcInBpZVwiLFwicGlmXCIsXCJwaWdcIixcInBpaFwiLFwicGlpXCIsXCJwaWpcIixcInBpbFwiLFwicGltXCIsXCJwaW5cIixcInBpb1wiLFwicGlwXCIsXCJwaXJcIixcInBpc1wiLFwicGl0XCIsXCJwaXVcIixcInBpdlwiLFwicGl3XCIsXCJwaXhcIixcInBpeVwiLFwicGl6XCIsXCJwanRcIixcInBrYVwiLFwicGtiXCIsXCJwa2NcIixcInBrZ1wiLFwicGtoXCIsXCJwa25cIixcInBrb1wiLFwicGtwXCIsXCJwa3JcIixcInBrc1wiLFwicGt0XCIsXCJwa3VcIixcInBsYVwiLFwicGxiXCIsXCJwbGNcIixcInBsZFwiLFwicGxlXCIsXCJwbGZcIixcInBsZ1wiLFwicGxoXCIsXCJwbGpcIixcInBsa1wiLFwicGxsXCIsXCJwbG5cIixcInBsb1wiLFwicGxwXCIsXCJwbHFcIixcInBsclwiLFwicGxzXCIsXCJwbHRcIixcInBsdVwiLFwicGx2XCIsXCJwbHdcIixcInBseVwiLFwicGx6XCIsXCJwbWFcIixcInBtYlwiLFwicG1jXCIsXCJwbWRcIixcInBtZVwiLFwicG1mXCIsXCJwbWhcIixcInBtaVwiLFwicG1qXCIsXCJwbWtcIixcInBtbFwiLFwicG1tXCIsXCJwbW5cIixcInBtb1wiLFwicG1xXCIsXCJwbXJcIixcInBtc1wiLFwicG10XCIsXCJwbXVcIixcInBtd1wiLFwicG14XCIsXCJwbXlcIixcInBtelwiLFwicG5hXCIsXCJwbmJcIixcInBuY1wiLFwicG5kXCIsXCJwbmVcIixcInBuZ1wiLFwicG5oXCIsXCJwbmlcIixcInBualwiLFwicG5rXCIsXCJwbmxcIixcInBubVwiLFwicG5uXCIsXCJwbm9cIixcInBucFwiLFwicG5xXCIsXCJwbnJcIixcInBuc1wiLFwicG50XCIsXCJwbnVcIixcInBudlwiLFwicG53XCIsXCJwbnhcIixcInBueVwiLFwicG56XCIsXCJwb2NcIixcInBvZFwiLFwicG9lXCIsXCJwb2ZcIixcInBvZ1wiLFwicG9oXCIsXCJwb2lcIixcInBva1wiLFwicG9tXCIsXCJwb25cIixcInBvb1wiLFwicG9wXCIsXCJwb3FcIixcInBvc1wiLFwicG90XCIsXCJwb3ZcIixcInBvd1wiLFwicG94XCIsXCJwb3lcIixcInBvelwiLFwicHBhXCIsXCJwcGVcIixcInBwaVwiLFwicHBrXCIsXCJwcGxcIixcInBwbVwiLFwicHBuXCIsXCJwcG9cIixcInBwcFwiLFwicHBxXCIsXCJwcHJcIixcInBwc1wiLFwicHB0XCIsXCJwcHVcIixcInBxYVwiLFwicHFlXCIsXCJwcW1cIixcInBxd1wiLFwicHJhXCIsXCJwcmJcIixcInByY1wiLFwicHJkXCIsXCJwcmVcIixcInByZlwiLFwicHJnXCIsXCJwcmhcIixcInByaVwiLFwicHJrXCIsXCJwcmxcIixcInBybVwiLFwicHJuXCIsXCJwcm9cIixcInBycFwiLFwicHJxXCIsXCJwcnJcIixcInByc1wiLFwicHJ0XCIsXCJwcnVcIixcInByd1wiLFwicHJ4XCIsXCJwcnlcIixcInByelwiLFwicHNhXCIsXCJwc2NcIixcInBzZFwiLFwicHNlXCIsXCJwc2dcIixcInBzaFwiLFwicHNpXCIsXCJwc2xcIixcInBzbVwiLFwicHNuXCIsXCJwc29cIixcInBzcFwiLFwicHNxXCIsXCJwc3JcIixcInBzc1wiLFwicHN0XCIsXCJwc3VcIixcInBzd1wiLFwicHN5XCIsXCJwdGFcIixcInB0aFwiLFwicHRpXCIsXCJwdG5cIixcInB0b1wiLFwicHRwXCIsXCJwdHFcIixcInB0clwiLFwicHR0XCIsXCJwdHVcIixcInB0dlwiLFwicHR3XCIsXCJwdHlcIixcInB1YVwiLFwicHViXCIsXCJwdWNcIixcInB1ZFwiLFwicHVlXCIsXCJwdWZcIixcInB1Z1wiLFwicHVpXCIsXCJwdWpcIixcInB1a1wiLFwicHVtXCIsXCJwdW9cIixcInB1cFwiLFwicHVxXCIsXCJwdXJcIixcInB1dFwiLFwicHV1XCIsXCJwdXdcIixcInB1eFwiLFwicHV5XCIsXCJwdXpcIixcInB3YVwiLFwicHdiXCIsXCJwd2dcIixcInB3aVwiLFwicHdtXCIsXCJwd25cIixcInB3b1wiLFwicHdyXCIsXCJwd3dcIixcInB4bVwiLFwicHllXCIsXCJweW1cIixcInB5blwiLFwicHlzXCIsXCJweXVcIixcInB5eFwiLFwicHl5XCIsXCJwem5cIl1cbixbIFwicXVcIixcInF1YVwiLFwicXViXCIsXCJxdWNcIixcInF1ZFwiLFwicXVmXCIsXCJxdWdcIixcInF1aFwiLFwicXVpXCIsXCJxdWtcIixcInF1bFwiLFwicXVtXCIsXCJxdW5cIixcInF1cFwiLFwicXVxXCIsXCJxdXJcIixcInF1c1wiLFwicXV2XCIsXCJxdXdcIixcInF1eFwiLFwicXV5XCIsXCJxdXpcIixcInF2YVwiLFwicXZjXCIsXCJxdmVcIixcInF2aFwiLFwicXZpXCIsXCJxdmpcIixcInF2bFwiLFwicXZtXCIsXCJxdm5cIixcInF2b1wiLFwicXZwXCIsXCJxdnNcIixcInF2d1wiLFwicXZ5XCIsXCJxdnpcIixcInF3YVwiLFwicXdjXCIsXCJxd2VcIixcInF3aFwiLFwicXdtXCIsXCJxd3NcIixcInF3dFwiLFwicXhhXCIsXCJxeGNcIixcInF4aFwiLFwicXhsXCIsXCJxeG5cIixcInF4b1wiLFwicXhwXCIsXCJxeHFcIixcInF4clwiLFwicXhzXCIsXCJxeHRcIixcInF4dVwiLFwicXh3XCIsXCJxeWFcIixcInF5cFwiXVxuLFsgXCJybVwiLFwicm5cIixcInJvXCIsXCJydVwiLFwicndcIixcInJhYVwiLFwicmFiXCIsXCJyYWNcIixcInJhZFwiLFwicmFmXCIsXCJyYWdcIixcInJhaFwiLFwicmFpXCIsXCJyYWpcIixcInJha1wiLFwicmFsXCIsXCJyYW1cIixcInJhblwiLFwicmFvXCIsXCJyYXBcIixcInJhcVwiLFwicmFyXCIsXCJyYXNcIixcInJhdFwiLFwicmF1XCIsXCJyYXZcIixcInJhd1wiLFwicmF4XCIsXCJyYXlcIixcInJhelwiLFwicmJiXCIsXCJyYmtcIixcInJibFwiLFwicmJwXCIsXCJyY2ZcIixcInJkYlwiLFwicmVhXCIsXCJyZWJcIixcInJlZVwiLFwicmVnXCIsXCJyZWlcIixcInJlalwiLFwicmVsXCIsXCJyZW1cIixcInJlblwiLFwicmVyXCIsXCJyZXNcIixcInJldFwiLFwicmV5XCIsXCJyZ2FcIixcInJnZVwiLFwicmdrXCIsXCJyZ25cIixcInJnclwiLFwicmdzXCIsXCJyZ3VcIixcInJoZ1wiLFwicmhwXCIsXCJyaWFcIixcInJpZVwiLFwicmlmXCIsXCJyaWxcIixcInJpbVwiLFwicmluXCIsXCJyaXJcIixcInJpdFwiLFwicml1XCIsXCJyamdcIixcInJqaVwiLFwicmpzXCIsXCJya2FcIixcInJrYlwiLFwicmtoXCIsXCJya2lcIixcInJrbVwiLFwicmt0XCIsXCJya3dcIixcInJtYVwiLFwicm1iXCIsXCJybWNcIixcInJtZFwiLFwicm1lXCIsXCJybWZcIixcInJtZ1wiLFwicm1oXCIsXCJybWlcIixcInJta1wiLFwicm1sXCIsXCJybW1cIixcInJtblwiLFwicm1vXCIsXCJybXBcIixcInJtcVwiLFwicm1yXCIsXCJybXNcIixcInJtdFwiLFwicm11XCIsXCJybXZcIixcInJtd1wiLFwicm14XCIsXCJybXlcIixcInJtelwiLFwicm5hXCIsXCJybmRcIixcInJuZ1wiLFwicm5sXCIsXCJybm5cIixcInJucFwiLFwicm5yXCIsXCJybndcIixcInJvYVwiLFwicm9iXCIsXCJyb2NcIixcInJvZFwiLFwicm9lXCIsXCJyb2ZcIixcInJvZ1wiLFwicm9sXCIsXCJyb21cIixcInJvb1wiLFwicm9wXCIsXCJyb3JcIixcInJvdVwiLFwicm93XCIsXCJycG5cIixcInJwdFwiLFwicnJpXCIsXCJycm9cIixcInJydFwiLFwicnNiXCIsXCJyc2lcIixcInJzbFwiLFwicnNtXCIsXCJydGNcIixcInJ0aFwiLFwicnRtXCIsXCJydHNcIixcInJ0d1wiLFwicnViXCIsXCJydWNcIixcInJ1ZVwiLFwicnVmXCIsXCJydWdcIixcInJ1aFwiLFwicnVpXCIsXCJydWtcIixcInJ1b1wiLFwicnVwXCIsXCJydXFcIixcInJ1dFwiLFwicnV1XCIsXCJydXlcIixcInJ1elwiLFwicndhXCIsXCJyd2tcIixcInJ3bFwiLFwicndtXCIsXCJyd29cIixcInJ3clwiLFwicnhkXCIsXCJyeHdcIixcInJ5blwiLFwicnlzXCIsXCJyeXVcIixcInJ6aFwiXVxuLFsgXCJzYVwiLFwic2NcIixcInNkXCIsXCJzZVwiLFwic2dcIixcInNoXCIsXCJzaVwiLFwic2tcIixcInNsXCIsXCJzbVwiLFwic25cIixcInNvXCIsXCJzcVwiLFwic3JcIixcInNzXCIsXCJzdFwiLFwic3VcIixcInN2XCIsXCJzd1wiLFwic2FhXCIsXCJzYWJcIixcInNhY1wiLFwic2FkXCIsXCJzYWVcIixcInNhZlwiLFwic2FoXCIsXCJzYWlcIixcInNhalwiLFwic2FrXCIsXCJzYWxcIixcInNhbVwiLFwic2FvXCIsXCJzYXBcIixcInNhcVwiLFwic2FyXCIsXCJzYXNcIixcInNhdFwiLFwic2F1XCIsXCJzYXZcIixcInNhd1wiLFwic2F4XCIsXCJzYXlcIixcInNhelwiLFwic2JhXCIsXCJzYmJcIixcInNiY1wiLFwic2JkXCIsXCJzYmVcIixcInNiZlwiLFwic2JnXCIsXCJzYmhcIixcInNiaVwiLFwic2JqXCIsXCJzYmtcIixcInNibFwiLFwic2JtXCIsXCJzYm5cIixcInNib1wiLFwic2JwXCIsXCJzYnFcIixcInNiclwiLFwic2JzXCIsXCJzYnRcIixcInNidVwiLFwic2J2XCIsXCJzYndcIixcInNieFwiLFwic2J5XCIsXCJzYnpcIixcInNjYVwiLFwic2NiXCIsXCJzY2VcIixcInNjZlwiLFwic2NnXCIsXCJzY2hcIixcInNjaVwiLFwic2NrXCIsXCJzY2xcIixcInNjblwiLFwic2NvXCIsXCJzY3BcIixcInNjcVwiLFwic2NzXCIsXCJzY3RcIixcInNjdVwiLFwic2N2XCIsXCJzY3dcIixcInNjeFwiLFwic2RhXCIsXCJzZGJcIixcInNkY1wiLFwic2RlXCIsXCJzZGZcIixcInNkZ1wiLFwic2RoXCIsXCJzZGpcIixcInNka1wiLFwic2RsXCIsXCJzZG1cIixcInNkblwiLFwic2RvXCIsXCJzZHBcIixcInNkcVwiLFwic2RyXCIsXCJzZHNcIixcInNkdFwiLFwic2R1XCIsXCJzZHZcIixcInNkeFwiLFwic2R6XCIsXCJzZWFcIixcInNlYlwiLFwic2VjXCIsXCJzZWRcIixcInNlZVwiLFwic2VmXCIsXCJzZWdcIixcInNlaFwiLFwic2VpXCIsXCJzZWpcIixcInNla1wiLFwic2VsXCIsXCJzZW1cIixcInNlblwiLFwic2VvXCIsXCJzZXBcIixcInNlcVwiLFwic2VyXCIsXCJzZXNcIixcInNldFwiLFwic2V1XCIsXCJzZXZcIixcInNld1wiLFwic2V5XCIsXCJzZXpcIixcInNmYlwiLFwic2ZlXCIsXCJzZm1cIixcInNmc1wiLFwic2Z3XCIsXCJzZ2FcIixcInNnYlwiLFwic2djXCIsXCJzZ2RcIixcInNnZVwiLFwic2dnXCIsXCJzZ2hcIixcInNnaVwiLFwic2dqXCIsXCJzZ2tcIixcInNnbFwiLFwic2dtXCIsXCJzZ25cIixcInNnb1wiLFwic2dwXCIsXCJzZ3JcIixcInNnc1wiLFwic2d0XCIsXCJzZ3VcIixcInNnd1wiLFwic2d4XCIsXCJzZ3lcIixcInNnelwiLFwic2hhXCIsXCJzaGJcIixcInNoY1wiLFwic2hkXCIsXCJzaGVcIixcInNoZ1wiLFwic2hoXCIsXCJzaGlcIixcInNoalwiLFwic2hrXCIsXCJzaGxcIixcInNobVwiLFwic2huXCIsXCJzaG9cIixcInNocFwiLFwic2hxXCIsXCJzaHJcIixcInNoc1wiLFwic2h0XCIsXCJzaHVcIixcInNodlwiLFwic2h3XCIsXCJzaHhcIixcInNoeVwiLFwic2h6XCIsXCJzaWFcIixcInNpYlwiLFwic2lkXCIsXCJzaWVcIixcInNpZlwiLFwic2lnXCIsXCJzaWhcIixcInNpaVwiLFwic2lqXCIsXCJzaWtcIixcInNpbFwiLFwic2ltXCIsXCJzaW9cIixcInNpcFwiLFwic2lxXCIsXCJzaXJcIixcInNpc1wiLFwic2l0XCIsXCJzaXVcIixcInNpdlwiLFwic2l3XCIsXCJzaXhcIixcInNpeVwiLFwic2l6XCIsXCJzamFcIixcInNqYlwiLFwic2pkXCIsXCJzamVcIixcInNqZ1wiLFwic2prXCIsXCJzamxcIixcInNqbVwiLFwic2puXCIsXCJzam9cIixcInNqcFwiLFwic2pyXCIsXCJzanNcIixcInNqdFwiLFwic2p1XCIsXCJzandcIixcInNrYVwiLFwic2tiXCIsXCJza2NcIixcInNrZFwiLFwic2tlXCIsXCJza2ZcIixcInNrZ1wiLFwic2toXCIsXCJza2lcIixcInNralwiLFwic2trXCIsXCJza21cIixcInNrblwiLFwic2tvXCIsXCJza3BcIixcInNrcVwiLFwic2tyXCIsXCJza3NcIixcInNrdFwiLFwic2t1XCIsXCJza3ZcIixcInNrd1wiLFwic2t4XCIsXCJza3lcIixcInNrelwiLFwic2xhXCIsXCJzbGNcIixcInNsZFwiLFwic2xlXCIsXCJzbGZcIixcInNsZ1wiLFwic2xoXCIsXCJzbGlcIixcInNsalwiLFwic2xsXCIsXCJzbG1cIixcInNsblwiLFwic2xwXCIsXCJzbHFcIixcInNsclwiLFwic2xzXCIsXCJzbHRcIixcInNsdVwiLFwic2x3XCIsXCJzbHhcIixcInNseVwiLFwic2x6XCIsXCJzbWFcIixcInNtYlwiLFwic21jXCIsXCJzbWRcIixcInNtZlwiLFwic21nXCIsXCJzbWhcIixcInNtaVwiLFwic21qXCIsXCJzbWtcIixcInNtbFwiLFwic21tXCIsXCJzbW5cIixcInNtcFwiLFwic21xXCIsXCJzbXJcIixcInNtc1wiLFwic210XCIsXCJzbXVcIixcInNtdlwiLFwic213XCIsXCJzbXhcIixcInNteVwiLFwic216XCIsXCJzbmJcIixcInNuY1wiLFwic25lXCIsXCJzbmZcIixcInNuZ1wiLFwic25oXCIsXCJzbmlcIixcInNualwiLFwic25rXCIsXCJzbmxcIixcInNubVwiLFwic25uXCIsXCJzbm9cIixcInNucFwiLFwic25xXCIsXCJzbnJcIixcInNuc1wiLFwic251XCIsXCJzbnZcIixcInNud1wiLFwic254XCIsXCJzbnlcIixcInNuelwiLFwic29hXCIsXCJzb2JcIixcInNvY1wiLFwic29kXCIsXCJzb2VcIixcInNvZ1wiLFwic29oXCIsXCJzb2lcIixcInNvalwiLFwic29rXCIsXCJzb2xcIixcInNvblwiLFwic29vXCIsXCJzb3BcIixcInNvcVwiLFwic29yXCIsXCJzb3NcIixcInNvdVwiLFwic292XCIsXCJzb3dcIixcInNveFwiLFwic295XCIsXCJzb3pcIixcInNwYlwiLFwic3BjXCIsXCJzcGRcIixcInNwZVwiLFwic3BnXCIsXCJzcGlcIixcInNwa1wiLFwic3BsXCIsXCJzcG1cIixcInNwblwiLFwic3BvXCIsXCJzcHBcIixcInNwcVwiLFwic3ByXCIsXCJzcHNcIixcInNwdFwiLFwic3B1XCIsXCJzcHZcIixcInNweFwiLFwic3B5XCIsXCJzcWFcIixcInNxaFwiLFwic3FqXCIsXCJzcWtcIixcInNxbVwiLFwic3FuXCIsXCJzcW9cIixcInNxcVwiLFwic3FyXCIsXCJzcXNcIixcInNxdFwiLFwic3F1XCIsXCJzcXhcIixcInNyYVwiLFwic3JiXCIsXCJzcmNcIixcInNyZVwiLFwic3JmXCIsXCJzcmdcIixcInNyaFwiLFwic3JpXCIsXCJzcmtcIixcInNybFwiLFwic3JtXCIsXCJzcm5cIixcInNyb1wiLFwic3JxXCIsXCJzcnJcIixcInNyc1wiLFwic3J0XCIsXCJzcnVcIixcInNydlwiLFwic3J3XCIsXCJzcnhcIixcInNyeVwiLFwic3J6XCIsXCJzc2FcIixcInNzYlwiLFwic3NjXCIsXCJzc2RcIixcInNzZVwiLFwic3NmXCIsXCJzc2dcIixcInNzaFwiLFwic3NpXCIsXCJzc2pcIixcInNza1wiLFwic3NsXCIsXCJzc21cIixcInNzblwiLFwic3NvXCIsXCJzc3BcIixcInNzcVwiLFwic3NyXCIsXCJzc3NcIixcInNzdFwiLFwic3N1XCIsXCJzc3ZcIixcInNzeFwiLFwic3N5XCIsXCJzc3pcIixcInN0YVwiLFwic3RiXCIsXCJzdGRcIixcInN0ZVwiLFwic3RmXCIsXCJzdGdcIixcInN0aFwiLFwic3RpXCIsXCJzdGpcIixcInN0a1wiLFwic3RsXCIsXCJzdG1cIixcInN0blwiLFwic3RvXCIsXCJzdHBcIixcInN0cVwiLFwic3RyXCIsXCJzdHNcIixcInN0dFwiLFwic3R1XCIsXCJzdHZcIixcInN0d1wiLFwic3R5XCIsXCJzdWFcIixcInN1YlwiLFwic3VjXCIsXCJzdWVcIixcInN1Z1wiLFwic3VpXCIsXCJzdWpcIixcInN1a1wiLFwic3VsXCIsXCJzdW1cIixcInN1b1wiLFwic3VxXCIsXCJzdXJcIixcInN1c1wiLFwic3V0XCIsXCJzdXZcIixcInN1d1wiLFwic3V4XCIsXCJzdXlcIixcInN1elwiLFwic3ZhXCIsXCJzdmJcIixcInN2Y1wiLFwic3ZlXCIsXCJzdmtcIixcInN2bVwiLFwic3ZyXCIsXCJzdnNcIixcInN2eFwiLFwic3diXCIsXCJzd2NcIixcInN3ZlwiLFwic3dnXCIsXCJzd2hcIixcInN3aVwiLFwic3dqXCIsXCJzd2tcIixcInN3bFwiLFwic3dtXCIsXCJzd25cIixcInN3b1wiLFwic3dwXCIsXCJzd3FcIixcInN3clwiLFwic3dzXCIsXCJzd3RcIixcInN3dVwiLFwic3d2XCIsXCJzd3dcIixcInN3eFwiLFwic3d5XCIsXCJzeGJcIixcInN4Y1wiLFwic3hlXCIsXCJzeGdcIixcInN4a1wiLFwic3hsXCIsXCJzeG1cIixcInN4blwiLFwic3hvXCIsXCJzeHJcIixcInN4c1wiLFwic3h1XCIsXCJzeHdcIixcInN5YVwiLFwic3liXCIsXCJzeWNcIixcInN5ZFwiLFwic3lpXCIsXCJzeWtcIixcInN5bFwiLFwic3ltXCIsXCJzeW5cIixcInN5b1wiLFwic3lyXCIsXCJzeXNcIixcInN5d1wiLFwic3l4XCIsXCJzeXlcIixcInN6YVwiLFwic3piXCIsXCJzemNcIixcInN6ZFwiLFwic3plXCIsXCJzemdcIixcInN6bFwiLFwic3puXCIsXCJzenBcIixcInN6c1wiLFwic3p2XCIsXCJzendcIixcInN6eVwiXVxuLFsgXCJ0YVwiLFwidGVcIixcInRnXCIsXCJ0aFwiLFwidGlcIixcInRrXCIsXCJ0bFwiLFwidG5cIixcInRvXCIsXCJ0clwiLFwidHNcIixcInR0XCIsXCJ0d1wiLFwidHlcIixcInRhYVwiLFwidGFiXCIsXCJ0YWNcIixcInRhZFwiLFwidGFlXCIsXCJ0YWZcIixcInRhZ1wiLFwidGFpXCIsXCJ0YWpcIixcInRha1wiLFwidGFsXCIsXCJ0YW5cIixcInRhb1wiLFwidGFwXCIsXCJ0YXFcIixcInRhclwiLFwidGFzXCIsXCJ0YXVcIixcInRhdlwiLFwidGF3XCIsXCJ0YXhcIixcInRheVwiLFwidGF6XCIsXCJ0YmFcIixcInRiYlwiLFwidGJjXCIsXCJ0YmRcIixcInRiZVwiLFwidGJmXCIsXCJ0YmdcIixcInRiaFwiLFwidGJpXCIsXCJ0YmpcIixcInRia1wiLFwidGJsXCIsXCJ0Ym1cIixcInRiblwiLFwidGJvXCIsXCJ0YnBcIixcInRicVwiLFwidGJyXCIsXCJ0YnNcIixcInRidFwiLFwidGJ1XCIsXCJ0YnZcIixcInRid1wiLFwidGJ4XCIsXCJ0YnlcIixcInRielwiLFwidGNhXCIsXCJ0Y2JcIixcInRjY1wiLFwidGNkXCIsXCJ0Y2VcIixcInRjZlwiLFwidGNnXCIsXCJ0Y2hcIixcInRjaVwiLFwidGNrXCIsXCJ0Y2xcIixcInRjbVwiLFwidGNuXCIsXCJ0Y29cIixcInRjcFwiLFwidGNxXCIsXCJ0Y3NcIixcInRjdFwiLFwidGN1XCIsXCJ0Y3dcIixcInRjeFwiLFwidGN5XCIsXCJ0Y3pcIixcInRkYVwiLFwidGRiXCIsXCJ0ZGNcIixcInRkZFwiLFwidGRlXCIsXCJ0ZGZcIixcInRkZ1wiLFwidGRoXCIsXCJ0ZGlcIixcInRkalwiLFwidGRrXCIsXCJ0ZGxcIixcInRkbVwiLFwidGRuXCIsXCJ0ZG9cIixcInRkcVwiLFwidGRyXCIsXCJ0ZHNcIixcInRkdFwiLFwidGR1XCIsXCJ0ZHZcIixcInRkeFwiLFwidGR5XCIsXCJ0ZWFcIixcInRlYlwiLFwidGVjXCIsXCJ0ZWRcIixcInRlZVwiLFwidGVmXCIsXCJ0ZWdcIixcInRlaFwiLFwidGVpXCIsXCJ0ZWtcIixcInRlbVwiLFwidGVuXCIsXCJ0ZW9cIixcInRlcFwiLFwidGVxXCIsXCJ0ZXJcIixcInRlc1wiLFwidGV0XCIsXCJ0ZXVcIixcInRldlwiLFwidGV3XCIsXCJ0ZXhcIixcInRleVwiLFwidGV6XCIsXCJ0ZmlcIixcInRmblwiLFwidGZvXCIsXCJ0ZnJcIixcInRmdFwiLFwidGdhXCIsXCJ0Z2JcIixcInRnY1wiLFwidGdkXCIsXCJ0Z2VcIixcInRnZlwiLFwidGdnXCIsXCJ0Z2hcIixcInRnaVwiLFwidGdqXCIsXCJ0Z25cIixcInRnb1wiLFwidGdwXCIsXCJ0Z3FcIixcInRnclwiLFwidGdzXCIsXCJ0Z3RcIixcInRndVwiLFwidGd2XCIsXCJ0Z3dcIixcInRneFwiLFwidGd5XCIsXCJ0Z3pcIixcInRoY1wiLFwidGhkXCIsXCJ0aGVcIixcInRoZlwiLFwidGhoXCIsXCJ0aGlcIixcInRoa1wiLFwidGhsXCIsXCJ0aG1cIixcInRoblwiLFwidGhwXCIsXCJ0aHFcIixcInRoclwiLFwidGhzXCIsXCJ0aHRcIixcInRodVwiLFwidGh2XCIsXCJ0aHdcIixcInRoeFwiLFwidGh5XCIsXCJ0aHpcIixcInRpYVwiLFwidGljXCIsXCJ0aWRcIixcInRpZVwiLFwidGlmXCIsXCJ0aWdcIixcInRpaFwiLFwidGlpXCIsXCJ0aWpcIixcInRpa1wiLFwidGlsXCIsXCJ0aW1cIixcInRpblwiLFwidGlvXCIsXCJ0aXBcIixcInRpcVwiLFwidGlzXCIsXCJ0aXRcIixcInRpdVwiLFwidGl2XCIsXCJ0aXdcIixcInRpeFwiLFwidGl5XCIsXCJ0aXpcIixcInRqYVwiLFwidGpnXCIsXCJ0amlcIixcInRqalwiLFwidGpsXCIsXCJ0am1cIixcInRqblwiLFwidGpvXCIsXCJ0anBcIixcInRqc1wiLFwidGp1XCIsXCJ0andcIixcInRrYVwiLFwidGtiXCIsXCJ0a2RcIixcInRrZVwiLFwidGtmXCIsXCJ0a2dcIixcInRra1wiLFwidGtsXCIsXCJ0a21cIixcInRrblwiLFwidGtwXCIsXCJ0a3FcIixcInRrclwiLFwidGtzXCIsXCJ0a3RcIixcInRrdVwiLFwidGt2XCIsXCJ0a3dcIixcInRreFwiLFwidGt6XCIsXCJ0bGFcIixcInRsYlwiLFwidGxjXCIsXCJ0bGRcIixcInRsZlwiLFwidGxnXCIsXCJ0bGhcIixcInRsaVwiLFwidGxqXCIsXCJ0bGtcIixcInRsbFwiLFwidGxtXCIsXCJ0bG5cIixcInRsb1wiLFwidGxwXCIsXCJ0bHFcIixcInRsclwiLFwidGxzXCIsXCJ0bHRcIixcInRsdVwiLFwidGx2XCIsXCJ0bHdcIixcInRseFwiLFwidGx5XCIsXCJ0bWFcIixcInRtYlwiLFwidG1jXCIsXCJ0bWRcIixcInRtZVwiLFwidG1mXCIsXCJ0bWdcIixcInRtaFwiLFwidG1pXCIsXCJ0bWpcIixcInRta1wiLFwidG1sXCIsXCJ0bW1cIixcInRtblwiLFwidG1vXCIsXCJ0bXBcIixcInRtcVwiLFwidG1yXCIsXCJ0bXNcIixcInRtdFwiLFwidG11XCIsXCJ0bXZcIixcInRtd1wiLFwidG15XCIsXCJ0bXpcIixcInRuYVwiLFwidG5iXCIsXCJ0bmNcIixcInRuZFwiLFwidG5lXCIsXCJ0bmZcIixcInRuZ1wiLFwidG5oXCIsXCJ0bmlcIixcInRua1wiLFwidG5sXCIsXCJ0bm1cIixcInRublwiLFwidG5vXCIsXCJ0bnBcIixcInRucVwiLFwidG5yXCIsXCJ0bnNcIixcInRudFwiLFwidG51XCIsXCJ0bnZcIixcInRud1wiLFwidG54XCIsXCJ0bnlcIixcInRuelwiLFwidG9iXCIsXCJ0b2NcIixcInRvZFwiLFwidG9lXCIsXCJ0b2ZcIixcInRvZ1wiLFwidG9oXCIsXCJ0b2lcIixcInRvalwiLFwidG9sXCIsXCJ0b21cIixcInRvb1wiLFwidG9wXCIsXCJ0b3FcIixcInRvclwiLFwidG9zXCIsXCJ0b3VcIixcInRvdlwiLFwidG93XCIsXCJ0b3hcIixcInRveVwiLFwidG96XCIsXCJ0cGFcIixcInRwY1wiLFwidHBlXCIsXCJ0cGZcIixcInRwZ1wiLFwidHBpXCIsXCJ0cGpcIixcInRwa1wiLFwidHBsXCIsXCJ0cG1cIixcInRwblwiLFwidHBvXCIsXCJ0cHBcIixcInRwcVwiLFwidHByXCIsXCJ0cHRcIixcInRwdVwiLFwidHB2XCIsXCJ0cHdcIixcInRweFwiLFwidHB5XCIsXCJ0cHpcIixcInRxYlwiLFwidHFsXCIsXCJ0cW1cIixcInRxblwiLFwidHFvXCIsXCJ0cXBcIixcInRxcVwiLFwidHFyXCIsXCJ0cXRcIixcInRxdVwiLFwidHF3XCIsXCJ0cmFcIixcInRyYlwiLFwidHJjXCIsXCJ0cmRcIixcInRyZVwiLFwidHJmXCIsXCJ0cmdcIixcInRyaFwiLFwidHJpXCIsXCJ0cmpcIixcInRya1wiLFwidHJsXCIsXCJ0cm1cIixcInRyblwiLFwidHJvXCIsXCJ0cnBcIixcInRycVwiLFwidHJyXCIsXCJ0cnNcIixcInRydFwiLFwidHJ1XCIsXCJ0cnZcIixcInRyd1wiLFwidHJ4XCIsXCJ0cnlcIixcInRyelwiLFwidHNhXCIsXCJ0c2JcIixcInRzY1wiLFwidHNkXCIsXCJ0c2VcIixcInRzZlwiLFwidHNnXCIsXCJ0c2hcIixcInRzaVwiLFwidHNqXCIsXCJ0c2tcIixcInRzbFwiLFwidHNtXCIsXCJ0c3BcIixcInRzcVwiLFwidHNyXCIsXCJ0c3NcIixcInRzdFwiLFwidHN1XCIsXCJ0c3ZcIixcInRzd1wiLFwidHN4XCIsXCJ0c3lcIixcInRzelwiLFwidHRhXCIsXCJ0dGJcIixcInR0Y1wiLFwidHRkXCIsXCJ0dGVcIixcInR0ZlwiLFwidHRnXCIsXCJ0dGhcIixcInR0aVwiLFwidHRqXCIsXCJ0dGtcIixcInR0bFwiLFwidHRtXCIsXCJ0dG5cIixcInR0b1wiLFwidHRwXCIsXCJ0dHFcIixcInR0clwiLFwidHRzXCIsXCJ0dHRcIixcInR0dVwiLFwidHR2XCIsXCJ0dHdcIixcInR0eVwiLFwidHR6XCIsXCJ0dWFcIixcInR1YlwiLFwidHVjXCIsXCJ0dWRcIixcInR1ZVwiLFwidHVmXCIsXCJ0dWdcIixcInR1aFwiLFwidHVpXCIsXCJ0dWpcIixcInR1bFwiLFwidHVtXCIsXCJ0dW5cIixcInR1b1wiLFwidHVwXCIsXCJ0dXFcIixcInR1c1wiLFwidHV0XCIsXCJ0dXVcIixcInR1dlwiLFwidHV3XCIsXCJ0dXhcIixcInR1eVwiLFwidHV6XCIsXCJ0dmFcIixcInR2ZFwiLFwidHZlXCIsXCJ0dmtcIixcInR2bFwiLFwidHZtXCIsXCJ0dm5cIixcInR2b1wiLFwidHZzXCIsXCJ0dnRcIixcInR2dVwiLFwidHZ3XCIsXCJ0dnhcIixcInR2eVwiLFwidHdhXCIsXCJ0d2JcIixcInR3Y1wiLFwidHdkXCIsXCJ0d2VcIixcInR3ZlwiLFwidHdnXCIsXCJ0d2hcIixcInR3bFwiLFwidHdtXCIsXCJ0d25cIixcInR3b1wiLFwidHdwXCIsXCJ0d3FcIixcInR3clwiLFwidHd0XCIsXCJ0d3VcIixcInR3d1wiLFwidHd4XCIsXCJ0d3lcIixcInR4YVwiLFwidHhiXCIsXCJ0eGNcIixcInR4ZVwiLFwidHhnXCIsXCJ0eGhcIixcInR4aVwiLFwidHhqXCIsXCJ0eG1cIixcInR4blwiLFwidHhvXCIsXCJ0eHFcIixcInR4clwiLFwidHhzXCIsXCJ0eHRcIixcInR4dVwiLFwidHh4XCIsXCJ0eHlcIixcInR5YVwiLFwidHllXCIsXCJ0eWhcIixcInR5aVwiLFwidHlqXCIsXCJ0eWxcIixcInR5blwiLFwidHlwXCIsXCJ0eXJcIixcInR5c1wiLFwidHl0XCIsXCJ0eXVcIixcInR5dlwiLFwidHl4XCIsXCJ0eXlcIixcInR5elwiLFwidHphXCIsXCJ0emhcIixcInR6alwiLFwidHpsXCIsXCJ0em1cIixcInR6blwiLFwidHpvXCIsXCJ0enhcIl1cbixbIFwidWdcIixcInVrXCIsXCJ1clwiLFwidXpcIixcInVhbVwiLFwidWFuXCIsXCJ1YXJcIixcInViYVwiLFwidWJpXCIsXCJ1YmxcIixcInViclwiLFwidWJ1XCIsXCJ1YnlcIixcInVkYVwiLFwidWRlXCIsXCJ1ZGdcIixcInVkaVwiLFwidWRqXCIsXCJ1ZGxcIixcInVkbVwiLFwidWR1XCIsXCJ1ZXNcIixcInVmaVwiLFwidWdhXCIsXCJ1Z2JcIixcInVnZVwiLFwidWduXCIsXCJ1Z29cIixcInVneVwiLFwidWhhXCIsXCJ1aG5cIixcInVpc1wiLFwidWl2XCIsXCJ1amlcIixcInVrYVwiLFwidWtnXCIsXCJ1a2hcIixcInVraVwiLFwidWtrXCIsXCJ1a2xcIixcInVrcFwiLFwidWtxXCIsXCJ1a3NcIixcInVrdVwiLFwidWt2XCIsXCJ1a3dcIixcInVreVwiLFwidWxhXCIsXCJ1bGJcIixcInVsY1wiLFwidWxlXCIsXCJ1bGZcIixcInVsaVwiLFwidWxrXCIsXCJ1bGxcIixcInVsbVwiLFwidWxuXCIsXCJ1bHVcIixcInVsd1wiLFwidW1hXCIsXCJ1bWJcIixcInVtY1wiLFwidW1kXCIsXCJ1bWdcIixcInVtaVwiLFwidW1tXCIsXCJ1bW5cIixcInVtb1wiLFwidW1wXCIsXCJ1bXJcIixcInVtc1wiLFwidW11XCIsXCJ1bmFcIixcInVuZFwiLFwidW5lXCIsXCJ1bmdcIixcInVuaVwiLFwidW5rXCIsXCJ1bm1cIixcInVublwiLFwidW5wXCIsXCJ1bnJcIixcInVudVwiLFwidW54XCIsXCJ1bnpcIixcInVva1wiLFwidXBpXCIsXCJ1cHZcIixcInVyYVwiLFwidXJiXCIsXCJ1cmNcIixcInVyZVwiLFwidXJmXCIsXCJ1cmdcIixcInVyaFwiLFwidXJpXCIsXCJ1cmpcIixcInVya1wiLFwidXJsXCIsXCJ1cm1cIixcInVyblwiLFwidXJvXCIsXCJ1cnBcIixcInVyclwiLFwidXJ0XCIsXCJ1cnVcIixcInVydlwiLFwidXJ3XCIsXCJ1cnhcIixcInVyeVwiLFwidXJ6XCIsXCJ1c2FcIixcInVzaFwiLFwidXNpXCIsXCJ1c2tcIixcInVzcFwiLFwidXNzXCIsXCJ1c3VcIixcInV0YVwiLFwidXRlXCIsXCJ1dGhcIixcInV0cFwiLFwidXRyXCIsXCJ1dHVcIixcInV1bVwiLFwidXVuXCIsXCJ1dXJcIixcInV1dVwiLFwidXZlXCIsXCJ1dmhcIixcInV2bFwiLFwidXdhXCIsXCJ1eWFcIixcInV6blwiLFwidXpzXCJdXG4sWyBcInZlXCIsXCJ2aVwiLFwidm9cIixcInZhYVwiLFwidmFlXCIsXCJ2YWZcIixcInZhZ1wiLFwidmFoXCIsXCJ2YWlcIixcInZhalwiLFwidmFsXCIsXCJ2YW1cIixcInZhblwiLFwidmFvXCIsXCJ2YXBcIixcInZhclwiLFwidmFzXCIsXCJ2YXVcIixcInZhdlwiLFwidmF5XCIsXCJ2YmJcIixcInZia1wiLFwidmVjXCIsXCJ2ZWRcIixcInZlbFwiLFwidmVtXCIsXCJ2ZW9cIixcInZlcFwiLFwidmVyXCIsXCJ2Z3JcIixcInZndFwiLFwidmljXCIsXCJ2aWRcIixcInZpZlwiLFwidmlnXCIsXCJ2aWxcIixcInZpblwiLFwidmlzXCIsXCJ2aXRcIixcInZpdlwiLFwidmthXCIsXCJ2a2lcIixcInZralwiLFwidmtrXCIsXCJ2a2xcIixcInZrbVwiLFwidmtuXCIsXCJ2a29cIixcInZrcFwiLFwidmt0XCIsXCJ2a3VcIixcInZrelwiLFwidmxwXCIsXCJ2bHNcIixcInZtYVwiLFwidm1iXCIsXCJ2bWNcIixcInZtZFwiLFwidm1lXCIsXCJ2bWZcIixcInZtZ1wiLFwidm1oXCIsXCJ2bWlcIixcInZtalwiLFwidm1rXCIsXCJ2bWxcIixcInZtbVwiLFwidm1wXCIsXCJ2bXFcIixcInZtclwiLFwidm1zXCIsXCJ2bXVcIixcInZtdlwiLFwidm13XCIsXCJ2bXhcIixcInZteVwiLFwidm16XCIsXCJ2bmtcIixcInZubVwiLFwidm5wXCIsXCJ2b3JcIixcInZvdFwiLFwidnJhXCIsXCJ2cm9cIixcInZyc1wiLFwidnJ0XCIsXCJ2c2lcIixcInZzbFwiLFwidnN2XCIsXCJ2dG9cIixcInZ1bVwiLFwidnVuXCIsXCJ2dXRcIixcInZ3YVwiXVxuLFsgXCJ3YVwiLFwid29cIixcIndhYVwiLFwid2FiXCIsXCJ3YWNcIixcIndhZFwiLFwid2FlXCIsXCJ3YWZcIixcIndhZ1wiLFwid2FoXCIsXCJ3YWlcIixcIndhalwiLFwid2FrXCIsXCJ3YWxcIixcIndhbVwiLFwid2FuXCIsXCJ3YW9cIixcIndhcFwiLFwid2FxXCIsXCJ3YXJcIixcIndhc1wiLFwid2F0XCIsXCJ3YXVcIixcIndhdlwiLFwid2F3XCIsXCJ3YXhcIixcIndheVwiLFwid2F6XCIsXCJ3YmFcIixcIndiYlwiLFwid2JlXCIsXCJ3YmZcIixcIndiaFwiLFwid2JpXCIsXCJ3YmpcIixcIndia1wiLFwid2JsXCIsXCJ3Ym1cIixcIndicFwiLFwid2JxXCIsXCJ3YnJcIixcIndic1wiLFwid2J0XCIsXCJ3YnZcIixcIndid1wiLFwid2NhXCIsXCJ3Y2lcIixcIndkZFwiLFwid2RnXCIsXCJ3ZGpcIixcIndka1wiLFwid2R1XCIsXCJ3ZHlcIixcIndlYVwiLFwid2VjXCIsXCJ3ZWRcIixcIndlZ1wiLFwid2VoXCIsXCJ3ZWlcIixcIndlbVwiLFwid2VuXCIsXCJ3ZW9cIixcIndlcFwiLFwid2VyXCIsXCJ3ZXNcIixcIndldFwiLFwid2V1XCIsXCJ3ZXdcIixcIndmZ1wiLFwid2dhXCIsXCJ3Z2JcIixcIndnZ1wiLFwid2dpXCIsXCJ3Z29cIixcIndndVwiLFwid2d3XCIsXCJ3Z3lcIixcIndoYVwiLFwid2hnXCIsXCJ3aGtcIixcIndodVwiLFwid2liXCIsXCJ3aWNcIixcIndpZVwiLFwid2lmXCIsXCJ3aWdcIixcIndpaFwiLFwid2lpXCIsXCJ3aWpcIixcIndpa1wiLFwid2lsXCIsXCJ3aW1cIixcIndpblwiLFwid2lyXCIsXCJ3aXRcIixcIndpdVwiLFwid2l2XCIsXCJ3aXdcIixcIndpeVwiLFwid2phXCIsXCJ3amlcIixcIndrYVwiLFwid2tiXCIsXCJ3a2RcIixcIndrbFwiLFwid2tyXCIsXCJ3a3VcIixcIndrd1wiLFwid2t5XCIsXCJ3bGFcIixcIndsY1wiLFwid2xlXCIsXCJ3bGdcIixcIndsaFwiLFwid2xpXCIsXCJ3bGtcIixcIndsbFwiLFwid2xtXCIsXCJ3bG9cIixcIndsclwiLFwid2xzXCIsXCJ3bHVcIixcIndsdlwiLFwid2x3XCIsXCJ3bHhcIixcIndseVwiLFwid21hXCIsXCJ3bWJcIixcIndtY1wiLFwid21kXCIsXCJ3bWVcIixcIndtZ1wiLFwid21oXCIsXCJ3bWlcIixcIndtbVwiLFwid21uXCIsXCJ3bW9cIixcIndtc1wiLFwid210XCIsXCJ3bXdcIixcIndteFwiLFwid25iXCIsXCJ3bmNcIixcInduZFwiLFwid25lXCIsXCJ3bmdcIixcInduaVwiLFwid25rXCIsXCJ3bm1cIixcIndublwiLFwid25vXCIsXCJ3bnBcIixcIndudVwiLFwid253XCIsXCJ3bnlcIixcIndvYVwiLFwid29iXCIsXCJ3b2NcIixcIndvZFwiLFwid29lXCIsXCJ3b2ZcIixcIndvZ1wiLFwid29pXCIsXCJ3b2tcIixcIndvbVwiLFwid29uXCIsXCJ3b29cIixcIndvclwiLFwid29zXCIsXCJ3b3dcIixcIndveVwiLFwid3BjXCIsXCJ3cmFcIixcIndyYlwiLFwid3JkXCIsXCJ3cmdcIixcIndyaFwiLFwid3JpXCIsXCJ3cmtcIixcIndybFwiLFwid3JtXCIsXCJ3cm5cIixcIndyb1wiLFwid3JwXCIsXCJ3cnJcIixcIndyc1wiLFwid3J1XCIsXCJ3cnZcIixcIndyd1wiLFwid3J4XCIsXCJ3cnlcIixcIndyelwiLFwid3NhXCIsXCJ3c2dcIixcIndzaVwiLFwid3NrXCIsXCJ3c3JcIixcIndzc1wiLFwid3N1XCIsXCJ3c3ZcIixcInd0ZlwiLFwid3RoXCIsXCJ3dGlcIixcInd0a1wiLFwid3RtXCIsXCJ3dHdcIixcInd1YVwiLFwid3ViXCIsXCJ3dWRcIixcInd1aFwiLFwid3VsXCIsXCJ3dW1cIixcInd1blwiLFwid3VyXCIsXCJ3dXRcIixcInd1dVwiLFwid3V2XCIsXCJ3dXhcIixcInd1eVwiLFwid3dhXCIsXCJ3d2JcIixcInd3b1wiLFwid3dyXCIsXCJ3d3dcIixcInd4YVwiLFwid3h3XCIsXCJ3eWFcIixcInd5YlwiLFwid3lpXCIsXCJ3eW1cIixcInd5clwiLFwid3l5XCJdXG4sWyBcInhoXCIsXCJ4YWFcIixcInhhYlwiLFwieGFjXCIsXCJ4YWRcIixcInhhZVwiLFwieGFnXCIsXCJ4YWlcIixcInhhalwiLFwieGFrXCIsXCJ4YWxcIixcInhhbVwiLFwieGFuXCIsXCJ4YW9cIixcInhhcFwiLFwieGFxXCIsXCJ4YXJcIixcInhhc1wiLFwieGF0XCIsXCJ4YXVcIixcInhhdlwiLFwieGF3XCIsXCJ4YXlcIixcInhiYVwiLFwieGJiXCIsXCJ4YmNcIixcInhiZFwiLFwieGJlXCIsXCJ4YmdcIixcInhiaVwiLFwieGJqXCIsXCJ4Ym1cIixcInhiblwiLFwieGJvXCIsXCJ4YnBcIixcInhiclwiLFwieGJ3XCIsXCJ4YnhcIixcInhieVwiLFwieGNiXCIsXCJ4Y2NcIixcInhjZVwiLFwieGNnXCIsXCJ4Y2hcIixcInhjbFwiLFwieGNtXCIsXCJ4Y25cIixcInhjb1wiLFwieGNyXCIsXCJ4Y3RcIixcInhjdVwiLFwieGN2XCIsXCJ4Y3dcIixcInhjeVwiLFwieGRhXCIsXCJ4ZGNcIixcInhka1wiLFwieGRtXCIsXCJ4ZG9cIixcInhkeVwiLFwieGViXCIsXCJ4ZWRcIixcInhlZ1wiLFwieGVsXCIsXCJ4ZW1cIixcInhlcFwiLFwieGVyXCIsXCJ4ZXNcIixcInhldFwiLFwieGV1XCIsXCJ4ZmFcIixcInhnYVwiLFwieGdiXCIsXCJ4Z2RcIixcInhnZlwiLFwieGdnXCIsXCJ4Z2lcIixcInhnbFwiLFwieGdtXCIsXCJ4Z25cIixcInhnclwiLFwieGd1XCIsXCJ4Z3dcIixcInhoYVwiLFwieGhjXCIsXCJ4aGRcIixcInhoZVwiLFwieGhyXCIsXCJ4aHRcIixcInhodVwiLFwieGh2XCIsXCJ4aWFcIixcInhpYlwiLFwieGlpXCIsXCJ4aWxcIixcInhpblwiLFwieGlwXCIsXCJ4aXJcIixcInhpc1wiLFwieGl2XCIsXCJ4aXlcIixcInhqYlwiLFwieGp0XCIsXCJ4a2FcIixcInhrYlwiLFwieGtjXCIsXCJ4a2RcIixcInhrZVwiLFwieGtmXCIsXCJ4a2dcIixcInhraFwiLFwieGtpXCIsXCJ4a2pcIixcInhra1wiLFwieGtsXCIsXCJ4a25cIixcInhrb1wiLFwieGtwXCIsXCJ4a3FcIixcInhrclwiLFwieGtzXCIsXCJ4a3RcIixcInhrdVwiLFwieGt2XCIsXCJ4a3dcIixcInhreFwiLFwieGt5XCIsXCJ4a3pcIixcInhsYVwiLFwieGxiXCIsXCJ4bGNcIixcInhsZFwiLFwieGxlXCIsXCJ4bGdcIixcInhsaVwiLFwieGxuXCIsXCJ4bG9cIixcInhscFwiLFwieGxzXCIsXCJ4bHVcIixcInhseVwiLFwieG1hXCIsXCJ4bWJcIixcInhtY1wiLFwieG1kXCIsXCJ4bWVcIixcInhtZlwiLFwieG1nXCIsXCJ4bWhcIixcInhtalwiLFwieG1rXCIsXCJ4bWxcIixcInhtbVwiLFwieG1uXCIsXCJ4bW9cIixcInhtcFwiLFwieG1xXCIsXCJ4bXJcIixcInhtc1wiLFwieG10XCIsXCJ4bXVcIixcInhtdlwiLFwieG13XCIsXCJ4bXhcIixcInhteVwiLFwieG16XCIsXCJ4bmFcIixcInhuYlwiLFwieG5kXCIsXCJ4bmdcIixcInhuaFwiLFwieG5pXCIsXCJ4bmpcIixcInhua1wiLFwieG5tXCIsXCJ4bm5cIixcInhub1wiLFwieG5xXCIsXCJ4bnJcIixcInhuc1wiLFwieG50XCIsXCJ4bnVcIixcInhueVwiLFwieG56XCIsXCJ4b2NcIixcInhvZFwiLFwieG9nXCIsXCJ4b2lcIixcInhva1wiLFwieG9tXCIsXCJ4b25cIixcInhvb1wiLFwieG9wXCIsXCJ4b3JcIixcInhvd1wiLFwieHBhXCIsXCJ4cGJcIixcInhwY1wiLFwieHBkXCIsXCJ4cGVcIixcInhwZlwiLFwieHBnXCIsXCJ4cGhcIixcInhwaVwiLFwieHBqXCIsXCJ4cGtcIixcInhwbFwiLFwieHBtXCIsXCJ4cG5cIixcInhwb1wiLFwieHBwXCIsXCJ4cHFcIixcInhwclwiLFwieHBzXCIsXCJ4cHRcIixcInhwdVwiLFwieHB2XCIsXCJ4cHdcIixcInhweFwiLFwieHB5XCIsXCJ4cHpcIixcInhxYVwiLFwieHF0XCIsXCJ4cmFcIixcInhyYlwiLFwieHJkXCIsXCJ4cmVcIixcInhyZ1wiLFwieHJpXCIsXCJ4cm1cIixcInhyblwiLFwieHJxXCIsXCJ4cnJcIixcInhydFwiLFwieHJ1XCIsXCJ4cndcIixcInhzYVwiLFwieHNiXCIsXCJ4c2NcIixcInhzZFwiLFwieHNlXCIsXCJ4c2hcIixcInhzaVwiLFwieHNqXCIsXCJ4c2xcIixcInhzbVwiLFwieHNuXCIsXCJ4c29cIixcInhzcFwiLFwieHNxXCIsXCJ4c3JcIixcInhzc1wiLFwieHN1XCIsXCJ4c3ZcIixcInhzeVwiLFwieHRhXCIsXCJ4dGJcIixcInh0Y1wiLFwieHRkXCIsXCJ4dGVcIixcInh0Z1wiLFwieHRoXCIsXCJ4dGlcIixcInh0alwiLFwieHRsXCIsXCJ4dG1cIixcInh0blwiLFwieHRvXCIsXCJ4dHBcIixcInh0cVwiLFwieHRyXCIsXCJ4dHNcIixcInh0dFwiLFwieHR1XCIsXCJ4dHZcIixcInh0d1wiLFwieHR5XCIsXCJ4dHpcIixcInh1YVwiLFwieHViXCIsXCJ4dWRcIixcInh1Z1wiLFwieHVqXCIsXCJ4dWxcIixcInh1bVwiLFwieHVuXCIsXCJ4dW9cIixcInh1cFwiLFwieHVyXCIsXCJ4dXRcIixcInh1dVwiLFwieHZlXCIsXCJ4dmlcIixcInh2blwiLFwieHZvXCIsXCJ4dnNcIixcInh3YVwiLFwieHdjXCIsXCJ4d2RcIixcInh3ZVwiLFwieHdnXCIsXCJ4d2pcIixcInh3a1wiLFwieHdsXCIsXCJ4d29cIixcInh3clwiLFwieHd0XCIsXCJ4d3dcIixcInh4YlwiLFwieHhrXCIsXCJ4eG1cIixcInh4clwiLFwieHh0XCIsXCJ4eWFcIixcInh5YlwiLFwieHlqXCIsXCJ4eWtcIixcInh5bFwiLFwieHl0XCIsXCJ4eXlcIixcInh6aFwiLFwieHptXCIsXCJ4enBcIl1cbixbIFwieWlcIixcInlvXCIsXCJ5YWFcIixcInlhYlwiLFwieWFjXCIsXCJ5YWRcIixcInlhZVwiLFwieWFmXCIsXCJ5YWdcIixcInlhaFwiLFwieWFpXCIsXCJ5YWpcIixcInlha1wiLFwieWFsXCIsXCJ5YW1cIixcInlhblwiLFwieWFvXCIsXCJ5YXBcIixcInlhcVwiLFwieWFyXCIsXCJ5YXNcIixcInlhdFwiLFwieWF1XCIsXCJ5YXZcIixcInlhd1wiLFwieWF4XCIsXCJ5YXlcIixcInlhelwiLFwieWJhXCIsXCJ5YmJcIixcInliZFwiLFwieWJlXCIsXCJ5YmhcIixcInliaVwiLFwieWJqXCIsXCJ5YmtcIixcInlibFwiLFwieWJtXCIsXCJ5Ym5cIixcInlib1wiLFwieWJ4XCIsXCJ5YnlcIixcInljaFwiLFwieWNsXCIsXCJ5Y25cIixcInljcFwiLFwieWRhXCIsXCJ5ZGRcIixcInlkZVwiLFwieWRnXCIsXCJ5ZGtcIixcInlkc1wiLFwieWVhXCIsXCJ5ZWNcIixcInllZVwiLFwieWVpXCIsXCJ5ZWpcIixcInllbFwiLFwieWVuXCIsXCJ5ZXJcIixcInllc1wiLFwieWV0XCIsXCJ5ZXVcIixcInlldlwiLFwieWV5XCIsXCJ5Z2FcIixcInlnaVwiLFwieWdsXCIsXCJ5Z21cIixcInlncFwiLFwieWdyXCIsXCJ5Z3NcIixcInlndVwiLFwieWd3XCIsXCJ5aGFcIixcInloZFwiLFwieWhsXCIsXCJ5aHNcIixcInlpYVwiLFwieWlmXCIsXCJ5aWdcIixcInlpaFwiLFwieWlpXCIsXCJ5aWpcIixcInlpa1wiLFwieWlsXCIsXCJ5aW1cIixcInlpblwiLFwieWlwXCIsXCJ5aXFcIixcInlpclwiLFwieWlzXCIsXCJ5aXRcIixcInlpdVwiLFwieWl2XCIsXCJ5aXhcIixcInlpeVwiLFwieWl6XCIsXCJ5a2FcIixcInlrZ1wiLFwieWtpXCIsXCJ5a2tcIixcInlrbFwiLFwieWttXCIsXCJ5a25cIixcInlrb1wiLFwieWtyXCIsXCJ5a3RcIixcInlrdVwiLFwieWt5XCIsXCJ5bGFcIixcInlsYlwiLFwieWxlXCIsXCJ5bGdcIixcInlsaVwiLFwieWxsXCIsXCJ5bG1cIixcInlsblwiLFwieWxvXCIsXCJ5bHJcIixcInlsdVwiLFwieWx5XCIsXCJ5bWFcIixcInltYlwiLFwieW1jXCIsXCJ5bWRcIixcInltZVwiLFwieW1nXCIsXCJ5bWhcIixcInltaVwiLFwieW1rXCIsXCJ5bWxcIixcInltbVwiLFwieW1uXCIsXCJ5bW9cIixcInltcFwiLFwieW1xXCIsXCJ5bXJcIixcInltc1wiLFwieW10XCIsXCJ5bXhcIixcInltelwiLFwieW5hXCIsXCJ5bmRcIixcInluZVwiLFwieW5nXCIsXCJ5bmhcIixcInlua1wiLFwieW5sXCIsXCJ5bm5cIixcInlub1wiLFwieW5xXCIsXCJ5bnNcIixcInludVwiLFwieW9iXCIsXCJ5b2dcIixcInlvaVwiLFwieW9rXCIsXCJ5b2xcIixcInlvbVwiLFwieW9uXCIsXCJ5b3NcIixcInlvdFwiLFwieW94XCIsXCJ5b3lcIixcInlwYVwiLFwieXBiXCIsXCJ5cGdcIixcInlwaFwiLFwieXBrXCIsXCJ5cG1cIixcInlwblwiLFwieXBvXCIsXCJ5cHBcIixcInlwelwiLFwieXJhXCIsXCJ5cmJcIixcInlyZVwiLFwieXJpXCIsXCJ5cmtcIixcInlybFwiLFwieXJtXCIsXCJ5cm5cIixcInlyb1wiLFwieXJzXCIsXCJ5cndcIixcInlyeVwiLFwieXNjXCIsXCJ5c2RcIixcInlzZ1wiLFwieXNsXCIsXCJ5c21cIixcInlzblwiLFwieXNvXCIsXCJ5c3BcIixcInlzclwiLFwieXNzXCIsXCJ5c3lcIixcInl0YVwiLFwieXRsXCIsXCJ5dHBcIixcInl0d1wiLFwieXR5XCIsXCJ5dWFcIixcInl1YlwiLFwieXVjXCIsXCJ5dWRcIixcInl1ZVwiLFwieXVmXCIsXCJ5dWdcIixcInl1aVwiLFwieXVqXCIsXCJ5dWtcIixcInl1bFwiLFwieXVtXCIsXCJ5dW5cIixcInl1cFwiLFwieXVxXCIsXCJ5dXJcIixcInl1dFwiLFwieXV1XCIsXCJ5dXdcIixcInl1eFwiLFwieXV5XCIsXCJ5dXpcIixcInl2YVwiLFwieXZ0XCIsXCJ5d2FcIixcInl3Z1wiLFwieXdsXCIsXCJ5d25cIixcInl3cVwiLFwieXdyXCIsXCJ5d3RcIixcInl3dVwiLFwieXd3XCIsXCJ5eGFcIixcInl4Z1wiLFwieXhsXCIsXCJ5eG1cIixcInl4dVwiLFwieXh5XCIsXCJ5eXJcIixcInl5dVwiLFwieXl6XCIsXCJ5emdcIixcInl6a1wiXVxuLFsgXCJ6YVwiLFwiemhcIixcInp1XCIsXCJ6YWFcIixcInphYlwiLFwiemFjXCIsXCJ6YWRcIixcInphZVwiLFwiemFmXCIsXCJ6YWdcIixcInphaFwiLFwiemFpXCIsXCJ6YWpcIixcInpha1wiLFwiemFsXCIsXCJ6YW1cIixcInphb1wiLFwiemFwXCIsXCJ6YXFcIixcInphclwiLFwiemFzXCIsXCJ6YXRcIixcInphdVwiLFwiemF2XCIsXCJ6YXdcIixcInpheFwiLFwiemF5XCIsXCJ6YXpcIixcInpiYVwiLFwiemJjXCIsXCJ6YmVcIixcInpibFwiLFwiemJ0XCIsXCJ6YnVcIixcInpid1wiLFwiemNhXCIsXCJ6Y2hcIixcInpkalwiLFwiemVhXCIsXCJ6ZWdcIixcInplaFwiLFwiemVuXCIsXCJ6Z2FcIixcInpnYlwiLFwiemdoXCIsXCJ6Z21cIixcInpnblwiLFwiemdyXCIsXCJ6aGJcIixcInpoZFwiLFwiemhpXCIsXCJ6aG5cIixcInpod1wiLFwiemh4XCIsXCJ6aWFcIixcInppYlwiLFwiemlrXCIsXCJ6aWxcIixcInppbVwiLFwiemluXCIsXCJ6aXJcIixcInppd1wiLFwieml6XCIsXCJ6a2FcIixcInprYlwiLFwiemtkXCIsXCJ6a2dcIixcInpraFwiLFwiemtrXCIsXCJ6a25cIixcInprb1wiLFwiemtwXCIsXCJ6a3JcIixcInprdFwiLFwiemt1XCIsXCJ6a3ZcIixcInprelwiLFwiemxhXCIsXCJ6bGVcIixcInpsalwiLFwiemxtXCIsXCJ6bG5cIixcInpscVwiLFwiemxzXCIsXCJ6bHdcIixcInptYVwiLFwiem1iXCIsXCJ6bWNcIixcInptZFwiLFwiem1lXCIsXCJ6bWZcIixcInptZ1wiLFwiem1oXCIsXCJ6bWlcIixcInptalwiLFwiem1rXCIsXCJ6bWxcIixcInptbVwiLFwiem1uXCIsXCJ6bW9cIixcInptcFwiLFwiem1xXCIsXCJ6bXJcIixcInptc1wiLFwiem10XCIsXCJ6bXVcIixcInptdlwiLFwiem13XCIsXCJ6bXhcIixcInpteVwiLFwiem16XCIsXCJ6bmFcIixcInpuZFwiLFwiem5lXCIsXCJ6bmdcIixcInpua1wiLFwiem5zXCIsXCJ6b2NcIixcInpvaFwiLFwiem9tXCIsXCJ6b29cIixcInpvcVwiLFwiem9yXCIsXCJ6b3NcIixcInpwYVwiLFwienBiXCIsXCJ6cGNcIixcInpwZFwiLFwienBlXCIsXCJ6cGZcIixcInpwZ1wiLFwienBoXCIsXCJ6cGlcIixcInpwalwiLFwienBrXCIsXCJ6cGxcIixcInpwbVwiLFwienBuXCIsXCJ6cG9cIixcInpwcFwiLFwienBxXCIsXCJ6cHJcIixcInpwc1wiLFwienB0XCIsXCJ6cHVcIixcInpwdlwiLFwienB3XCIsXCJ6cHhcIixcInpweVwiLFwienB6XCIsXCJ6cWVcIixcInpyYVwiLFwienJnXCIsXCJ6cm5cIixcInpyb1wiLFwienJwXCIsXCJ6cnNcIixcInpzYVwiLFwienNrXCIsXCJ6c2xcIixcInpzbVwiLFwienNyXCIsXCJ6c3VcIixcInp0ZVwiLFwienRnXCIsXCJ6dGxcIixcInp0bVwiLFwienRuXCIsXCJ6dHBcIixcInp0cVwiLFwienRzXCIsXCJ6dHRcIixcInp0dVwiLFwienR4XCIsXCJ6dHlcIixcInp1YVwiLFwienVoXCIsXCJ6dW1cIixcInp1blwiLFwienV5XCIsXCJ6d2FcIixcInp4eFwiLFwienliXCIsXCJ6eWdcIixcInp5alwiLFwienluXCIsXCJ6eXBcIixcInp6YVwiLFwienpqXCJdXG5dO1xuXG5cbmV4cG9ydCBjbGFzcyBMYW5nVXRpbCB7XG5cbiAgICAvKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgQkNQIDQ3IHN0cmluZyAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNCY3A0NyhsYW5nU3RyOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvXigoW2EtekEtWl17MiwzfSgtW2EtekEtWl0oLVthLXpBLVpdezN9KXswLDJ9KT98W2EtekEtWl17NH18W2EtekEtWl17NSw4fSkoLVthLXpBLVpdezR9KT8oLShbYS16QS1aXXsyfXxbMC05XXszfSkpPygtKFswLTlhLXpBLVpdezUsOH18WzAtOV1bYS16QS1aXXszfSkpKigtWzAtOWEtd3ktekEtV1ktWl0oLVthLXpBLVowLTldezIsOH0pKykqKC14KC1bYS16QS1aMC05XXsxLDh9KSspP3x4KC1bYS16QS1aMC05XXsxLDh9KSt8KGVuLUdCLW9lZHxpLWFtaXxpLWJubnxpLWRlZmF1bHR8aS1lbm9jaGlhbnxpLWhha3xpLWtsaW5nb258aS1sdXh8aS1taW5nb3xpLW5hdmFqb3xpLXB3bnxpLXRhb3xpLXRheXxpLXRzdXxzZ24tQkUtRlJ8c2duLUJFLU5MfHNnbi1DSC1ERXxhcnQtbG9qYmFufGNlbC1nYXVsaXNofG5vLWJva3xuby1ueW58emgtZ3VveXV8emgtaGFra2F8emgtbWlufHpoLW1pbi1uYW58emgteGlhbmcpKSQvLnRlc3QobGFuZ1N0cilcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5ID0gbGFuZ1N0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocHJpbWFyeS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkgPSBwcmltYXJ5LnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJpbWFyeS5tYXRjaCgvW2Etel17MiwzfS8pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcWFhLi5xdHpcbiAgICAgICAgaWYgKHByaW1hcnkubGVuZ3RoID09PSAzIFxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQXQoMCkgPT09IFwicVwiXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpIDw9IDExNlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA8PSAxMjIpIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRQcmltYXJ5TGFuZ3NbcHJpbWFyeS5jaGFyQ29kZUF0KDApLTk3XS5pbmNsdWRlcyhwcmltYXJ5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1hdGNoUHJpbWFyeUxhbmcobGFuZzE6IHN0cmluZywgbGFuZzI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeTEgPSBsYW5nMTtcbiAgICAgICAgaWYgKHByaW1hcnkxLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTEgPSBwcmltYXJ5MS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJpbWFyeTIgPSBsYW5nMjtcbiAgICAgICAgaWYgKHByaW1hcnkyLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeTIgPSBwcmltYXJ5Mi5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJpbWFyeTEudG9Mb3dlckNhc2UoKSA9PT0gcHJpbWFyeTIudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucywgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi8uLi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcyB9IGZyb20gXCIuLi8uLi8uLi8uLi92NC91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIFJQVFV0aWwge1xuXG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUoZWxlLCBhdHRyTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jaW50cm9zdGF0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJsaXN0Ym94XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsaXN0Ym94XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJsb2dcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnViYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNlcGFyYXRvclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgLy8gTm90IHN1cmUgaG93IHRvIGVuY29kZSBtaW4vbWF4IChvciBub3cgaW4gMS4yIC0gXCJoYXMgbm8gdmFsdWVcIilcbiAgICAgICAgICAgIC8vXCJhcmlhLXZhbHVlbm93XCI6IFwiMFwiIFRPRE86IGF0IHJpc2s6IG1heWJlIGRlbGV0ZSBhZnRlciBBUklBIDEuMiByZWFjaGVzIHByb3Bvc2VkIHJlY1xuICAgICAgICAgICAgLy8gUHJvYmFibHkganVzdCBkZWxldGUgc3BpbmJ1dHRvbiBmcm9tIHRoaXMgbGlzdCBjb21wbGV0ZWx5IGFuZCBsZXQgdXNlciBhZ2VudHMgaGFuZGxlIFwiZGVmYXVsdHNcIlxuICAgICAgICB9LFxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogXCJmYWxzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcInRyZWVcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jYXJpYS1hdG9taWNcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cyA9IHtcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJub25lXCIsXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IFwib2ZmXCIsXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjogXCJmYWxzZVwiLFxuICAgICAgICAvL1wiYXJpYS1yZWxldmFudFwiOiBcImFkZGl0aW9ucyB0ZXh0XCIsIFRPRE86IGFyZSBtdWx0aXBsZSB2YWx1ZXMgc3VwcG9ydGVkP1xuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtc29ydFwiOiBcIm5vbmVcIlxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2h0bWwtYXR0cmlidXRlLXN0YXRlLWFuZC1wcm9wZXJ0eS1tYXBwaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3MgPSB7XG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJmb3JtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWVudWl0ZW1cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiICsgZS5oYXNBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiKlwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImluZGV0ZXJtaW5hdGVcIikpIHJldHVybiBcIm1peGVkXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWVsZHNldFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0Z3JvdXBcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRpb25cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRpYWxvZ1wiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcIm9wZW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpKSByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZSBuYW1lIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMoZWxlbSkge1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGFyaWEgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJpYUF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgaHRtbCBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBodG1sIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGh0bWxBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyBcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW1wbGljaXQgYXJpYSBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUsIGFuIGlucHV0IHdpdGggY2hlY2tlZCBpcyBlcXVpdmFsZW50IHRvIGFyaWEtY2hlY2tlZD1cInRydWVcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgIGxldCByZXRWYWwgPSBlbGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmIHJldFZhbC50cmltKCkgPT09IFwiXCIpIHsgLy9cIlwiIGlzIHRyZWF0ZWQgYXMgZmFsc2UsIHNvIHdlIG5lZWQgcmV0dXJuIGl0IGJlZm9yZSB0aGUgYmVsb3cgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlbiBkZXRlcm1pbmUgaW1wbGljaXQgdmFsdWVzIGZyb20gb3RoZXIgYXR0cmlidXRlc1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHRhZyA9IGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBSUFRVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdW3RhZ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiKlwiIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXVtcIipcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayByb2xlLWJhc2VkIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGlsbCBub3QgZGVmaW5lZD8gQ2hlY2sgZ2xvYmFsIGRlZmF1bHRzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGF0dHJpYnV0ZU5hbWUgaW4gUlBUVXRpbC5hcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCIgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogdHJ1ZSxcbiAgICAgICAgXCJkaXZcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJyBcbiAgICAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JylbMF0sIGVsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vZGV0YWlscyBlbGVtZW50IHdpdGhvdXQgYSBkaXJlY3Qgc3VtbWFyeSBjaGlsZCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4gJiYgWy4uLmVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtPT5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKSA6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiAgc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBjaHJvbWUgYW5kIGZpcmVmb3hcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBSUFRVdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFJQVFV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiAgQnVnIHJlcG9ydHMgaGF2ZSBiZWVuIGFib3V0IHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMuXG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFcXVpdihub2RlLCBodG1sRXF1aXYpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChodG1sRXF1aXYuaW5kZXhPZihcImNoZWNrYm94XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbEVxdWl2LmluZGV4T2YoXCJyYWRpb1wiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gdHlwZSA9PT0gXCJyYWRpb1wiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBub3JtYWxpemVTcGFjaW5nKHMpIHtcbiAgICAgICAgcmV0dXJuIHMudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBub25FeGlzdGFudElEcyhub2RlLCB0YXJnZXRpZHMpIHtcbiAgICAgICAgbGV0IHJldHVybm5vdGZvdW5kaWRzID0gJyc7XG4gICAgICAgIGlmIChSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGFyZ2V0aWRzKS5sZW5ndGggPCAxKSByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG5cbiAgICAgICAgbGV0IHRhcmdldEFycmF5ID0gdGFyZ2V0aWRzLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHhwID0gXCIvLypbQGlkPSdcIiArIHRhcmdldEFycmF5W2ldICsgXCInXVwiO1xuICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBub2RlLCBkb2MuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm5ub3Rmb3VuZGlkcyArPSB0YXJnZXRBcnJheVtpXSArICcsICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhyZXR1cm5ub3Rmb3VuZGlkcykubGVuZ3RoID49IDIpXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9IHJldHVybm5vdGZvdW5kaWRzLnN1YnN0cmluZygwLCByZXR1cm5ub3Rmb3VuZGlkcy5sZW5ndGggLSAyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgcmV0dXJuIHJldHVybm5vdGZvdW5kaWRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RG9jRWxlbWVudHNCeVRhZyhlbGVtLCB0YWdOYW1lKSB7XG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKSBhcyBhbnk7XG4gICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVF9ET0NFTEVNU0JZVEFHXCIsIGNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVbdGFnTmFtZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWdIaWRkZW4ocGFyZW50RWxlbSwgdGFnTmFtZSwgaWdub3JlSGlkZGVuLCBjb25zaWRlckhpZGRlblNldHRpbmcpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnRFbGVtLmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHBhcmVudCB0byBidWlsZCBhIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0XG4gICAgICAgIC8vIG1hdGNoIHRoZSB0YWdOYW1lIHByb3ZpZGVkXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPSBudWxsKSB7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgY2hpbGRyZW4gaW50byB0aGUgcmV0dXJuIGFycmF5IGlmIHRoZXkgbWF0Y2ggd2l0aCB0YWduYW1lLlxuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRhZ05hbWUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWdub3JlaGlkZGVuIHdhcyBzZXQgdG8gdHJ1ZSwgdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVja1xuICAgICAgICAgICAgICAgIC8vIGFuZCBpbiB0aGUgY2FzZSB0aGUgbm9kZSBpcyBub3QgdmlzaWxibGUgd2UgbW9yZSB0byB0aGVzZXMgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIGNvdXBsZSBvZiBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuXG4gICAgICAgICAgICAgICAgLy8gIDEuIFdoZW4gaWdub3JlSGlkZGVuIGlzIHNldCB0byB0cnVlIHVwZnJvbnQsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGVcbiAgICAgICAgICAgICAgICAvLyAgMi4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLjEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgIC8vICAgICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICBpZiAoKGlnbm9yZUhpZGRlbiB8fCAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmICFSUFRVdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChjaGlsZCkpKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgbWF0Y2ggZ2l2ZW4gcm9sZXMocykuXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHkgd2lsbCBub3QgY29uc2lkZXIgaW1wbGljaXQgcm9sZXMuXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtkb2N1bWVudH0gZG9jIC0gVGhlIGRvY3VtZW50IG5vZGVcbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG1hdGNoZWQgdGhlIHJvbGUocykgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbihkb2MsIHJvbGVzLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIHJvbGUgdG8gZWxlbWVudCBhc3NvaWNhdGlvbiBpcyBhbHJlYWR5IG1hZGUsIGFuZCBhdmFpbGFibGUgaW4gdGhlIGdsb2JhbCBoYXNBdHRyaWJ1dGVcbiAgICAgICAgLy8gd2UgY2FuIGp1c3QgdXNlIHRoYXQgb25lIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBuZXcgb25lLlxuICAgICAgICBsZXQgcm9sZVRvRWxlbXMgPSBudWxsO1xuICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICByb2xlVG9FbGVtcyA9IGdldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIG51bGwpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyBCdWlsZCB0aGUgbmV3IHJvbGUgdG8gZWxlbWVudCwgdGhpcyBpcyB3aGVyZSB3ZSBsb29wIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBhbmQgZXh0cmFjdCBhbGwgdGhlXG4gICAgICAgIC8vIGVsZW1lbnRzIGJzYWVkIG9uIHJvbGVzLlxuICAgICAgICBpZiAocm9sZVRvRWxlbXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJlLWluaXRpYWxpemUgdGhlIHJvbGVUb0VsZW1zIGhhc2hcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0ge307XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgYm9keSBvZiB0aGUgZG9jXG4gICAgICAgICAgICBsZXQgcm9vdCA9IGRvYy5ib2R5O1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgYXJlIGF0IHRoZSB2ZXJ5IHBhcmVudCBub2RlIG9mIHRoZSBlbnRpcmUgcGFnZSwgc28gdGhhdCB3ZSBjYW4gbG9vcCB0aHJvdWdoXG4gICAgICAgICAgICAvLyBhbGwgdGhlIG5vZGVzLlxuICAgICAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICAgICAgcm9vdCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQnVpbGQgYSBub2Rld2FsdGVyIGJhc2VkIG9mIHRoZSByb290IG5vZGUsIHRoaXMgbm9kZSB3YWx0ZXIgd2lsbCBiZSB1c2UgbG9vcCBvdmVyIGFsbCB0aGUgbm9kZXNcbiAgICAgICAgICAgIC8vIGFuZCBidWlsZCB0aGUgcm9sZXMgdG8gRWxlbWVudCBjb3JhbGF0aW9uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihyb290KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBlbnRpcmUgZG9jL2xpc3Qgb2Ygbm9kZXMgdG8gYnVpbGQgdGhlIHJvbGUgdG8gZWxlbWVudCBtYXBcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBidWlsZCBhbiByb2xlVG9FbGVtcyBoYXNoIHdoaWNoIGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICAgICAgICAgICAgLy8gcm9sZVRvRWxlbXMgPSB7XG4gICAgICAgICAgICAvLyAgICBkb2N1bWVudDogW3tkaXZ9LHthYmJyfSx7dmFyfV0sXG4gICAgICAgICAgICAvLyAgICBtYWluOiBbe2Rpdn1dLFxuICAgICAgICAgICAgLy8gICAgbmF2aWdhdGlvbjogW3tkaXZ9XVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmVsZW0oKSkgY29udGludWU7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2hlY2sgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgdGhlIHJvbGUgYXR0cmlidXRlIGFzc2ljaWF0ZWQgdG8gdGhlbVxuICAgICAgICAgICAgICAgIGlmICghbncuYkVuZFRhZykge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgbm9kZSBoYXMgcm9sZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5lbGVtKCkgJiYgbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSByb2xlcyB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGlzIGVsZW1lbnQsIGNhbiBoYXZlIG11bHRpcGxlIHJvbGVzIG9uIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBzcGxpdCBieSBzcGFjZSwgc28gd2UgbmVlZCB0byBleHRyYWN0IGFsbCBvZiB0aGVtIGludG8gYW4gYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIHdSb2xlcy5sZW5ndGggPT09IDAgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcm9sZXMgYW5kIGFzc2lnbmVkIHRoaXMgbm9kZSB0byBhbGwgdGhlcyByb2xlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGUgcm9sZSBrZXkgaXMgbm90IGFscmVhZHkgaW4gdGhlIHJvbGVUb0VsZW1zIGhhc2gsIGNvbnN0cnVjdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUga2V5IGFuZCBhc3NpZ24gZW1wdHkgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh3Um9sZXNbaV0gaW4gcm9sZVRvRWxlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGFycmF5IGZvciB0aGUgcm9sZVxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXS5wdXNoKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJvbGVUb0VsZW1zIGhhc2ggbWFwIGFzIGEgZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFX0lNUExJQ0lUXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdXNlciBkZWZpbmVkIGVsZW1lbnQncyByb2xlcyBmcm9tIGRvbS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJvbGVzIC0gbGlzdCBvZiB1c2VyIGRlZmluZWQgcm9sZXMgaW4gdGhlIGVsZW1lbnQgcm9sZSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRSb2xlcyhlbGU6IEVsZW1lbnQpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRSb2xlcyhlbGUsIGZhbHNlKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyBlbGVtZW50J3Mgcm9sZXMuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGZpbmRzIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgYXR0cmlidXRlIHJvbGVzIGFuZCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb2xlcyhlbGU6IEVsZW1lbnQsIGNvbnNpZGVySW1wbGljaXRSb2xlczogYm9vbGVhbikgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vYWRkIGltcGxpY2l0IHJvbGVzIHRvIHRoZSBhdHRyaWJ1dGVzIHJvbGVzLlxuICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVtZW50XG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoZSBpbXBsaWNpdCByb2xlIG9yIFtdIGlmIGRvZXNuJ3QgZXhpc3RcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdFJvbGUoZWxlKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCFlbGUgfHwgZWxlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gW107XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgbnVsbCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gUlBUVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KGVsZSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhcImdlbmVyaWNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlICdnZW5lcmljJyByb2xlIGlzIG9ubHkgYWxsb3dlZCBpZiBhIHZhbGlkIGFyaWEgYXR0cmlidXRlIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbUFyaWFBdHRyaWJ1dGVzID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKGVsZSwgXCJSUFRVdGlsX0ltcGxpY2l0Um9sZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0dGVybiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1snZ2VuZXJpYyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5yZXFQcm9wcyAmJiBwYXR0ZXJuLnJlcVByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocGF0dGVybi5yZXFQcm9wcywgcm9sZUF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoQVJJQURlZmluaXRpb25zLmdsb2JhbFByb3BlcnRpZXMsIHJvbGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7IFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAnZ2VuZXJpYycgcm9sZSBpZiByb2xlQXR0cmlidXRlcyBkb2Vzbid0IGNvbnRhaW4gYW55IG9mIGRvbUFyaWFBdHRyaWJ1dGVzIFxuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCAmJiAhcm9sZUF0dHJpYnV0ZXMuc29tZShhdHRyPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgaW1wbGljaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0O1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0Um9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBvZiB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSB0aGUgcm9sZVxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcHJvcGVydGllcyAtIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgZWxlKSB7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0pIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxUHJvcHM7XG4gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHNlcGFyYXRvclxuICAgICAgICAgICAgaWYgKHJvbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBlbGUgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShlbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImFyaWEtdmFsdWVub3dcIl0sIHJlcXVpcmVkQXR0cmlidXRlcyB8fCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGlmIGEgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aCBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlICE9PSBudWxsICYmIGltcGxpY2l0Um9sZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGltcGxpY2l0Um9sZSwgd1JvbGVzKTtcbiAgICAgICAgICAgICAgICAvL2lmIHJvbGUgaXMgYXJyYXkgbG9vcCB0aHJ1IGFuZCBzZWUgaWYgYW55ICBvZiB0aGUgaW1wbGljaXQgcm9sZSBwcmVzZW50IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB3Um9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSByb2xlLCBpbmNsdWRpbmcgdGhlIGltcGxpZWQgcm9sZSBpZiByb2xlIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVwbGFjaW5nIHRoZSBoYXNSb2xlIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlSW5TZW1hbnRpY3MoZWxlLCByb2xlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvbGVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZVNwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvbGVTcGVjaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgbGV0IGltcFJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0FueVJvbGUoZWxlLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIGV4aXN0LlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGxldCBpbXBSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wUm9sZXMgIT09IG51bGwgJiYgaW1wUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RhdGFUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEoUlBUVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJub25lXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJSUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZVwiIGluIHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0YWJsZS5SUFRVdGlsX2lzQ29tcGxleERhdGFUYWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0NvbXBsZXhUYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0YWJsZSAmJiBSUFRVdGlsLmlzRGF0YVRhYmxlKHRhYmxlKSkge1xuXG4gICAgICAgICAgICBsZXQgdGhOb2RlcyA9IG51bGwsXG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJOb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdHJOb2RlQ291bnQgPSB0ck5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0ZE5vZGVDb3VudCA9IDAsXG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRyTm9kZXNIYXZpbmdPbmx5VGhOb2RlcyA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhaXNDb21wbGV4VGFibGUgJiYgaSA8IHRyTm9kZUNvdW50OyArK2kpIHtcblxuICAgICAgICAgICAgICAgIHRoTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIik7XG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IHRyTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0aE5vZGVDb3VudCA9IHRoTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRkTm9kZUNvdW50ID0gdGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGROb2RlQ291bnQgIT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdGQgZWxlbWVudCBhbmQgdHdvIG9yIG1vcmUgdGggZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGggZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGogPCB0aE5vZGVDb3VudDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IodGhOb2Rlc1tqXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ZCBlbGVtZW50IHdpdGggYSByb3dzcGFuIG9yIGNvbHNwYW4gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgaGVhZGVycyBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gdHdvIElEUkVGc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGsgPCB0ZE5vZGVDb3VudDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSAmJiBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGROb2Rlc1trXS5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKS5zcGxpdChcIiBcIikubGVuZ3RoID4gMikpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih0ZE5vZGVzW2tdLCBcInRhYmxlXCIpID09PSB0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9yIG1vcmUgdHIgZWxlbWVudHMgdGhhdCBjb250YWluIG9ubHkgdGggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoTm9kZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt0ck5vZGVzSGF2aW5nT25seVRoTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPT09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhlYWROb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhlYWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXNMZW5ndGggPSB0aGVhZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGVhZE5vZGVzTGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHRoZWFkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzTGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoZWFkIGVsZW1lbnQgdGhhdCBjb250YWlucyB0d28gb3IgbW9yZSB0ciBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoZWFkTm9kZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKS5sZW5ndGggPiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSAmJiB0ck5vZGVDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aE5vZGVDb3VudCA+IDAgJiYgIVJQVFV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLlJQVFV0aWxfaXNDb21wbGV4RGF0YVRhYmxlID0gaXNDb21wbGV4VGFibGU7XG5cbiAgICAgICAgcmV0dXJuIGlzQ29tcGxleFRhYmxlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGEgdGFibGUgY2VsbCBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dGQ+PC90ZD5cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVDZWxsRW1wdHkoY2VsbCkge1xuICAgICAgICBpZiAoIWNlbGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjZWxsKSB8fCBjZWxsLmlubmVySFRNTC5yZXBsYWNlKC8mbmJzcDsvZywnICcpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIHJvdyBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dHIgLz4gb3IgPHRyPjx0ZD48L3RkPjx0ZD48L3RkPjwvdHI+IFxuICAgIHB1YmxpYyBzdGF0aWMgaXNUYWJsZVJvd0VtcHR5KHJvdykge1xuICAgICAgICBpZiAoIXJvdyB8fCAhcm93LmNlbGxzIHx8IHJvdy5jZWxscy5sZW5ndGggPT09IDAgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShyb3cpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTsgLy9lbXB0eVxuICAgICAgICBmb3IgKGxldCBjPTA7IHBhc3NlZCAmJiBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5jZWxsc1tjXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiAgICBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmxlUm93RW1wdHkoZmlyc3RSb3cpOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy90YWJsZSBjb250YWluIG5vIGRhdGE6ICA8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4gXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjZWxscyB3aXRoIGRhdGEgaW4gdGhlIGZpcnN0IGRhdGEgcm93IGFyZSBhbGwgVEgnc1xuICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgZmlyc3RSb3cuY2VsbHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGxldCBjZWxsID0gZmlyc3RSb3cuY2VsbHNbcl07XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFibGVDZWxsRW1wdHkoY2VsbCkgfHwgY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENhc2UgMjogaGVhZGVycyBhcmUgaW4gdGhlIGZpcnN0IGNvbHVtbiB3aXRoIGRhdGFcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGNvbHVtbiBoYXMgYWxsIFRIJ3Mgb3IgYSBURCB3aXRob3V0IGRhdGEgaW4gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIHRoZSByb3dzIGZyb20gdGZvb3RcbiAgICAgICAgICAgIGlmIChyb3dzW2ldLnBhcmVudE5vZGUgJiYgcm93c1tpXS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0Zm9vdCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBjZWxscyBpbiB0aGlzIHJvdywgb3Igbm8gZGF0YSBhdCBhbGwsIHRoYXQncyBva2F5IHRvby5cbiAgICAgICAgICAgIHBhc3NlZCA9ICFyb3dzW2ldLmNlbGxzIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxscy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzWzBdLmlubmVySFRNTC50cmltKCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwidGRcIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vY2FzZSAzOiBhbGwgdGQgZGF0YSBjZWxscyBoYXZlIGhlYWRlcnMgYXR0cmlidXRlcyB0aGF0IHBvaW50IHRvIHRoZSBpZCBvZiBhIHRoIGVsZW1lbnQgaW4gdGhlIHNhbWUgdGFibGUuIFxuICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90YWJsZXMuaHRtbCNhdHRyaWJ1dGVzLWNvbW1vbi10by10ZC1hbmQtdGgtZWxlbWVudHNcbiAgICAgICAgcGFzc2VkID0gdHJ1ZTsgXG4gICAgICAgIGxldCB0aElkcyA9IFtdO1xuICAgICAgICBsZXQgdGRIZWFkZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gcm93c1tyXTsgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2VsbHMgd2l0aCBkYXRhIGluIHRoZSBsYXN0IGRhdGEgcm93IGFyZSBhbGwgVEgnc1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUluR3JpZChub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNMYXlvdXRUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IFJQVFV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBSUFRVdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoUlBUVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgUlBUVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgUlBUVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBSUFRVdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltZ0V4dChleHQpIHtcbiAgICAgICAgbGV0IGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBpbWFnZV9leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFeHQoZXh0KSB7XG4gICAgICAgIGxldCBodG1sX2V4dGVuc2lvbnMgPSBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgIFwiLnNodG1sXCIsIFwiLnBocFwiLCBcIi5wbFwiLCBcIi5weVwiLCBcIi5zaHRtXCIsIFwiLnNodG1sXCIsIFwiLnhodG1sXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgaHRtbF9leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbmFsRWxlbWVudChub2RlKSB7XG4gICAgICAgIC8vIEVsZW1lbnRzIGV4dHJhY3RlZCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0hUTUwvRWxlbWVudCNJbmxpbmVfdGV4dF9zZW1hbnRpY3MsXG4gICAgICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L2h0bWwtYXV0aG9yLyN0ZXh0LWxldmVsLXNlbWFudGljcyBhbmQgaHR0cHM6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9QcmVzZW50YXRpb25hbF9lbGVtZW50c19hbmRfYXR0cmlidXRlc1xuICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxFbGVtZW50cyA9IFtcImFiYnJcIiwgXCJiXCIsIFwiYmRpXCIsIFwiYmRvXCIsIFwiYnJcIiwgXCJjaXRlXCIsIFwiY29kZVwiLCBcImRhdGFcIiwgXCJkZm5cIixcbiAgICAgICAgICAgIFwiZW1cIiwgXCJpXCIsIFwia2JkXCIsIFwibWFya1wiLCBcInFcIiwgXCJycFwiLCBcInJ0XCIsIFwicnRjXCIsIFwicnVieVwiLCBcInNcIixcbiAgICAgICAgICAgIFwic2FtcFwiLCBcInNtYWxsXCIsIFwic3BhblwiLCBcInN0cm9uZ1wiLCBcInN1YlwiLCBcInN1cFwiLCBcInRpbWVcIiwgXCJ1XCIsXG4gICAgICAgICAgICBcInZhclwiLCBcIndiclwiLCBcImFcIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwiYmFzZWZvbnRcIiwgXCJiaWdcIiwgXCJjZW50ZXJcIixcbiAgICAgICAgICAgIFwic3RyaWtlXCIsIFwidHRcIiwgXCJmb250XCIsIFwiYmxpbmtcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIixcbiAgICAgICAgICAgIFwiaHJcIiwgXCJibG9ja3F1b3RlXCIsIFwicFwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBSUFRVdGlsLnZhbEluQXJyYXkobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwcmVzZW50YXRpb25hbEVsZW1lbnRzKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBoYXNUcmlnZ2VyZWQoZG9jLCBpZCkge1xuICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoZG9jLCBpZCwgZmFsc2UpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRyaWdnZXJPbmNlKGRvYywgaWQsIHBhc3NlZCkge1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IGdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgc2V0Q2FjaGUoZG9jLCBpZCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cmlnZ2VyZWQ7XG4gICAgfVxuXG4gICAgLyogZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiB2YWx1ZSBleGlzdHMgaW4gdGhlIGdpdmVuIGFycmF5ICovXG4gICAgcHVibGljIHN0YXRpYyB2YWxJbkFycmF5KHZhbHVlLCBhcnIpIHtcbiAgICAgICAgZm9yIChsZXQgaWR4IGluIGFycikge1xuICAgICAgICAgICAgaWYgKGFycltpZHhdID09PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gdGFnTmFtZXMgc3RyaW5nLCBhcnJheSwgb3IgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSB0YWdzIHRvIHNlYXJjaCBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGVsZW1lbnQsIHRhZ05hbWVzKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRoaXNUYWcgPSB3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGFnTmFtZXMpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNUYWcgPT09IHRhZ05hbWVzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggaW4gdGFnTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVzW2lkeF0gPT09IHRoaXNUYWcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzVGFnIGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHRydWUgaWYgZWxlbWVudDEgYW5kIGVsZW1lbnQyIGFyZSBzaWJsaW5nc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNTaWJsaW5nKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkgJiYgRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IGVsZW1lbnQyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGVOYW1lLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH0gICBcbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtbc3RyaW5nXX0gc3R5bGVQcm9wcyAtIFRoZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgb2YgdGhlIHBhcmVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqICAgICAgICAgc3VjaCBhcyB7XCJvdmVyZmxvd1wiOlsnYXV0bycsICdzY3JvbGwnXSwgXCJvdmVyZmxvdy14XCI6WydhdXRvJywgJ3Njcm9sbCddfVxuICAgICAqICAgICAgICAgIG9yIHtcIm92ZXJmbG93XCI6WycqJ10sIFwib3ZlcmZsb3cteFwiOlsnKiddfSwgVGhlICcqJyBmb3IgYW55IHZhbHVlIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHN0eWxlIHByb3AuXG4gICAgICogQHBhcm0ge2Jvb2x9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50LCB3aGljaCBoYXMgdGhlIHN0eWxlIHByb3BlcnRpZXNcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9W10pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZ2V0Q2FjaGUod2Fsa05vZGUsIFwiUlBUVXRpbF9BbmNlc3RvcldpdGhTdHlsZXNcIiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gbnVsbCkgcmV0dXJuIG5vZGU7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMod2Fsa05vZGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBpbiBzdHlsZVByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdChcIiBcIilbMF07IC8vZ2V0IHJpZCBvZiAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVQcm9wc1tzdHlsZV0uaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKHdhbGtOb2RlLCBcIlJQVFV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzXCIsIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcHNbc3R5bGVdLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKHdhbGtOb2RlLCBcIlJQVFV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzXCIsIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJSUFRVdGlsX0FuY2VzdG9yV2l0aFN0eWxlc1wiLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYnkgZGVmYXVsdCB3aWxsIG5vdCBjb25zaWRlciBDaGVjayBIaWRkZW4gU2V0dGluZyBhdCBhbGwuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHNpYmxpbmcgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBub2RlIHdoaWNoIG1hdGNoZXMgdGhlIHJvbGUgYW5kIGlzIGEgc2libGluZyBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNvbnNpZGVycyBpbXBsaWNpdCByb2xlcyBmb3IgdGhlIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gY29uc2lkZXIgZWxlbWVudHMgdGhhdCBhcmUgaGlkZGVuIGJhc2VkIG9uIHRoZSBpZiB0aGUgQ2hlY2tcbiAgICAgKiBIaWRkZW4gQ29udGVudCBzZXR0aW5ncyBzaG91bGQgYmUgY29uc2lkZXJlZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBzaWJsaW5nIG5vZGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gVGhlIHJvbGUgdG8gc2VhcmNoIGZvciBvbiBhbiBlbGVtZW50IHVuZGVyIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXQgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIEltcGxpY2l0IHJvbGVzIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlPykge1xuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCB3YWxrTm9kZSA9IG51bGw7XG4gICAgICAgIGxldCBoYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gT25seSBwZXJmb3JtIHRoZSBjaGVjayBpZiBlbGVtZW50IGFuZCByb2xlIGFyZSBib3RoIHByb3ZpZGVkXG4gICAgICAgIGlmIChlbGVtZW50ICYmIHJvbGUpIHtcbiAgICAgICAgICAgIC8vIEZldGNoIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3Bpbmcgb3ZlciB0aGUgbmV4dCBzaWJsaW5ncyB0byBmaW5kIGVsZW1lbnQgd2hpY2ggbWF0Y2hlc1xuICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVkIHJvbGUuXG4gICAgICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwgJiYgIWhhc1JvbGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBSUFRVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIG5vdCBmb3VuZCBhIG5vZGUgdGhhdCBtYXRjaGVzIHRoZSByb2xlLCBzdGFydCBhIHJldmVyc2UgbG9vayB1cFxuICAgICAgICAgICAgaWYgKCF3YWxrTm9kZSkge1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBwcmV2aW91cyBTaWJsaW5nIG9mIHRoaXMgZWxlbWVudFxuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAvLyBLZWVwIGxvb3Bpbmcgb3ZlciBhbGwgdGhlIHByZXZpb3VzIHNpYmxpbmdzIHRvIHNlYXJjaCBmb3IgYW4gZWxlbWVudCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIG1hdGNoZXMgdGhlIHByb3ZpZGVkIHJvbGUuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsICYmICFoYXNSb2xlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBjb25zaWRlckltcGxpY2l0Um9sZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGNoaWxkKSB7XG4gICAgICAgIGxldCBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY2hpbGQpO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgaWYgdGhlIGZpcnN0IGZvcm0gY29udHJvbCBjaGlsZCBpcyBkaXNhYmxlZFxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50cyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJdO1xuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUVsZW1lbnRzLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQobncubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlSZWZlcnJpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHJvb3QgPSBkb2MuYm9keTtcbiAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIHJvb3QgPSBET01XYWxrZXIucGFyZW50Tm9kZShyb290KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGEgZGVzY2VuZGFudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZSBieSBkZWZhdWx0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudHMgZWxlbWVudHNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRlc2NlbmRhbnQgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJvbGUgc3BlY2lmaWVkIChvbmx5IG9uZSlcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnRzIGVsZW1lbnRzXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRlc2NlbmRhbnQgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJvbGUgc3BlY2lmaWVkIChvbmx5IG9uZSlcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IG51bGw7XG4gICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG5cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzID8gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogUlBUVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBkZXNjZW5kYW50ID0gbncubm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudHMgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcblxuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgcHJvdmlkZWQgYW5kIGNoZWNrIGlmIHRoZSByb2xlbmFtZSBwcm92aWRlZCBleGlzdHNcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50ICYmIG53Lm5vZGUgIT0gZWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIHRydWUpO1xuICAgICAgICBsZXQgZGlyZWN0OiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcbiAgICAgICAgUlBUVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3QpO1xuICAgICAgICByZXR1cm4gZGlyZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlY3Vyc2l2ZWx5IGFueSBjaGlsZCBwYXRoIHRpbGwgZWl0aGVyIG5vIGNoaWxkIG9yIGEgY2hpbGQgd2l0aCBhIHJvbGUgaXMgZm91bmQgKGV4Y2x1ZGUgbm9uZSBhbmQgcHJlc2VudGF0aW9uKVxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBjaGlsZHJlbiBmb3JcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkaXJlY3QgY2hpbGQgZWxlbWVudHMgaW4gQVQgdHJlZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyByZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3Q6IEFycmF5PEhUTUxFbGVtZW50Pikge1xuICAgICAgICBsZXQgY2hpbGRyZW4gOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICE9PSBudWxsICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBvd25lZElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKG93bmVkSWRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChvd25lZEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoY2hpbGRyZW5baV0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZXMgPT09IG51bGwgfHwgcm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcyAhPT0gbnVsbCAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlICdub25lJyBhbmQgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24ocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24ocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlICE9PSAnZ3JvdXAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihjaGlsZHJlbltpXSwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbikgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlXG4gICAgICAgICovXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBSUFRVdGlsLmdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHJvbGUgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIGxldCByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLW93bnMgaXMgbm90IG9uIHRoZSBlbGVtZW50IGp1c3QgYnJlYWsgb3V0IG9mIHRoaXMgZnVuY3Rpb24gd2l0aCBudWxsXG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1vd25zXCIpKSB7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgcmVmZXJlbmNlIElEXG4gICAgICAgICAgICBsZXQgcmVmZXJlbmNlSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIElEXG4gICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIHJlZmVyZW5jZUlEKTtcbiAgICAgICAgICAgIC8vaWdub3JlIGlmIHRoZSBhcmlhLW93bnMgcG9pbnQgdG8gdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbCAmJiBSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocmVmZXJlbmNlZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gUlBUVXRpbC5oYXNSb2xlKHJlZmVyZW5jZWRFbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlZEVsZW1IYXNSb2xlID8gcmVmZXJlbmNlZEVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgZnVuY3Rpb24gbmFtZSBpcyBtaXNsZWFkaW5nLiBVc2UgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIGluc3RlYWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldElucHV0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW1lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgY29udGFpbmluZyBsYWJsZSBlbGVtZW50IGlzIGhpZGRlbiwgd2hlbiB0aGUgaWdub3JlSGlkZGVuIG9wdGlvblxuICAgICAqIGlzIHNldCB0byB0cnVlLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBsYWJlbCBlbGVtZW50IGZvci5cbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCBsYWJlbCBzaG91bGQgYmUgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW1lbnQ6IEVsZW1lbnQsIGlnbm9yZUhpZGRlbikge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZ2xvYmFsIFJQVFV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIlJQVFV0aWxfTEFCRUxTXCIsIG51bGwpKSB7XG4gICAgICAgIGxldCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgICBpZiAoIWdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSk/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJSUFRVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgICAgIGxldCBpZFRvTGFiZWwgPSB7fVxuXG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBsYWJlbCBlbGVtZW50cyBpbiB0aGUgZW50aXJlIGRvY1xuICAgICAgICAgICAgbGV0IGxhYmVsTm9kZXMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhYmVsIG5vZGVzLCBpbiB0aGUgY2FzZSB0aGUgbGFiZWwgbm9kZSBoYXMgYSBmb3IgYXR0cmlidXRlLFxuICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGF0IGF0dHJpYnV0ZSBhbmQgYWRkIHRoaXMgbm9kZSB0byB0aGUgaGFzaCBpZiBpdCBpcyB2aXNpYmxlLlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbE5vZGVzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2Rlc1tpXS5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaWdub3JlIGhpZGRlbiBpcyBzcGVjaWZpZWQgYW5kIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHdlIGRvIG5vdCBhZGQgaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxhYmVsTm9kZXMgaGFzaC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUhpZGRlbiAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxhYmVsTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlkVG9MYWJlbFtsYWJlbE5vZGVzW2ldLmdldEF0dHJpYnV0ZShcImZvclwiKV0gPSBsYWJlbE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBidWlsdCBoYXNoIHRvIHRoZSBvd25lckRvY3VtZW50IChkb2N1bWVudCksIHRvIGJlIHVzZWQgbGF0ZXIgdG8gZmFzdCByZXRyaXZhbFxuICAgICAgICAgICAgLy9zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiUlBUVXRpbF9MQUJFTFNcIiwgaWRUb0xhYmVsKTtcbiAgICAgICAgICAgIHNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSk/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJSUFRVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGhhcyBhbiBpZCBhdHRyaWJ1dGUsIGdldCB0aGUgY29yb3Nwb25kaW5nIGxhYmVsIGVsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgIC8vIEZldGNoIHRoZSBpZCBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBjdHJsSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgIC8vIE5vdGU6IGluIHRoZSBjYXNlIHRoYXQgdGhlIHRoZSBpZCBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2ggdGhhdCBtZWFucywgaXQgZG9lcyBub3QgZXhpc3RzIG9yIGlzIGhpZGRlblxuICAgICAgICAgICAgaWYgKGN0cmxJZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIGdldENhY2hlKGVsZW1lbnQuZ2V0Um9vdE5vZGUoKS5vd25lckRvY3VtZW50LFwiUlBUVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKT8gPFNoYWRvd1Jvb3Q+cm9vdCA6IDxEb2N1bWVudD5yb290LCBcIlJQVFV0aWxfTEFCRUxTXCIse30pW2N0cmxJZF07XG4gICAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vYXR0ciBpcyBhIHJlZmVyZW5jZSB0byBvdGhlciBlbGVtZW50cyhzKVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhdHJWYWx1ZS5zcGxpdCgvICsvZyk7XG4gICAgICAgIC8vaWdub3JlIGlmIG5vbmUgb2YgdGhlIHJlZmVycmVkIGVsZW1lbnQocykgZXhpc3Qgb3IgYWxsIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICBsZXQgZXhpc3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaWQ9MDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsOyAgIFxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBBUklBIGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNBcmlhTGFiZWwoZWxlbWVudCkge1xuXG4gICAgICAgIC8vIFJwdF9BcmlhX1ZhbGlkSWRSZWYgZGV0ZXJtaW5lcyBpZiB0aGUgYXJpYS1sYWJlbGxlZGJ5IGlkIHBvaW50cyB0byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudCBoYXMgdmFsaWQgaW1wbGljaXQgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0ltcGxpY2l0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgLy8gVGVzdCAgYSkgaWYgdGhlIHBhcmVudCBpcyBhIGxhYmVsIHdoaWNoIGlzIHRoZSBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAvLyAgICAgICBiKSBpZiB0aGUgZm9ybSBlbGVtZW50IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYykgaWYgdGhlIGZvcm0gZWxlbWVudCByZXF1aXJlcyBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCA6IFwiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJcbiAgICAgICAgLy8gZm9ybSBlbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIGltcGxpY2l0IG9yIGV4cGxpY2l0IGxhYmVsIGVsZW1lbnQgYXJlOlxuICAgICAgICAvLyBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZGF0YWxpc3RcIihhZGRlZCBsYXRlcikuIFRoZXNlIHdlcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgbWFpbiBydWxlLCBtaWdodCBuZWVkIHRvIHJlZmFjdG9yIHRoZSBjb2RlIGxhdGVyXG5cbiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAmJiBSUFRVdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgIHBhcmVudENsb25lID0gUlBUVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHBhcmVudENsb25lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50c1JlcXVpcmluZ0xhYmVsID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChwYXJlbnROb2RlLmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHNSZXF1aXJpbmdMYWJlbC5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKSBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlIDogRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLnNoYWRvd1Jvb3QpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBhIHNoYWRvdyB0cmVlXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0VsZW1lbnQoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBsZXQgcm9vdCAgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCBpc0dsb2JhbCkge1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50c1swXS5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbWVudHNbaV0pID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcobGFiZWwpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFzIG5vIGxhYmVsIGF0IGFsbFxuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZSkgPyBSUFRVdGlsLmdldElubmVyVGV4dChsYWJlbE5vZGUpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRMYWJlbC50cmltKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIC8vY29uc3QgbGFiZWwgPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGUpO1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFsYWJlbCkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gKFJQVFV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsKSB8fCBsYWJlbC5pbm5lclRleHQgfHwgXCJcIikudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSBpZFN0ciBcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJZFJlZmVyVG9TZWxmKGVsZW1lbnQsIGlkU3RyOlN0cmluZykge1xuICAgICAgICBpZiAoIWlkU3RyIHx8IGlkU3RyLnRyaW0oKSA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGlkcyA9IGlkU3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCByZWZlcnJlZE5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCBpZHNbal0pO1xuICAgICAgICAgICAgaWYgKHJlZmVycmVkTm9kZSAmJiBET01VdGlsLnNhbWVOb2RlKHJlZmVycmVkTm9kZSwgZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTsgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtSUFRVdGlsLmdldEFyaWFMYWJlbChlbGUpXSA9IChkdXBlTWFwW1JQVFV0aWwuZ2V0QXJpYUxhYmVsKGVsZSldIHx8IDApICsgMTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGR1cGVNYXA7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVsc1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIGlzR2xvYmFsKSB7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnRzWzBdLm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVsczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSBudWxsO1xuICAgICAgICBsZXQgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFMYWJlbCA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBhcmlhTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1thcmlhTGFiZWxdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXJpYUxhYmVsIGluIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbYXJpYUxhYmVsXSA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0ucHVzaChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEID0gbGFiZWxJRHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudHNbaV0sIGxhYmVsSUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbWVudHNbaV0pID8gUlBUVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5O1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc0R1cGxpY2F0ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSxlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsUmVmID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSk7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gbGFiZWxSZWYgaW4gbGFiZWxSZWZzO1xuICAgICAgICAgICAgICAgIGxhYmVsUmVmc1tsYWJlbFJlZl0gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaGFzRHVwbGljYXRlTGFiZWxzO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IFJQVFV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBhdHRyU3RyKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyU3RyKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyU3RyKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBmcmFtZSwgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LGZyYW1lTmFtZSkge1xuICAgICAgICBsZXQgd2luZG93ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgbGV0IGZyYW1lTGlzdCA9IFt3aW5kb3ddO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgd2hpbGUgKGlkeCA8IGZyYW1lTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLm5hbWUgPT09IGZyYW1lTmFtZSkgcmV0dXJuIGZyYW1lTGlzdFtpZHhdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVMaXN0W2lkeF0uZnJhbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgaXQncyBhIHJlYWwgZnJhbWUgYW5kIGF2b2lkIHJlY3Vyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSAmJiAhZnJhbWVMaXN0LmluY2x1ZGVzKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxpc3QucHVzaChmcmFtZUxpc3RbaWR4XS5mcmFtZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICArK2lkeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHROU1Jlc29sdmVyKHByZWZpeCl7XG4gICAgICAgIGxldCB1cmk7XG4gICAgICAgIHN3aXRjaCAocHJlZml4KSB7XG4gICAgICAgICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4Mic6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMic7XG4gICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBjYXNlICd4aHRtbCc6XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmk7XG4gICAgfVxuXG4gICAgLy9jaGVja2luZyBpZiBvbmx5IHRoZSBpbm5lciB0ZXh0IGlzIGVtcHR5IG9yIG5vdFxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRPbmx5RW1wdHkoZWxlbWVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgdGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgJiYgZWxlbWVudC50ZXh0Q29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJbiBoZWFkbGVzcyBtb2RlLCAgaW5uZXJUZXh0IGlzIHNvbWV0aW1lcyAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgLy8gc28gd2UgdHJ5IHRleHRDb250ZW50IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnQudGV4dENvbnRlbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSAhKHRleHQgIT09IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIC8vVE9ETzogbmVlZCB0byBjb25zaWRlIGl0cyBvd24gY29udGVudCwgYSBzbG90IG1heSBoYXZlIGl0cyBvd24gY29udGVudCBvciBhc3NpZ25lZCBjb250ZW50XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RFbGVtIG9mIGVsZW1lbnQuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICYmIFJQVFV0aWwuaXNJbm5lclRleHRFbXB0eShzbG90RWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHRoZSBpbm5lciB0ZXh0IG9mIHRoZSBnaXZlbiBlbGVtZW50ICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbm5lclRleHQoZWxlbWVudCkge1xuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChyZXRWYWwgPT09IHVuZGVmaW5lZCB8fCByZXRWYWwudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgcmV0VmFsID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnRcbiAgICAgICAgbGV0IHRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50KTtcblxuICAgICAgICAvLyBUcmltIHRoZSBpbm5lciB0ZXh0IGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBub3QgZW1wdHkuXG4gICAgICAgIHJldHVybiAhKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQ29udGVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzIGNhc2VzIHdoZXJlIGlubmVyIHRleHQgaXMgaGlkZGVuLCB3aGljaCBub3cgd2lsbFxuICAgICAqIGJlIGNsYXNzaWZpZWQgYXMgZG9lcyBub3QgaGF2ZSBoaWRkZW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIlxuICAgICAgICAgICAgICAgICAgICAmJiBSUFRVdGlsLnN2Z0hhc05hbWUobm9kZSBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFSUFRVdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhUlBUVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgKFJQVFV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJ0ZXh0Ym94XCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiAoUlBUVXRpbC5oYXNBcmlhTGFiZWwobncubm9kZSkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcInRpdGxlXCIpIHx8IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKG53LmVsZW0oKSwgdHJ1ZSkpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgYXJyLmluZGV4T2YoaXRlbSkgPT09IC0xICYmIGl0ZW0gIT09IG51bGwgPyBhcnIucHVzaChpdGVtKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pIDogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaXRlbUxpc3QgIT09IG51bGwgJiYgaSA8IGl0ZW1MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcnIgPSBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShpdGVtTGlzdFtpXSwgYXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhcnJheSBpdGVtcyBmcm9tIGEgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0gaXRlbUxpc3QgaXRlbXMgdG8gYmUgcmVtb3ZlZCBmcm9tIGFyclxuICAgICAqIEBwYXJhbSBhcnIgdGhlIGFycmF5XG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2VBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiAge1xuICAgICAgICAgICAgICAgIHJldHVybiAhaXRlbUxpc3QuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVzb2x2aW5nIEFSSUEgcmVxdWlyZW1lbnRzIGZvciBhbiBIVE1MIGVsZW1lbnQgcGVyIEFSSUEgaW4gSFRNTFxuICAgICAqIEBwYXJhbSBydWxlQ29udGV4dCB0aGUgSFRNTCBlbGVtZW50IHRvIGJlIGV4YW1pbmVkXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KSB7XG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmY3MgPSBSUFRVdGlsLmdldENoaWxkQnlUYWcocnVsZUNvbnRleHQsIFwiZmlnY2FwdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjcyAhPT0gbnVsbCAmJiBmY3MubGVuZ3RoID4gMCA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1maWdjYXB0aW9uXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZm9vdGVyXCI6IFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaGVhZGVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImFydGljbGVcIiwgdHJ1ZSkgIT09IG51bGwgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJuYXZpZ2F0aW9uXCIsIHRydWUpICE9PSBudWxsIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImFydGljbGVcIiwgXCJhc2lkZVwiLCBcIm1haW5cIiwgXCJuYXZcIiwgXCJzZWN0aW9uXCJdKSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJvdGhlclwiXTsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKSA9PT0gXCJcIiA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1lbXB0eS1hbHRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGgtYWx0LXRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hbHQtdGV4dFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aG91dC1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbdHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtcHJlc3NlZFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGVja2JveC13aXRob3V0LWFyaWEtcHJlc3NlZFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJlbWFpbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJzZWFyY2gtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZWwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ1cmwtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZWZhdWx0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdHlwZSBpcyB0aGUgc2FtZSBhcyB0eXBlPXRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJsaVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIFwibGlzdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtb2YtbGlzdC1yb2xlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1jaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInNlbGVjdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic2l6ZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpID4gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJzdW1tYXJ5XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQgJiYgcnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscycgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgRE9NVXRpbC5zYW1lTm9kZShbLi4ucnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW09PmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0YWJsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZSA9IFJQVFV0aWwuZ2V0U2NvcGVGb3JUaChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtb3RoZXJcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcnQgPSBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJ0ICE9PSBudWxsICYmIHBydC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGwnID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWRsXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWRsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcImRlZmF1bHRcIl0gYXMgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDtcbiAgICAgICAgICAgICAgICB9IC8vc3dpdGNoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9FbGVtZW50QXJpYVByb3BlcnR5XCIsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIHRhZ1Byb3BlcnR5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRTY29wZUZvclRoKGVsZW1lbnQpIHtcbiAgICAgICAgLyoqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS90YWJ1bGFyLWRhdGEuaHRtbCNoZWFkZXItYW5kLWRhdGEtY2VsbC1zZW1hbnRpY3NcbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXMgXG4gICAgICAgICAqIHNhaWQgdG8gYmUgYSBjb2x1bW4gaGVhZGVyIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGNvbHVtbiBzdGF0ZSwgb3JcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgYXV0byBzdGF0ZSwgYW5kIHRoZXJlIGFyZSBubyBkYXRhIGNlbGxzIGluIGFueSBvZiBcbiAgICAgICAgICogICB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB5LWNvb3JkaW5hdGVzIHkgLi4geStoZWlnaHQtMS5cbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXNcbiAgICAgICAgICogc2FpZCB0byBiZSBhIHJvdyBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcm93IHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCB0aGUgY2VsbCBpcyBub3QgYSBjb2x1bW4gaGVhZGVyLCBhbmQgdGhlcmUgYXJlXG4gICAgICAgICAqICAgbm8gZGF0YSBjZWxscyBpbiBhbnkgb2YgdGhlIGNlbGxzIGNvdmVyaW5nIHNsb3RzIHdpdGggeC1jb29yZGluYXRlcyB4IC4uIHgrd2lkdGgtMS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIE5vdGU6IGF1dG8gaXMgZGVmYXVsdCBzY29wZVxuICAgICAgICBcbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2NvcGUgaXMgYXV0bywgZGVmYXVsdCAod2l0aG91dCBhIHNjb3BlKSBvciBpbnZhbGlkIHZhbHVlLlxuICAgICAgICAvLyBpZiBhbGwgdGhlIHNpYmxpbmcgZWxlbWVudHMgYXJlIHRoLCB0aGVuIHJldHVybiBcImNvbHVtbmhlYWRlclwiIFxuICAgICAgICB2YXIgc2libGluZ3MgPSBlbGVtZW50ID0+IFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihub2RlPT5ub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUudGFnTmFtZSAhPSBcIlRIXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7IFxuICAgICAgICBlbHNlIHJldHVybiBcInJvd1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzIDogc3RyaW5nW10gPSBnZXRDYWNoZShydWxlQ29udGV4dCwgXCJSUFRVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZFJvbGVzKSB7XG4gICAgICAgICAgICBhbGxvd2VkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAhPT0gbnVsbCAmJiB0YWdQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkudmFsaWRSb2xlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkudmFsaWRSb2xlcywgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMgJiYgaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFSb2xlc1wiLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxvd2VkUm9sZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGVzLCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA6IHN0cmluZ1tdID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUlBUVXRpbF9BbGxvd2VkQXJpYUF0dHJpYnV0ZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbLi4ucm9sZXNdO1xuICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgZGlzYWJsZWQgYXR0cmlidXRlICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbFxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLWRpc2FibGVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBodHRwOi8vd3d3LnRoZS1hcnQtb2Ytd2ViLmNvbS9odG1sL2h0bWw1LWZvcm0tdmFsaWRhdGlvbi9cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVxdWlyZWQuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlcXVpcmVkIGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZXF1aXJlZFwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlYWRvbmx5IGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZWFkb25seVwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9wZXJ0aWVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRQcm9wcyA9IHJvbGVQcm9wZXJ0eS5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWRQcm9wcyAmJiBwcm9oaWJpdGVkUHJvcHMubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBSUFRVdGlsLmlzRm9jdXNhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgZ2xvYmFsIHByb3BlcnRpZXMgdG8gdGhlIHZhbGlkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllczsgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBvdGhlciByb2xlIHRvIHRoZSBhbGxvd2VkIHJvbGVzIGZvciB0aGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzICYmIHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5Lm90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzLCBwZXJtaXR0ZWRSb2xlcyk7ICAgICAgIFxuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhwZXJtaXR0ZWRSb2xlc1tpXSwgcnVsZUNvbnRleHQpOyAvLyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydGllcy5wcm9oaWJpdGVkUHJvcHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aD4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgUlBUVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPT0gbnVsbCApIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWQubGVuZ3RoID4gMCkgICAgXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBhdHRyLnNwbGl0KFwiPVwiKTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXNhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChkaXNhbGxvd2VkLCBwcm9oaWJpdGVkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2V4Y2x1ZGUgdGhlIHByb2hpYml0ZWRBdHRyaWJ1dGVzIGZyb20gdGhlIGFsbG93ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkQXR0cmlidXRlcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAvL2V4Y2x1ZGUgYXJpYSBhdHRyaWJ1dGUgZm9yIGVsZW1lbnRzIHdpdGhvdXQgaW1wbGljaXQgcm9sZSBhbmQgd2l0aCAnTmFtaW5nIFByb2hpYml0ZWQnXG4gICAgICAgICAgICBpZiAoKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApICYmIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSA9PT0gbnVsbCAmJiB0YWdQcm9wZXJ0eS5wcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGUpXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJQVFV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7IFxuICAgICAgICAgICAgbGV0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gW107XG4gICAgICAgICAgICBsZXQgYXJpYUF0dHJWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0LmNvbmZsaWN0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBhcmlhQXR0clZhbHVlID0gZXhpc3QuY29uZmxpY3QuYXJpYUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3ZlcmxhcHBpbmcnKSAge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3Qub3ZlcmxhcHBpbmcpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyVmFsdWUgPSBleGlzdC5vdmVybGFwcGluZy5hcmlhQXR0cmlidXRlVmFsdWU7IFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgICAgICAgICAgaWYgKGFyaWFBdHRyVmFsdWUgPT09IG51bGwgfHwgYXJpYUF0dHJWYWx1ZSA9PT0gJ1ZBTFVFJyB8fCBhcmlhQXR0clZhbHVlID09PSBhcmlhQXR0clsndmFsdWUnXSkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sQXR0ck5hbWVzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGh0bWxBdHRyVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyTmFtZXMgPSBleGlzdC5jb25mbGljdC5odG1sQXR0cmlidXRlTmFtZXM7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0clZhbHVlcyA9IGV4aXN0LmNvbmZsaWN0Lmh0bWxBdHRyaWJ1dGVWYWx1ZXM7XG4gICAgICAgICAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICBodG1sQXR0ck5hbWVzID0gZXhpc3Qub3ZlcmxhcHBpbmcuaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJWYWx1ZXMgPSBleGlzdC5vdmVybGFwcGluZy5odG1sQXR0cmlidXRlVmFsdWVzO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHsgXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGh0bWxBdHRyTmFtZXMuaW5kZXhPZihodG1sQXR0cnNbaV1bJ25hbWUnXSk7IFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxBdHRyVmFsdWVzID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGFyaWFBdHRyVmFsdWUgPT09ICdWQUxVRScgJiYgaHRtbEF0dHJWYWx1ZXNbaW5kZXhdID09PSAnVkFMVUUnICYmIGh0bWxBdHRyc1tpXVsndmFsdWUnXSAhPT0gYXJpYUF0dHJbJ3ZhbHVlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaHRtbEF0dHJzW2ldWyd2YWx1ZSddID09PSBodG1sQXR0clZhbHVlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHtyZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7cmVzdWx0OiAnUGFzcycsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ119KTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW0sIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcm9sZXMgIT09IG51bGwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZVByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0aWVzICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGlvbmFsID0gcm9sZVByb3BlcnRpZXMucHJlc2VudGF0aW9uYWxDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudGlvbmFsID09PSB0cnVlKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQoZWxlbWVudCA6IEhUTUxFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKiogbW92ZWQgdG8gQ1NTVXRpbFxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gbnVsbCB8fCBzdHlsZVRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgICAgICBsZXQgcmUgPSAvKFxcL1xcKisoPzooPzooPzpbXlxcKl0pKyl8KD86W1xcKl0rKD8hXFwvKSkpWypdK1xcLyl8XFwvXFwvLiogL2c7XG4gICAgICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9O1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXlWYWxzW21bMV1dID0gbVsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFsc1xuICAgICAgICAgICAgfV07XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgbGV0IG0yO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gclNlbGVjdG9ycy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbE9mTGFiZWwobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGVhc3kgY2FzZSBvZiBsYWJlbCAtPiBmb3JcbiAgICAgICAgbGV0IGxhYmVsQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKG5vZGUsIFwibGFiZWxcIik7XG4gICAgICAgIGlmIChsYWJlbEFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAobGFiZWxBbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnRVdGlsLmdldEJ5SWQobm9kZSwgbGFiZWxBbmNlc3Rvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGlkcyBvZiBwYXJlbnQgbm9kZXNcbiAgICAgICAgbGV0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIik7XG4gICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8aW5wdXRzVXNpbmdMYWJlbGxlZEJ5Lmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0VXNpbmdMYWJlbGxlZEJ5ID0gaW5wdXRzVXNpbmdMYWJlbGxlZEJ5W2lkeF07XG4gICAgICAgICAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGlucHV0VXNpbmdMYWJlbGxlZEJ5LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNwID0gYXJpYUxhYmVsbGVkQnkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzcCkge1xuICAgICAgICAgICAgICAgIGlmIChpZCBpbiBpZERpY3QgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKG5vZGUsIChub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0VXNpbmdMYWJlbGxlZEJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNhc2VzIHdoZXJlIHdlJ3JlIHdpdGhpbiBhbiBhcmlhIGxhYmVsbGVkYnlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyBwcm92aWVkIGlzXG4gICAgICogZGlzYWJsZWQgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBkaXNhYmxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczpcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGRpc2FibGVkXG4gICAgICogICAgICAgICBBbHNvIG5lZWRzIHRvIGJlIFwiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsXG4gICAgICogICAgICAgICBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIiBub2RlcyAoaW4gYXJyYXkgZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQpXG4gICAgICogICAgICAgYXR0cmlidXRlIC0tPiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiXG4gICAgICogICAgMi4gQ2hlY2sgaWYgYW55IG9mIHRoZSBjdXJyZW50IG5vZGVzIHBhcmVudHMgYXJlIGRpc2FibGVkIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgZGlzYWJsZWQgdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBkaXNhYmxlZCkuXG4gICAgICpcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ESVNBQkxFRFwiLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIG5vZGVUeXBlIG9mIHRoaXMgbm9kZSwgaWYgdGhpcyBub2RlIGlzIGEgdGV4dCBub2RlIHRoZW5cbiAgICAgICAgLy8gd2UgZ2V0IHRoZSBwYXJlbnRub2RlIGFuZCBzZXQgdGhhdCBhcyB0aGUgbm9kZSBhcyBhIHRleHQgbm9kZXMsXG4gICAgICAgIC8vIGRpc2FibGVkIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZGlzYWJsZWQgZWxlbWVudCBwcm9wZXJ0eSwgZGlzYWJsZWQgYW5kIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIGFuZCBjaGVjayB0aGF0IGl0IGlzIHRydWVcbiAgICAgICAgbGV0IGRpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGRpc2FibGVkUHJvcGVydHlDdXN0b20gPSBQVF9OT0RFX0RJU0FCTEVEO1xuICAgICAgICBsZXQgYXJpYURpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSAmJiBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgPT09ICd0cnVlJztcblxuICAgICAgICAvLyBJZiB0aGlzIG5vZGUgaGFzIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgdGhlIG5vZGUgYWxsb3dzIGRpc2FibGVkIGF0dHJpYnV0ZSwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgICAgICAgLy8gRGlzYWJsZWQgYXR0cmlidXRlIGlzIG9ubHkgYWxsb3dlZCBvbiBcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLWRpc2FibGVkIGlzIHNldCB0byB0cnVlLCB0aGVuIGFsc28gcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKGRpc2FibGVkUHJvcGVydHlDdXN0b20gfHwgKGRpc2FibGVkQXR0cmlidXRlICYmIEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB8fCBhcmlhRGlzYWJsZWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIGRpc2FibGVkIGF0dHJpYnV0ZS4gT25seSBrZWVwIGNoZWNraW5nIHVudGlsIHdlIGFyZSBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBwYXJlbnROb2RlXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBub2RlIGV4aXN0cyBhbmQgdGhlIG5vZGV0eXBlIGlzIGVsZW1lbnQgKDEpLCB0aGVuIHJ1biByZWN1cnNpdmUgY2FsbCB0byBwZXJmb3JtIHRoZSBjaGVja1xuICAgICAgICAvLyBhbGwgdGhlIHdheSB1cCB0byB0aGUgdmVyeSBwYXJlbnQgbm9kZS4gVXNlIHJlY3Vyc2l2ZSBjYWxsIGhlcmUgaW5zdGVhZCBvZiBhIHdoaWxlIGxvb3Agc28gdGhhdCB3ZSBkbyBub3RcbiAgICAgICAgLy8gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseSwgYW5kIHNhdmUgdGhlIHJlc3VsdHMgaW4gYW4gdmFyaWFibGVcbiAgICAgICAgICAgIGxldCBub2RlRGlzYWJsZWQgPSBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBmb3VuZCB0byBiZSBkaXNhYmxlZCB0aGVuIGFkZCB0aGUgY3VzdG9tIFBUX05PREVfRElTQUJMRUQgdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIG5leHQgdGltZSwgdG8gcXVpY2tseSBkZXRlcm1pbmUgaWYgbm9kZSBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGV4dHJhIHBlcmNhdXRpb24sIHRoZSBpc05vZGVEaXNhYmxlZCBmdW5jdGlvbiBhbHJlYWR5IHNldHMgdGhpcy5cbiAgICAgICAgICAgIGlmIChub2RlRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIGNoZWNraW5nIG9yIG5vdCwgYmFzZWRcbiAgICAgKiBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZ3MgYW5kIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgLSBOb2RlIHRvIGNoZWNrIGlmIGl0IGlzIHZpc2libGUgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSB7XG4gICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAvLyBvciBub3QuXG4gICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoZSBub2RlIHNob3VsZCBub3QgYmUgc2Nhbm5lZC9hZGRlZCB0byBhbnkgaGFzaC9hcnJheS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgIGlmICghUlBUVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc2ZvY3VzYWJsZUJ5RGVmYXVsdChub2RlKSB7XG4gICAgICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IFsnaW5wdXQnLCAnc2VsZWN0JywgJ2J1dHRvbicsICd0ZXh0YXJlYScsICdvcHRpb24nLCAnYXJlYSddO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFcIiAmJiBSUFRVdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIgJiYgUlBUVXRpbC5oYXNBdHRyaWJ1dGUobm9kZSwgJ2hyZWYnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5pbmRleE9mKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50IDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHxcbiAgICAgICAgICAgIChwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG53LmVsZW0oKTtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkgeyAvLyBUZXh0IG5vZGUuIHVzdWFsbHkgaXMgYSBjYXJ0cmlkZ2UgcmV0dXJuLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmXG4gICAgICAgICAgICAgICAgKHBhcnNlSW50KGNoaWxkLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkgJiZcbiAgICAgICAgICAgICAgICAhUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgdmFyIGhhc0F0dHJpYnV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGhhc0F0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IGVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBhdHRyICYmIGF0dHIuc3BlY2lmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGU7XG4gICAgfVxufVxuLyoqIG1vdmVkIHRvIENTU1V0aWxcbmV4cG9ydCBjbGFzcyBSUFRVdGlsU3R5bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgICAgIFwiYm9sZFwiOiA3MDBcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKHJldFZhbCkgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgaWYgKHN0eWxlVmFsIGluIG1hcClcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICByZXR1cm4gNDAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rm9udEluUGl4ZWxzID0gZnVuY3Rpb24gKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICAgICAgXCJ4LXNtYWxsXCI6IDEwLFxuICAgICAgICAgICAgXCJzbWFsbFwiOiAxMyxcbiAgICAgICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICAgICAgXCJsYXJnZVwiOiAxOCxcbiAgICAgICAgICAgIFwieC1sYXJnZVwiOiAyNCxcbiAgICAgICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVZhbCk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICB9XG59XG4qL1xuLyogUmV0dXJuIGEgbm9kZSB3YWxrZXIgZm9yIHRoZSBnaXZlbiBlbGVtZW50LlxuICogYkVuZCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gZmFsc2VcbiAqIGJ1dCBpZiB0cnVlLCBpbmRpY2F0ZXMgdGhlIG5vZGUgaXMgdGhlIGVuZCBub2RlKi9cbmV4cG9ydCBjbGFzcyBOb2RlV2Fsa2VyIHtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnIDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcihub2RlOiBOb2RlLCBiRW5kPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIG5leHROb2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovXG4gICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53T3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkubndTbG90SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHROb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lcjtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkubndTbG90T3duZXI7XG4gICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5ud1Nsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm53U2xvdEluZGV4ID0gbmV4dFNsb3RJbmRleDsgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5ud093bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnICYmIHRoaXMubm9kZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJFbmRUYWcgJiYgKHRoaXMubm9kZS5maXJzdENoaWxkID09PSBudWxsIHx8IHR5cGVvZiAodGhpcy5ub2RlLmZpcnN0Q2hpbGQpID09PSAndW5kZWZpbmVkJykpXG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwcGVyLCBJTWFwUmVzdWx0LCBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21tb25NYXBwZXIgaW1wbGVtZW50cyBJTWFwcGVyIHtcbiAgICBhYnN0cmFjdCBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldE5hbWVzcGFjZSgpIDogc3RyaW5nO1xuICAgIGFic3RyYWN0IGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5Um9sZSA6IHN0cmluZ1tdID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UGF0aDogQXJyYXk8e1xuICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgfVxuICAgIH0+ID0gbnVsbDtcbiAgICBwcm90ZWN0ZWQgaGllcmFyY2h5UmVzdWx0czogSU1hcFJlc3VsdFtdID0gbnVsbDtcblxuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJlc2V0KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuXG4gICAgICAgIGxldCBhbmNlc3RvcnMgOiBOb2RlW10gPSBbXTtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KTtcbiAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBhbmNlc3Rvci5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2libGluZ3MgPSBzaWJsaW5ncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNpYmxpbmcgb2Ygc2libGluZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoc2libGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShhbmNlc3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByb2xlIDogc3RyaW5nID0gdGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucG9wKCk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgdGhpcy5wb3BIaWVyYXJjaHkoKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5cbi8vIENvbnRleHQgdGhhdCB3aWxsIGNhdXNlIHRoaXMgcnVsZSB0byBleGVjdXRlLiBcbi8vIENvbnRleHQgc3ludGF4OlxuLy8gICBUcmlnZ2Vyczpcbi8vICAgICBhcmlhOnJvbGUgLSBUcmlnZ2VycyBvbiBlbGVtZW50IHdpdGggQVJJQSByb2xlIHJvbGVcbi8vICAgICBhcmlhOnJvbGVbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdGhlIGVxdWl2YWxlbnQgbG9naWNhbCBcbi8vICAgICAgIGFyaWEtIGF0dHJpYnV0ZSAoZS5nLiwgYnV0dG9uW2Rpc2FibGVkXSB3aWxsIHRyaWdnZXIgb24gXG4vLyAgICAgICA8YnV0dG9uIGRpc2FibGVkPiBvciA8ZGl2IHJvbGU9XCJidXR0b25cIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiPilcbi8vICAgICByb2xlW2F0dHJpYnV0ZT12YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2Utc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgICB0byB2YWx1ZVxuLy8gICAgIHJvbGVbYXR0cmlidXRlfnZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgIGRvbTplbGVtZW50IC0gVHJpZ2dlcnMgb24gYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZVxuLy8gICAgIGRvbTplbGVtZW50W2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhIGRvbSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgICBkb206KlthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYWxsIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVcbi8vICAgQ29tYmluaW5nIHRyaWdnZXJzOlxuLy8gICAgIHRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoaW4gYW4gXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICAhdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIG5vdCB3aXRoaW5cbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxPnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBhbiBpbW1lZGlhdGUgcGFyZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMSt0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgaW1tZWRpYXRlIHByZXZpb3VzIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxfnRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBzb21lIGVhcmxpZXIgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgY29udGV4dCxjb250ZXh0IC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCBlaXRoZXIgY29udGV4dFxuZXhwb3J0IGNsYXNzIEF0dHJJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbixcbiAgICAgICAgcHVibGljIGF0dHI6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGVxPzogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgdmFsdWU/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgaWYgKCFpbmNsdXNpdmUgXG4gICAgICAgICAgICAgICAgJiYgKCh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDApKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSAhYXR0clwiK2VxK1wiIGNvbnRleHRcIik7ICAgIFxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdXNpdmUgJiYgKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCAmJiAoKHR5cGVvZiB2YWx1ZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdmFsdWUubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgZXF1aXZhbGVuY2UgY2hlY2sgd2l0aG91dCBhIHZhbHVlXCIpOyAgICBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKGNvbnRleHQ6IElNYXBSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgcnVsZUF0dHJQYXJ0ID0gdGhpczsgXG4gICAgICAgIGNvbnN0IGVsZW1BdHRycyA9IGNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgaWYgKCEocnVsZUF0dHJQYXJ0LmF0dHIgaW4gZWxlbUF0dHJzKSkge1xuICAgICAgICAgICAgcmV0dXJuICFydWxlQXR0clBhcnQuaW5jbHVzaXZlXG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmVxKSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgbm8gZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbmNsdXNpdmUgbWF0Y2ggYW5kIEkgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBhbmQgZXF1aXZhbGVuY2UgZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gZWxlbUF0dHJzW3J1bGVBdHRyUGFydC5hdHRyXTtcbiAgICAgICAgICAgIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIT1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIn5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiF+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgZXF1aXZhbGVuY2Ugb3BlcmF0b3Igbm90IHN1cHBvcnRlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFydEluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLCBcbiAgICAgICAgcHVibGljIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcm9sZTogc3RyaW5nLCBcbiAgICAgICAgcHVibGljIGF0dHJzOiBBdHRySW5mb1tdLCBcbiAgICAgICAgcHVibGljIGNvbm5lY3Rvcjogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCIqXCIgJiYgIWluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIiEqIGNvbnRleHQgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoIFxuICAgICAgICBjb250ZXh0SGllcjogUnVsZUNvbnRleHRIaWVyYXJjaHksXG4gICAgICAgIGhpZXJMZXZlbDogbnVtYmVyKSA6IGJvb2xlYW4gXG4gICAge1xuICAgICAgICBjb25zdCBydWxlUGFydCA9IHRoaXM7XG4gICAgICAgIGxldCBydWxlUm9sZU1hdGNoID0gKHJ1bGVQYXJ0Lm5hbWVzcGFjZSBpbiBjb250ZXh0SGllcikgJiYgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IHJ1bGVQYXJ0LnJvbGVcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSAhPT0gXCJub25lXCIgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIpO1xuICAgICAgICBpZiAocnVsZVJvbGVNYXRjaCBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQubmFtZXNwYWNlID09PSBcImRvbVwiIFxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIiN0ZXh0XCJcbiAgICAgICAgICAgICAgICB8fCBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIvI3RleHRcIikpIHtcbiAgICAgICAgICAgIHJ1bGVSb2xlTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlICYmICFydWxlUm9sZU1hdGNoKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBNYXRjaCB0aGUgYXR0cmlidXRlc1xuICAgICAgICBjb25zdCBydWxlQXR0cnMgPSBydWxlUGFydC5hdHRycztcbiAgICAgICAgY29uc3QgZWxlbUNvbnRleHQgPSBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF07XG4gICAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUF0dHJQYXJ0IG9mIHJ1bGVBdHRycykge1xuICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaCAmJiBydWxlQXR0clBhcnQubWF0Y2hlcyhlbGVtQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUpIG1hdGNoID0gIW1hdGNoO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb250ZXh0SW5mbyA6IFBhcnRJbmZvW10gPSBbXVxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0SGllck1hdGNoZXMgOiBzdHJpbmdbXSA9IGNvbnRleHQubWF0Y2goLyE/Wy9hLXpBLVo6MC05KlxcLV9dKyhcXFtbXlxcXV0rXFxdKSpbID4rfl0/L2cpO1xuICAgICAgICBsZXQgcmVzdWx0cyA6IFBhcnRJbmZvW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGV4dEhpZXJNYXRjaGVzKSB7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSBwYXJ0Lm1hdGNoKC8oIT8pKFsvYS16QS1aOjAtOSpcXC1fXSspKChcXFtbXlxcXV0rXFxdKSopKFsgPit+XT8pLyk7XG4gICAgICAgICAgICBsZXQgYXR0ckluZm8gOiBBdHRySW5mb1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJQYXJ0IG9mIHBhcnRzWzNdLm1hdGNoKC9cXFsoW15cXF1dKylcXF0vZykgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clBhcnRzID0gYXR0clBhcnQubWF0Y2goL1xcWyghPykoW2EtejpBLVoqXFwtX10rKSghP1s9fl0pPyhbXlxcXV0rKT9cXF0vKTtcbiAgICAgICAgICAgICAgICBhdHRySW5mby5wdXNoKG5ldyBBdHRySW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzFdICE9PSBcIiFcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzJdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1szXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzRdXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBuc1BhcnRzID0gcGFydHNbMl0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgbGV0IGluY2wgPSBwYXJ0c1sxXSAhPT0gXCIhXCI7XG4gICAgICAgICAgICBjb25zdCBucyA9IG5zUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCByb2xlID0gbnNQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5mbyA9IG5ldyBQYXJ0SW5mbyhpbmNsLCBucywgcm9sZSwgYXR0ckluZm8sIHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocGFydEluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dEluZm8gPSByZXN1bHRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhbkNvbnRleHQoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyEvZywgXCIgIVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsoWz4rfixdKS9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8oWz4rfixdKSArL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArL2csIFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQudHJpbSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gQ29udGV4dC5zcGxpdE11bHRpcGxlKENvbnRleHQuY2xlYW5Db250ZXh0KGNvbnRleHQpKTtcblxuICAgICAgICBsZXQgcmV0VmFsIDogQ29udGV4dFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGN0eCA9IG5ldyBDb250ZXh0KGNvbnRleHRzW2ldKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgcHJvY2Vzc2luZyBvZiBzcGxpdHRpbmcgb24gY29tbWEgLSBjb250ZXh0LGNvbnRleHRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKi9cbiAgICBzdGF0aWMgc3BsaXRNdWx0aXBsZShjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBbXTtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCIsXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjb250ZXh0LnNwbGl0KFwiLFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIFBhcnRJbmZvLCBBdHRySW5mbyB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgY2xlYXJDYWNoZXMgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IElzc3VlLCBSdWxlLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVSZXN1bHQsIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEhlbHBNYXAsIElFbmdpbmUsIE5sc01hcCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgSU1hcHBlciB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JUmVwb3J0XCI7XG5cbmNsYXNzIFdyYXBwZWRSdWxlIHtcbiAgICBuczogc3RyaW5nO1xuICAgIGlkeD86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yIChwdWJsaWMgcnVsZTogUnVsZSwgcHVibGljIHBhcnNlZEluZm8gOiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMubnMgPSB0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm9bdGhpcy5wYXJzZWRJbmZvLmNvbnRleHRJbmZvLmxlbmd0aC0xXS5uYW1lc3BhY2U7XG4gICAgICAgIENvbmZpZy5ERUJVRyAmJiBjb25zb2xlLmxvZyhcIkFkZGVkIFJ1bGU6XCIsIHJ1bGUuaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMucGFyc2VkSW5mbykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgY29udmVydGluZyB0aGUgbm9kZSBpbnRvIGEgc25pcHBldCB3aGljaCBjYW4gYmUgYWRkZWQgdG8gcmVwb3J0LlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIG5vZGUgYW5kIGV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgdGhlIGF0dHJpYnV0ZXMgYW5kIGJ1aWxkIHRoZSBzbmlwcGV0IGJhc2VkIG9uIHRoaXMuXG4gICAgICpcbiAgICAgKiBUT0RPOiBGdXR1cmUsIG1heWJlIHdlIGNhbiBleHRyYWN0IG1vcmUgdGhlbiBqdXN0IHNpbmdsZSBsaW5lLCBhZGQgbW9yZSBpbmZvIG9yIGV2ZW4gYWRkIGNsb3NpbmcgdGFncyBldGMuLi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgaHRtbCBlbGVtZW50IHRvIGNvbnZlcnQgaW50byBlbGVtZW50IHNuaXBwZXQgd2l0aCBub2RlIG5hbWUgYW5kIGF0dHJpYnV0ZXMgb25seS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gbm9kZVNuaXBwZXQgLSByZXR1cm4gdGhlIGVsZW1lbnQgc25pcHBldCBvZiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZCB3aGljaCBvbmx5IGNvbnRhaW5zLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlbmFtZSBhbmQgYXR0cmlidXRlcy4gaS5lLiA8dGFibGUgaWQ9XFxcImxheW91dF90YWJsZTFcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgdGhpc1xuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0Tm9kZVRvU25pcHBldChub2RlIDogRWxlbWVudCkge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICB2YXIgbm9kZVNuaXBwZXQgPSAnJztcblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBub2RlIG5hbWUgYW5kIGFkZCBpdCB0byB0aGUgbm9kZSBzbmlwcGV0XG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc8JyArIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgbm9kZSBhdHRyaWJ1dGVzIGFzIGFuIGFycmF5XG4gICAgICAgIHZhciBub2RlQXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGVyZSBhcmUgYXR0cmlidXRlcyBvbiB0aGlzIG5vZGVcbiAgICAgICAgaWYgKG5vZGVBdHRyaWJ1dGVzICE9PSBudWxsICYmIHR5cGVvZiBub2RlQXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGVzZXMgYXR0cmlidXRlcyBhbmQgYWRkIHRoZSBuYW1lIGFuZCB2YWx1ZSB0byB0aGUgbm9kZVNuaXBwZXQgd2hpY2ggd2lsbCBiZSByZXR1cm5lZFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVBdHRyaWJ1dGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgPT09IFwiZGF0YS1uYW1ld2Fsa1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB2YWx1ZS5cbiAgICAgICAgICAgICAgICBub2RlU25pcHBldCArPSAnICcgKyBub2RlQXR0cmlidXRlc1tpXS5uYW1lICsgJz1cIicgKyBub2RlQXR0cmlidXRlc1tpXS52YWx1ZSArICdcIic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbG9zZSB0aGUgbm9kZVxuICAgICAgICBub2RlU25pcHBldCArPSAnPic7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgcmV0dXJuIG5vZGVTbmlwcGV0O1xuICAgIH1cblxuICAgIHJ1bihlbmdpbmU6IEVuZ2luZSwgY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogSXNzdWVbXSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgcmVzdWx0czogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSB0aGlzLnJ1bGUucnVuKGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycjogRXJyb3IgPSBlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJVTEUgRVhDRVBUSU9OOlwiLHRoaXMucnVsZS5pZCwgY29udGV4dC5kb20ucm9sZVBhdGgsIGVyci5zdGFjayk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHRzKSByZXN1bHRzID0gW107XG5cbiAgICAgICAgaWYgKCEocmVzdWx0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IFtyZXN1bHRzXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZW5naW5lLmdldE1lc3NhZ2UodGhpcy5ydWxlLmlkLCByZXN1bHQucmVhc29uSWQsIHJlc3VsdC5tZXNzYWdlQXJncyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwYXRoW25zXSA9IGNvbnRleHRbbnNdLnJvbGVQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBydWxlSWQgPSB0aGlzLnJ1bGUuaWQucmVwbGFjZSgvXiguKilcXCRcXCRcXGQrJC8sIFwiJDFcIik7XG5cbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBydWxlSWQ6IHJ1bGVJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGNvbnRleHRbXCJkb21cIl0ubm9kZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHJ1bGVUaW1lOiBlbmRUaW1lLXN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICByZWFzb25JZDogcmVzdWx0LnJlYXNvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3M6IHJlc3VsdC5tZXNzYWdlQXJncyxcbiAgICAgICAgICAgICAgICBhcGlBcmdzOiByZXN1bHQuYXBpQXJncyxcbiAgICAgICAgICAgICAgICBib3VuZHM6IGNvbnRleHRbXCJkb21cIl0uYm91bmRzLFxuICAgICAgICAgICAgICAgIHNuaXBwZXQ6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9TbmlwcGV0KGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZ2luZSBpbXBsZW1lbnRzIElFbmdpbmUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgICAgICBjb25zdCBlbnYgPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ub2RlVHlwZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudjtcbiAgICAgICAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIGRlZmF1bHQgdG8gVVMgRW5nbGlzaFxuICAgICAgICBsZXQgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgIGlmIChlbnYpIHtcbiAgICAgICAgICAgIG5vZGVMYW5nID0gZW52LkxBTkcgfHwgZW52LkxBTkdVQUdFIHx8IGVudi5MQ19BTEwgfHwgZW52LkxDX01FU1NBR0VTO1xuICAgICAgICAgICAgaWYgKG5vZGVMYW5nICYmIG5vZGVMYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IG5vZGVMYW5nLnNwbGl0KFwiLlwiKVswXS5yZXBsYWNlKC9fL2csXCItXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzIHx8IFtub2RlTGFuZ107XG4gICAgfVxuICAgIG1hcHBlcnMgOiB7IFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwcGVyIH0gPSB7fTtcbiAgICBydWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFJ1bGUgfSA9IHt9O1xuICAgIHdyYXBwZWRSdWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFdyYXBwZWRSdWxlIH0gPSB7fTtcbiAgICBubHNNYXAgOiBObHNNYXAgPSB7fVxuICAgIGhlbHBNYXAgOiBIZWxwTWFwID0ge31cblxuICAgIHByaXZhdGUgaW5jbFJ1bGVzOiB7XG4gICAgICAgIFtuc1JvbGU6IHN0cmluZ106IFdyYXBwZWRSdWxlW11cbiAgICB9ID0ge31cblxuICAgIHByaXZhdGUgZXhjbFJ1bGVzOiB7XG4gICAgICAgIFtuc1JvbGU6IHN0cmluZ106IFdyYXBwZWRSdWxlW11cbiAgICB9ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBOZWVkIGEgRE9NIE1hcHBlciBhcyBhIG1pbmltdW1cbiAgICAgICAgdGhpcy5hZGRNYXBwZXIobmV3IERPTU1hcHBlcigpKTtcbiAgICB9XG5cbiAgICBydW4ocm9vdDogRG9jdW1lbnQgfCBOb2RlLCBvcHRpb25zPzoge30pOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwibnVsbCBkb2N1bWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm9vdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJvb3QgPSAocm9vdCBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJvb3Qub3duZXJEb2N1bWVudCAmJiAoKHJvb3Qub3duZXJEb2N1bWVudCBhcyBhbnkpLlBUX0NIRUNLX0hJRERFTl9DT05URU5UID0gZmFsc2UpO1xuICAgICAgICBjbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgY29uc3QgcmV0VmFsIDogUmVwb3J0ID0ge1xuICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICBudW1FeGVjdXRlZDogMCxcbiAgICAgICAgICAgIHJ1bGVUaW1lOiAwLFxuICAgICAgICAgICAgdG90YWxUaW1lOiAwXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvbGUgbWFwcGVyc1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBpbiB0aGlzLm1hcHBlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLnJlc2V0KHJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dCBkZXRlY3RvclxuICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcnVsZSBtYXBwZXJzXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0SGllcmFyY2hpZXMgOiBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHt9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBpbiB0aGlzLm1hcHBlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRIaWVyYXJjaGllc1tuYW1lc3BhY2VdID0gdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ub3BlblNjb3BlKHdhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG5hbWVzcGFjZSA9PT0gXCJkb21cIiAmJiB3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgZWxlbSA9IHdhbGtlci5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiAoaWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChyb290Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpID09PSBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXVtjb250ZXh0SGllcmFyY2hpZXNbXCJkb21cIl0ubGVuZ3RoLTFdLnJvbGVQYXRoID0gXCIvLypbQGlkPSdcIitpZCtcIiddXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5jbG9zZVNjb3BlKHdhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSAhPT0gMTEgXG4gICAgICAgICAgICAgICAgJiYgKERPTVdhbGtlci5pc05vZGVWaXNpYmxlKHdhbGtlci5ub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImhlYWRcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm1ldGFcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICB8fCAhRE9NVXRpbC5nZXRBbmNlc3Rvcih3YWxrZXIubm9kZSwgW1wiYm9keVwiXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA6IFJ1bGVDb250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBucyBpbiBjb250ZXh0SGllcmFyY2hpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNIaWVyID0gY29udGV4dEhpZXJhcmNoaWVzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEhpZXIgPSBuc0hpZXJbbnNIaWVyLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtuc10gPSBsYXN0SGllcjsgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUnVsZXMgPSB0aGlzLmdldE1hdGNoaW5nUnVsZXMoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwTWF0Y2ggPSB7fVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hpbmdSdWxlIG9mIG1hdGNoaW5nUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgbWF0Y2hpbmdSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcE1hdGNoW2RlcF0pIGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGZpbGxzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA6IElzc3VlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG1hdGNoaW5nUnVsZS5ydW4odGhpcywgY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXBwZXIgc2hvd3MgZXJyb3IgaW4gY29uc29sZS4gU2tpcCB0aGlzIHJ1bGUgYXMgTi9BXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBraWxsIHRoZSBlbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG91dCBvZiBzY29wZSwgaXQgZnVsZmlsbHMgdGhlIGRlcGVuZGVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hdGNoW21hdGNoaW5nUnVsZS5ydWxlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5ydWxlVGltZSArPSByZXN1bHQucnVsZVRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLm51bUV4ZWN1dGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZVsxXSA9PT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbcmVzdWx0LnJ1bGVJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpO1xuICAgICAgICBjbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgcmV0VmFsLnRvdGFsVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLXN0YXJ0O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldFZhbCk7XG4gICAgfVxuXG4gICAgZW5hYmxlUnVsZXMocnVsZUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgb2YgcnVsZUlkcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZU1hcCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBSdWxlIElkXCIscnVsZUlkLFwiY291bGQgbm90IGJlIGVuYWJsZWQuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZU1hcFtydWxlSWRdO1xuICAgIH1cblxuICAgIGdldFJ1bGVzSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgYWRkUnVsZXMocnVsZXM6IFJ1bGVbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZShydWxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICB9XG5cbiAgICBhZGRSdWxlKHJ1bGU6IFJ1bGUsIHNraXBTb3J0PzogYm9vbGVhbikge1xuICAgICAgICBsZXQgY3R4cyA6Q29udGV4dFtdID0gQ29udGV4dC5wYXJzZShydWxlLmNvbnRleHQpO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgY29uc3QgcnVsZUlkID0gcnVsZS5pZDtcbiAgICAgICAgaWYgKHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTklORzogUnVsZVwiLHJ1bGVJZCxcImFscmVhZHkgYWRkZWQgdG8gZW5naW5lLiBJZ25vcmluZy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXSA9IHJ1bGU7XG4gICAgICAgIGZvciAoY29uc3QgY3R4IG9mIGN0eHMpIHtcbiAgICAgICAgICAgIGxldCB3cmFwSWQgPSBydWxlSWQ7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDEpIHtcbiAgICAgICAgICAgICAgICB3cmFwSWQgPSBydWxlSWQrXCIkJFwiK2lkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgbGV0IHdyYXBwZWRSdWxlID0gbmV3IFdyYXBwZWRSdWxlKHJ1bGUsY3R4KTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlZFJ1bGVNYXBbd3JhcElkXSA9IHdyYXBwZWRSdWxlO1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gd3JhcHBlZFJ1bGUucGFyc2VkSW5mby5jb250ZXh0SW5mbztcbiAgICAgICAgICAgIGxldCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyUm9sZSA9IGxhc3RQYXJ0Lm5hbWVzcGFjZStcIjpcIitsYXN0UGFydC5yb2xlO1xuICAgICAgICAgICAgaWYgKGxhc3RQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwU29ydCkge1xuICAgICAgICAgICAgdGhpcy5fc29ydFJ1bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc29ydFJ1bGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIHRoaXMubmxzTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEhlbHBNYXAobWFwOiBIZWxwTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5oZWxwTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1lc3NhZ2UocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZywgbXNnQXJncz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMubmxzTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgbGV0IG1lc3NhZ2VUZW1wbGF0ZSA9IHRoaXMubmxzTWFwW3J1bGVJZF1bcnVsZUlkeCB8fCAwXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlVGVtcGxhdGUpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZyxcbiAgICAgICAgICAgIChtYXRjaGVkU3RyLCBtYXRjaGVkTnVtLCBtYXRjaGVkSW5kZXgpID0+IG1zZ0FyZ3NbbWF0Y2hlZE51bV1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCByZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBhcmNoaXZlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWFyY2hpdmVJZCkge1xuICAgICAgICAgICAgLy8gU2V0IHRvIHRoZSBsYXRlc3RcbiAgICAgICAgICAgIGFyY2hpdmVJZCA9IFwibGF0ZXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke0NvbmZpZy5oZWxwUm9vdH0vJHthcmNoaXZlSWR9L2RvYyR7dGhpcy5nZXRIZWxwUmVsKHJ1bGVJZCwgcmVhc29uSWQpfWA7XG4gICAgfVxuXG4gICAgZ2V0SGVscFJlbChydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMuaGVscE1hcCkpIHJldHVybiBydWxlSWQ7XG4gICAgICAgIHJ1bGVJZHggPSBydWxlSWR4IHx8IDA7XG4gICAgICAgIGxldCBoZWxwU3RyID0gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVJZHggaW4gdGhpcy5oZWxwTWFwW3J1bGVJZF0pIHtcbiAgICAgICAgICAgIGhlbHBTdHIgPSB0aGlzLmhlbHBNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWxwU3RyKSByZXR1cm4gcnVsZUlkK1wiX1wiK3J1bGVJZHg7XG4gICAgICAgIHJldHVybiBoZWxwU3RyO1xuICAgIH1cblxuICAgIGFkZE1hcHBlcihtYXBwZXI6IElNYXBwZXIpIHtcbiAgICAgICAgdGhpcy5tYXBwZXJzW21hcHBlci5nZXROYW1lc3BhY2UoKV0gPSBtYXBwZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2gocnVsZTogV3JhcHBlZFJ1bGUsXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuXG4gICAge1xuICAgICAgICBsZXQgcnVsZVBhcnRzID0gcnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICBsZXQgcGFydElkeCA9IHJ1bGVQYXJ0cy5sZW5ndGgtMTtcbiAgICAgICAgbGV0IGN1ck5TID0gcnVsZVBhcnRzW3BhcnRJZHhdLm5hbWVzcGFjZTtcbiAgICAgICAgbGV0IGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgY29uc3QgY29udGV4dE5vZGUgPSBjdXJIaWVyLm5vZGU7XG5cbiAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgcnVsZSBwYXJ0IGRvZXNuJ3QgbWF0Y2ggdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCB3ZSBkb24ndCBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKCFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBvbmx5IG9uZSBwYXJ0LCB3ZSBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKHJ1bGVQYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZWQgdG8gZGVhbCB3aXRoIHBhcmVudCBwYXJ0cy4gVG8gd2FsayB0aGUgaGllcmFyY2h5LCB0aGVzZSBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGFsbCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuIENvbmZpcm0gdGhhdCBpcyB0cnVlLlxuICAgICAgICBjdXJOUyA9IHJ1bGVQYXJ0c1swXS5uYW1lc3BhY2U7XG4gICAgICAgIGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICBpZiAocnVsZVBhcnRzLnNsaWNlKDAsIHJ1bGVQYXJ0cy5sZW5ndGgtMSkuc29tZShwYXJ0ID0+IHBhcnQubmFtZXNwYWNlICE9PSBjdXJOUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtFUlJPUl0gUnVsZSAke3J1bGUucnVsZS5pZH0gaGFzIGluY29uc2l0ZW50IHBhcmVudCBuYW1lc3BhY2VzYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBub2RlIG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCBtb3ZlIHVwIHBhc3QgaXQsIG90aGVyd2lzZSwgc3RhcnQgYXQgdGhlIGVuZFxuICAgICAgICBsZXQgaGllcklkeCA9IGNvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGggLSAoY3VySGllci5ub2RlLmlzU2FtZU5vZGUoY29udGV4dE5vZGUpID8gMiA6IDEpO1xuICAgICAgICB3aGlsZSAoaGllcklkeCA+PSAwICYmIHBhcnRJZHggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHJ1bGVQYXJ0c1twYXJ0SWR4XTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXNQYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIGhpZXJJZHgpO1xuICAgICAgICAgICAgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lcyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdXNpdmUgYW5jZXN0b3IgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZG9lc24ndCBtYXRjaCwganVzdCBtb3ZlIHVwIHRoZSByb2xlIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgICAgICAtLWhpZXJJZHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSBhbmNlc3RvciBtYXRjaCBhbmQgY3VycmVudCBkb2Vzbid0IG1hdGNoIC0gY2hlY2sgZm9yIG90aGVyIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoSWR4ID0gaGllcklkeC0xOyAhcGFyZW50TWF0Y2ggJiYgc2VhcmNoSWR4ID49IDA7IC0tc2VhcmNoSWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNYXRjaCA9ICFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgc2VhcmNoSWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGNvbm5lY3RvciBcIitwYXJ0LmNvbm5lY3RvcitcIiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0SWR4ID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nUnVsZXMoY3R4SGllciA6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IFdyYXBwZWRSdWxlW10ge1xuICAgICAgICBsZXQgbWF0Y2hlcyA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTWF0Y2hlcyhydWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUucnVsZS5lbmFibGVkICYmIEVuZ2luZS5tYXRjaChydWxlLCBjdHhIaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbnMgaW4gY3R4SGllcikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBucytcIjpcIisoY3R4SGllcltuc10ubGVuZ3RoID4gMCA/IGN0eEhpZXJbbnNdW2N0eEhpZXJbbnNdLmxlbmd0aC0xXS5yb2xlIDogXCJub25lXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW3JvbGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgeFJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoeFJvbGUgIT09IHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmV4Y2xSdWxlc1t4Um9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb2xlICE9PSBucytcIjpub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZS5zdGFydHNXaXRoKG5zK1wiOi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5zK1wiOi8qXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6LypcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6KlwiIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW25zK1wiOipcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERlcHMobWF0Y2hlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIHJ1bGVzIGluIG9yZGVyIHRvIGV4ZWN1dGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgICogQHBhcmFtIGluUnVsZXMgTGlzdCBvZiB3cmFwcGVkIHJ1bGVzIHRvIHNvcnRcbiAgICAgKiBAcmV0dXJucyBTb3J0ZWQgbGlzdCBvZiB3cmFwcGVkIHJ1bGVzXG4gICAgICovXG4gICAgc29ydERlcHMoaW5SdWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICBsZXQgZGVwUnVsZXM6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGluUnVsZXMpIHtcbiAgICAgICAgICAgIGRlcFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCByZXRWYWwgOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGxldCBpZFRvUnVsZSA9IHt9O1xuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHJ1bGVzLiBJZiB0aGF0IHJ1bGUncyBkZXBlbmRlbmNpZXMgY2FuIGJlIG1ldCBieSBydWxlcyBhbHJlYWR5IGluIHRoZSBsaXN0LCBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgLy8gUmVwZWF0IHVudGlsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHNhdGlzZmllZCBsaXN0XG4gICAgICAgIC8vIElmIGEgcnVsZSBjYW5ub3QgYmUgc2F0aXNmaWVkLCBpdCB3aWxsIG5ldmVyIGV4ZWN1dGUsIHNvIGl0IGNhbiBiZSBkcm9wcGVkLlxuICAgICAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxkZXBSdWxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwUnVsZSA9IGRlcFJ1bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5pZCBpbiBpZFRvUnVsZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGFsbE1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcyAmJiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkZXBJZCBpbiBpZFRvUnVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXBSdWxlLnJ1bGUucHJlcmVxcyAmJiBkZXBSdWxlLnJ1bGUucHJlcmVxcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZvciAoY29uc3QgZGVwSWQgb2YgZGVwUnVsZS5ydWxlLnByZXJlcXMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGRlcFJ1bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZFRvUnVsZVtkZXBSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwUnVsZXMuc3BsaWNlKGlkeC0tLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGNoYW5nZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgc3RhdGljIERFQlVHID0gZmFsc2U7XG4gICAgc3RhdGljIGhlbHBSb290ID0gXCJodHRwczovL2FibGUuaWJtLmNvbS9ydWxlcy9hcmNoaXZlc1wiO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xvclV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBDU1NDb2xvckxvb2t1cCA9IHtcbiAgICAgICAgXCJhbGljZWJsdWVcIjogXCIjZjBmOGZmXCIsXG4gICAgICAgIFwiYW50aXF1ZXdoaXRlXCI6IFwiI2ZhZWJkN1wiLFxuICAgICAgICBcImFxdWFcIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiYXF1YW1hcmluZVwiOiBcIiM3ZmZmZDRcIixcbiAgICAgICAgXCJhenVyZVwiOiBcIiNmMGZmZmZcIixcbiAgICAgICAgXCJiZWlnZVwiOiBcIiNmNWY1ZGNcIixcbiAgICAgICAgXCJiaXNxdWVcIjogXCIjZmZlNGM0XCIsXG4gICAgICAgIFwiYmxhY2tcIjogXCIjMDAwMDAwXCIsXG4gICAgICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogXCIjZmZlYmNkXCIsXG4gICAgICAgIFwiYmx1ZVwiOiBcIiMwMDAwZmZcIixcbiAgICAgICAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICAgICAgICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICAgICAgICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgICAgICAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gICAgICAgIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgICAgICAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gICAgICAgIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gICAgICAgIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gICAgICAgIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gICAgICAgIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgICAgICAgXCJjeWFuXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImRhcmtibHVlXCI6IFwiIzAwMDA4YlwiLFxuICAgICAgICBcImRhcmtjeWFuXCI6IFwiIzAwOGI4YlwiLFxuICAgICAgICBcImRhcmtnb2xkZW5yb2RcIjogXCIjYjg4NjBiXCIsXG4gICAgICAgIFwiZGFya2dyYXlcIjogXCIjYTlhOWE5XCIsXG4gICAgICAgIFwiZGFya2dyZWVuXCI6IFwiIzAwNjQwMFwiLFxuICAgICAgICBcImRhcmtraGFraVwiOiBcIiNiZGI3NmJcIixcbiAgICAgICAgXCJkYXJrbWFnZW50YVwiOiBcIiM4YjAwOGJcIixcbiAgICAgICAgXCJkYXJrb2xpdmVncmVlblwiOiBcIiM1NTZiMmZcIixcbiAgICAgICAgXCJkYXJrb3JhbmdlXCI6IFwiI2ZmOGMwMFwiLFxuICAgICAgICBcImRhcmtvcmNoaWRcIjogXCIjOTkzMmNjXCIsXG4gICAgICAgIFwiZGFya3JlZFwiOiBcIiM4YjAwMDBcIixcbiAgICAgICAgXCJkYXJrc2FsbW9uXCI6IFwiI2U5OTY3YVwiLFxuICAgICAgICBcImRhcmtzZWFncmVlblwiOiBcIiM4ZmJjOGZcIixcbiAgICAgICAgXCJkYXJrc2xhdGVibHVlXCI6IFwiIzQ4M2Q4YlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWdyYXlcIjogXCIjMmY0ZjRmXCIsXG4gICAgICAgIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgICAgICAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICAgICAgICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICAgICAgICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICAgICAgICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gICAgICAgIFwiZG9kZ2VyYmx1ZVwiOiBcIiMxZTkwZmZcIixcbiAgICAgICAgXCJmaXJlYnJpY2tcIjogXCIjYjIyMjIyXCIsXG4gICAgICAgIFwiZmxvcmFsd2hpdGVcIjogXCIjZmZmYWYwXCIsXG4gICAgICAgIFwiZm9yZXN0Z3JlZW5cIjogXCIjMjI4YjIyXCIsXG4gICAgICAgIFwiZnVjaHNpYVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gICAgICAgIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgICAgICAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICAgICAgICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgICAgICAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICAgICAgICBcImdyZWVuXCI6IFwiIzAwODAwMFwiLFxuICAgICAgICBcImdyZWVueWVsbG93XCI6IFwiI2FkZmYyZlwiLFxuICAgICAgICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICAgICAgICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gICAgICAgIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICAgICAgICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgICAgICAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgICAgICAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgICAgICAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgICAgICAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICAgICAgICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgICAgICAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gICAgICAgIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICAgICAgICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gICAgICAgIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICAgICAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICAgICAgICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICAgICAgICBcImxpZ2h0cGlua1wiOiBcIiNmZmI2YzFcIixcbiAgICAgICAgXCJsaWdodHNhbG1vblwiOiBcIiNmZmEwN2FcIixcbiAgICAgICAgXCJsaWdodHNlYWdyZWVuXCI6IFwiIzIwYjJhYVwiLFxuICAgICAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBcIiM4N2NlZmFcIixcbiAgICAgICAgXCJsaWdodHNsYXRlZ3JheVwiOiBcIiM3Nzg4OTlcIixcbiAgICAgICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBcIiNiMGM0ZGVcIixcbiAgICAgICAgXCJsaWdodHllbGxvd1wiOiBcIiNmZmZmZTBcIixcbiAgICAgICAgXCJsaW1lXCI6IFwiIzAwZmYwMFwiLFxuICAgICAgICBcImxpbWVncmVlblwiOiBcIiMzMmNkMzJcIixcbiAgICAgICAgXCJsaW5lblwiOiBcIiNmYWYwZTZcIixcbiAgICAgICAgXCJtYWdlbnRhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgICAgICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiIzY2Y2RhYVwiLFxuICAgICAgICBcIm1lZGl1bWJsdWVcIjogXCIjMDAwMGNkXCIsXG4gICAgICAgIFwibWVkaXVtb3JjaGlkXCI6IFwiI2JhNTVkM1wiLFxuICAgICAgICBcIm1lZGl1bXB1cnBsZVwiOiBcIiM5MzcwZDhcIixcbiAgICAgICAgXCJtZWRpdW1zZWFncmVlblwiOiBcIiMzY2IzNzFcIixcbiAgICAgICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIjN2I2OGVlXCIsXG4gICAgICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIjMDBmYTlhXCIsXG4gICAgICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFwiIzQ4ZDFjY1wiLFxuICAgICAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBcIiNjNzE1ODVcIixcbiAgICAgICAgXCJtaWRuaWdodGJsdWVcIjogXCIjMTkxOTcwXCIsXG4gICAgICAgIFwibWludGNyZWFtXCI6IFwiI2Y1ZmZmYVwiLFxuICAgICAgICBcIm1pc3R5cm9zZVwiOiBcIiNmZmU0ZTFcIixcbiAgICAgICAgXCJtb2NjYXNpblwiOiBcIiNmZmU0YjVcIixcbiAgICAgICAgXCJuYXZham93aGl0ZVwiOiBcIiNmZmRlYWRcIixcbiAgICAgICAgXCJuYXZ5XCI6IFwiIzAwMDA4MFwiLFxuICAgICAgICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gICAgICAgIFwib2xpdmVcIjogXCIjODA4MDAwXCIsXG4gICAgICAgIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICAgICAgICBcIm9yYW5nZVwiOiBcIiNmZmE1MDBcIixcbiAgICAgICAgXCJvcmFuZ2VyZWRcIjogXCIjZmY0NTAwXCIsXG4gICAgICAgIFwib3JjaGlkXCI6IFwiI2RhNzBkNlwiLFxuICAgICAgICBcInBhbGVnb2xkZW5yb2RcIjogXCIjZWVlOGFhXCIsXG4gICAgICAgIFwicGFsZWdyZWVuXCI6IFwiIzk4ZmI5OFwiLFxuICAgICAgICBcInBhbGV0dXJxdW9pc2VcIjogXCIjYWZlZWVlXCIsXG4gICAgICAgIFwicGFsZXZpb2xldHJlZFwiOiBcIiNkODcwOTNcIixcbiAgICAgICAgXCJwYXBheWF3aGlwXCI6IFwiI2ZmZWZkNVwiLFxuICAgICAgICBcInBlYWNocHVmZlwiOiBcIiNmZmRhYjlcIixcbiAgICAgICAgXCJwZXJ1XCI6IFwiI2NkODUzZlwiLFxuICAgICAgICBcInBpbmtcIjogXCIjZmZjMGNiXCIsXG4gICAgICAgIFwicGx1bVwiOiBcIiNkZGEwZGRcIixcbiAgICAgICAgXCJwb3dkZXJibHVlXCI6IFwiI2IwZTBlNlwiLFxuICAgICAgICBcInB1cnBsZVwiOiBcIiM4MDAwODBcIixcbiAgICAgICAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gICAgICAgIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICAgICAgICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgICAgICAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgICAgICAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gICAgICAgIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgICAgICAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgICAgICAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgICAgICAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gICAgICAgIFwic2lsdmVyXCI6IFwiI2MwYzBjMFwiLFxuICAgICAgICBcInNreWJsdWVcIjogXCIjODdjZWViXCIsXG4gICAgICAgIFwic2xhdGVibHVlXCI6IFwiIzZhNWFjZFwiLFxuICAgICAgICBcInNsYXRlZ3JheVwiOiBcIiM3MDgwOTBcIixcbiAgICAgICAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICAgICAgICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICAgICAgICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgICAgICAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gICAgICAgIFwidGVhbFwiOiBcIiMwMDgwODBcIixcbiAgICAgICAgXCJ0aGlzdGxlXCI6IFwiI2Q4YmZkOFwiLFxuICAgICAgICBcInRvbWF0b1wiOiBcIiNmZjYzNDdcIixcbiAgICAgICAgXCJ0dXJxdW9pc2VcIjogXCIjNDBlMGQwXCIsXG4gICAgICAgIFwidmlvbGV0XCI6IFwiI2VlODJlZVwiLFxuICAgICAgICBcIndoZWF0XCI6IFwiI2Y1ZGViM1wiLFxuICAgICAgICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcIndoaXRlc21va2VcIjogXCIjZjVmNWY1XCIsXG4gICAgICAgIFwieWVsbG93XCI6IFwiI2ZmZmYwMFwiLFxuICAgICAgICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICAgICAgICBcImJ1dHRvbnRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuODQ3KVwiLFxuICAgICAgICBcImJ1dHRvbmZhY2VcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwiZ3JheXRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjQ3KVwiXG4gICAgfVxuXG5cbiAgICAvLyBSZXdyaXRlIHRoZSBjb2xvciBvYmplY3QgdG8gYWNjb3VudCBmb3IgYWxwaGFcbiAgICBwdWJsaWMgc3RhdGljIENvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIG5ldyBDb2xvck9iaigyNTUsIDI1NSwgMjU1LCAwKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0aGlzUmVkID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMyksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzR3JlZW4gPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNCbHVlID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNyksIDE2KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlXG4gICAgfTtcblxuIHB1YmxpYyBzdGF0aWMgQ29sb3JDb21ibyhydWxlQ29udGV4dCA6IEhUTUxFbGVtZW50KSB7XG4gICAgdHJ5IHsgXG4gICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxKSBcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaCh3YWxrTm9kZSk7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHJldFZhbCA9IHtcbiAgICAgICAgICAgIFwiaGFzR3JhZGllbnRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImhhc0JHSW1hZ2VcIjogZmFsc2UsXG4gICAgICAgICAgICBcInRleHRTaGFkb3dcIjogZmFsc2UsXG4gICAgICAgICAgICBcImZnXCI6IG51bGwsXG4gICAgICAgICAgICBcImJnXCI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0YXJ0XG4gICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIHZhciBjb21wU3R5bGVDb2xvciA9IGNTdHlsZS5jb2xvcjtcbiAgICAgICAgaWYgKCFjb21wU3R5bGVDb2xvcilcbiAgICAgICAgICAgIGNvbXBTdHlsZUNvbG9yID0gXCJibGFja1wiO1xuICAgICAgICB2YXIgZmcgPSBDb2xvclV0aWwuQ29sb3IoY29tcFN0eWxlQ29sb3IpO1xuICAgICAgICB2YXIgcmVDb2xvciA9IC90cmFuc3BhcmVudHxyZ2JhP1xcKFteKV0rXFwpL2dpO1xuICAgICAgICB2YXIgZ3Vlc3NHcmFkQ29sb3IgPSBmdW5jdGlvbiAoZ3JhZExpc3QsIGJnQ29sb3IsIGZnQ29sb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjb2xvciwgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdyYWRMaXN0Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRMaXN0O1xuXG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdFJhdGlvID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpR3JhZCA9IDE7IGlHcmFkIDwgZ3JhZExpc3QubGVuZ3RoOyArK2lHcmFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWQgLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gLjE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RlcCA+IC4wMDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICsgc3RlcCA8PSAxICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggLSBzdGVwID49IDAgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggLSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgLyAxMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmFsbFdvcnN0UmF0aW8gPT09IG51bGwgfHwgb3ZlcmFsbFdvcnN0UmF0aW8gPiB3b3JzdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3RSYXRpbyA9IHdvcnN0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3QgPSB3b3JzdENvbG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyYWxsV29yc3Q7IC8vIHJldHVybiB0aGUgZGFya2VzdCBjb2xvclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJnQ29sb3I7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHByaW9yU3RhY2tCRyA9IENvbG9yVXRpbC5Db2xvcihcIndoaXRlXCIpO1xuICAgICAgICB2YXIgdGhpc1N0YWNrT3BhY2l0eSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgIC8vIEFuY2VzdG9ycyBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wbW9zdCBwYXJlbnQgdG93YXJkIHRoZSBjaGlsZFxuICAgICAgICB3aGlsZSAoYW5jZXN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgIC8vdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgICAgIC8vIGNTdHlsZSBpcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBsYXllclxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHByb2NOZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzQmdDb2xvciBpcyB0aGUgY29sb3Igb2YgdGhpcyBsYXllciBvciBudWxsIGlmIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdmFyIHRoaXNCZ0NvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcihjU3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZ3JhZGllbnQgaW52b2x2ZWQsIHNldCB0aGlzQmdDb2xvciB0byB0aGUgd29yc3QgY29sb3IgY29tYmluYXRpb24gYXZhaWxhYmxlIGFnYWluc3QgdGhlIGZvcmVncm91bmRcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBncmFkQ29sb3JzIDogc3RyaW5nW10gPSBjU3R5bGUuYmFja2dyb3VuZEltYWdlLm1hdGNoKHJlQ29sb3IpO1xuICAgICAgICAgICAgICAgIGlmIChncmFkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmFkQ29sb3JDb21wIDogQ29sb3JPYmpbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWRDb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZENvbG9yc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21wID0gQ29sb3JVdGlsLkNvbG9yKGdyYWRDb2xvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbXAuYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBjb2xvckNvbXAuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1peCB0aGUgZ3JkaWVudCBiZyBjb2xvciB3aXQgcGFyZW50IGJnIGlmIGFscGhhIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcFN0YWNrQmcgPSB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29tcCA9IGNvbG9yQ29tcC5nZXRPdmVybGF5Q29sb3IoY29tcFN0YWNrQmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JDb21wLnB1c2goY29sb3JDb21wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IGd1ZXNzR3JhZENvbG9yKGdyYWRDb2xvckNvbXAsIHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRywgZmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1zb2xpZCBvcGFjaXR5XG4gICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gbnVsbCB8fCAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KSA8IDEpKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IHN0YWNrLCByZXNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kcyBhbmQgZ3JhZGllbnQgY29sb3IgYmFja2dyb3VuZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGFscmVhZHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciwgYmxlbmQgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpc1N0YWNrQWxwaGEgPSB0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjNTI2OiBJZiB0aGlzQmdDb2xvciBoYWQgYW4gYWxwaGEgdmFsdWUsIGl0IG1heSBub3QgZXhwb3NlIHRocm91Z2ggdGhpc1N0YWNrQkcgaW4gdGhlIGFib3ZlIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB3aXBlIG91dCB0aGUgZ3JhZGllbnQgaW5mbyBpZiB0aGlzIGxheWVyIHdhcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCAmJiAodGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wKSA9PT0gMS4wICYmICh0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgIT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgZGVsZXRlIGZnLmFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGZnLmFscGhhID0gKGZnLmFscGhhIHx8IDEpICogdGhpc1N0YWNrT3BhY2l0eTtcbiAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsLmZnID0gZmc7XG4gICAgICAgIHJldFZhbC5iZyA9IHByaW9yU3RhY2tCRztcblxuICAgICAgICBpZiAoY1N0eWxlLnRleHRTaGFkb3cgJiYgY1N0eWxlLnRleHRTaGFkb3cgIT09ICdub25lJylcbiAgICAgICAgICAgIHJldFZhbC50ZXh0U2hhZG93ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck9iaiB7XG4gICAgcmVkIDogbnVtYmVyO1xuICAgIGdyZWVuIDogbnVtYmVyO1xuICAgIGJsdWUgOiBudW1iZXI7XG4gICAgYWxwaGEgOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWQgOiBzdHJpbmcgfCBudW1iZXIsIGdyZWVuIDogc3RyaW5nIHwgbnVtYmVyLCBibHVlIDogc3RyaW5nIHwgbnVtYmVyLCBhbHBoYT8gOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gZml4Q29tcG9uZW50KGNvbXAgOiBzdHJpbmcgfCBudW1iZXIpIDogbnVtYmVyIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXApICE9IHR5cGVvZiAoXCJcIikpIHJldHVybiBjb21wIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGxldCBjb21wU3RyID0gY29tcCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb21wU3RyID0gY29tcFN0ci50cmltKCk7XG4gICAgICAgICAgICBpZiAoY29tcFN0cltjb21wU3RyLmxlbmd0aCAtIDFdICE9IFwiJVwiKSByZXR1cm4gcGFyc2VJbnQoY29tcFN0cik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGNvbXBTdHIuc3Vic3RyaW5nKDAsIGNvbXBTdHIubGVuZ3RoIC0gMSkpICogMi41NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWQgPSBmaXhDb21wb25lbnQocmVkKTtcbiAgICAgICAgdGhpcy5ncmVlbiA9IGZpeENvbXBvbmVudChncmVlbik7XG4gICAgICAgIHRoaXMuYmx1ZSA9IGZpeENvbXBvbmVudChibHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodHlwZW9mIChhbHBoYSkgPT09IHR5cGVvZiAoXCJcIikpID8gcGFyc2VGbG9hdChhbHBoYSBhcyBzdHJpbmcpIDogYWxwaGEgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9IZXhIZWxwKHZhbHVlIDogbnVtYmVyKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBNYXRoLnJvdW5kKHZhbHVlKS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgcmV0VmFsO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH07XG5cbiAgICB0b0hleCgpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy50b0hleEhlbHAodGhpcy5yZWQpICsgdGhpcy50b0hleEhlbHAodGhpcy5ncmVlbikgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmJsdWUpO1xuICAgIH07XG5cbiAgICBjb250cmFzdFJhdGlvKGJnQ29sb3IgOiBDb2xvck9iaikgeyBcbiAgICAgICAgbGV0IGZnQ29sb3I6IENvbG9yT2JqID0gdGhpcztcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICBmZ0NvbG9yID0gdGhpcy5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgXG4gICAgICAgIGxldCBsdW0xID0gZmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBpZiAoIWJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UpIHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBiZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgcyArPSBrZXkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxlcnQoYmdDb2xvcik7XG4gICAgICAgICAgICBhbGVydChzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbHVtMiA9IGJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgbGV0IHJhdGlvID0gKGx1bTEgPiBsdW0yKSA/IChsdW0xICsgLjA1KSAvIChsdW0yICsgLjA1KSA6IChsdW0yICsgLjA1KSAvIChsdW0xICsgLjA1KTtcbiAgICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICByZWxhdGl2ZUx1bWluYW5jZSgpIDogbnVtYmVyIHtcbiAgICAgICAgbGV0IFIgPSB0aGlzLnJlZCAvIDI1NS4wO1xuICAgICAgICBsZXQgRyA9IHRoaXMuZ3JlZW4gLyAyNTUuMDtcbiAgICAgICAgbGV0IEIgPSB0aGlzLmJsdWUgLyAyNTUuMDtcbiAgICAgICAgUiA9IFIgPD0gLjA0MDQ1ID8gUiAvIDEyLjkyIDogTWF0aC5wb3coKFIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBHID0gRyA8PSAuMDQwNDUgPyBHIC8gMTIuOTIgOiBNYXRoLnBvdygoRyArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEIgPSBCIDw9IC4wNDA0NSA/IEIgLyAxMi45MiA6IE1hdGgucG93KChCICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICB9O1xuXG4gICAgbWl4KGNvbG9yMiA6IENvbG9yT2JqLCBwZXJjVGhpcyA6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGNvbG9yMi5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWxwaGFUaGlzID0gdGhpcy5hbHBoYSA/IHRoaXMuYWxwaGEgOiAxO1xuICAgICAgICAgICAgbGV0IGFscGhhT3RoZXIgPSBjb2xvcjIuYWxwaGEgPyBjb2xvcjIuYWxwaGEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZSxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIGFscGhhVGhpcyArICgxIC0gcGVyY1RoaXMpICogYWxwaGFPdGhlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBnZXRPdmVybGF5Q29sb3IoYmdDb2xvciA6IENvbG9yT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuYWxwaGEgPj0gMSkge1xuICAgICAgICAgICAgLy8gTm8gbWl4aW5nIHJlcXVpcmVkIC0gaXQncyBvcGFxdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMCkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkludmFsaWQgYWxwaGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChiZ0NvbG9yLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiICYmIGJnQ29sb3IuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiQ2Fubm90IG1peCB3aXRoIGEgYmFja2dyb3VuZCBhbHBoYVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLm1peChiZ0NvbG9yLCB0aGlzLmFscGhhKTtcbiAgICAgICAgZGVsZXRlIHJldFZhbC5hbHBoYTsgXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ1NTQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBsZXQgdGhpc1JlZCA9IC0xO1xuICAgICAgICBsZXQgdGhpc0dyZWVuID0gLTE7XG4gICAgICAgIGxldCB0aGlzQmx1ZSA9IC0xO1xuXG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbUhleCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9va3VwID0ge1xuICAgICAgICAgICAgICAgICAgICBcImFcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgIFwiYlwiOiAxMSxcbiAgICAgICAgICAgICAgICAgICAgXCJjXCI6IDEyLFxuICAgICAgICAgICAgICAgICAgICBcImRcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwiZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJmXCI6IDE1XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwgKiAxNiArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh2YWwuY2hhckF0KGkpIGluIGxvb2t1cCA/IGxvb2t1cFt2YWwuY2hhckF0KGkpXSA6IHZhbC5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1JlZCA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMykpO1xuICAgICAgICAgICAgdGhpc0dyZWVuID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSk7XG4gICAgICAgICAgICB0aGlzQmx1ZSA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBET01NYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZG9tXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICByZXRWYWxbYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykge1xuICAgICAgICAgICAgbGV0IGFkanVzdG1lbnQgPSAxO1xuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgICAgICBhZGp1c3RtZW50ID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgXG4gICAgICAgICAgICAvLyBEbyBhIGNoZWNrIHdoZXRoZXIgYm91bmRzIGhhcyB2YWx1ZSBhcyB3ZSB1c2UgZGlmZmVyZW50IHRvb2wgKGh0bWxVbml0LCBicm93c2VyKSB0byBjYWxsIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2Nyb2xsWCA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWCB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxZID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZIHx8IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXCJsZWZ0XCI6IE1hdGguY2VpbCgoYm91bmRzLmxlZnQgKyBzY3JvbGxYKSAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoKGJvdW5kcy50b3AgKyBzY3JvbGxZKSAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBcImhlaWdodFwiOiBNYXRoLmNlaWwoYm91bmRzLmhlaWdodCAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBcIndpZHRoXCI6IE1hdGguY2VpbChib3VuZHMud2lkdGggKiBhZGp1c3RtZW50KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgRE9NVXRpbCB7XG4gICAgXG4gICAgc3RhdGljIGhhc1BhcmVudChub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFwO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBbmNlc3Rvcihub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHN0YXRpYyBzYW1lTm9kZShhOiBOb2RlLCBiOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pc1NhbWVOb2RlKGIpO1xuICAgICAgICB9IGVsc2UgaWYgKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhbldoaXRlc3BhY2Uoczogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBzLnJlcGxhY2UoL1sgXFx0XFxyXFxuXS9nLCBcIiBcIikucmVwbGFjZSgvICsvZyxcIiBcIik7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuU3BhY2Uoczogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBzLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiAoY2VsbHMpIGFyZSBpbiB0aGUgc2FtZSB0YWJsZVxuICAgIHN0YXRpYyBpc0luU2FtZVRhYmxlKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBbJ3RhYmxlJ107XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQxPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQxLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDI9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDIsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudDEgIT09IG51bGwgJiYgcGFyZW50MiAhPSBudWxsICYmIERPTVV0aWwuc2FtZU5vZGUocGFyZW50MSwgcGFyZW50MikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgc2hhZG93Um9vdE5vZGUobm9kZTogTm9kZSkgOiBOb2RlIHwgbnVsbCB7XG4gICAgICAgIGxldCBuZCA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChuZCAhPSBudWxsICYmIG5kLm5vZGVUeXBlICE9PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pIFxuICAgICAgICAgICAgbmQgPSBuZC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4gbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG9iamVjdHMsIGJ1dCByZXRhaW5zIE5vZGUgYXR0cmlidXRlcyBhcyByZWZlcmVuY2VzXG4gICAgICogQHBhcmFtIHJocyBcbiAgICAgKi9cbiAgICBzdGF0aWMgb2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHM6IGFueSkge1xuICAgICAgICBpZiAoIXJocykgcmV0dXJuIHJocztcbiAgICAgICAgaWYgKHR5cGVvZiByaHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmhzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyaHMgaW5zdGFuY2VvZiBOb2RlIHx8ICEhcmhzLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbDtcbiAgICAgICAgICAgIGlmIChyaHMuY29uc3RydWN0b3IubmFtZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaCh0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMoaXRlbSkpO1xuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJOYW1lLCBhdHRyVmFsdWUpIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmICg8RWxlbWVudD53YWxrTm9kZSkuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSA9PT0gYXR0clZhbHVlKSBcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIFdhbGtzIGluIGEgRE9NIG9yZGVyXG4gKiBcbiAqIFNlZSBhbHNvIC4uL2FyaWEvQVJJQVdhbGtlclxuICovXG5leHBvcnQgY2xhc3MgRE9NV2Fsa2VyIHtcbiAgICByb290IDogTm9kZTtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbiwgcm9vdD8gOiBOb2RlKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgZWxlbWVudDtcbiAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5iRW5kVGFnID0gKGJFbmQgPT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09IHRydWUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJlbnROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwIDogTm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKChub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChwICYmIHAubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICBpZiAoKHAgYXMgU2hhZG93Um9vdCkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHAgPSAocCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyZW50RWxlbWVudChub2RlOiBOb2RlKSA6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGVsZW0gOiBFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlbGVtID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbSkgYXMgRWxlbWVudDtcbiAgICAgICAgfSB3aGlsZSAoZWxlbSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxKTtcbiAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2aXMgPSBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgbGV0IHcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgbGV0IGNzID0gdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmIChjcy5kaXNwbGF5ID09PSBcIm5vbmVcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh2aXMgPT09IG51bGwgJiYgY3MudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICB2aXMgPSBjcy52aXNpYmlsaXR5O1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlzID09PSBcImhpZGRlblwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGVsZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXRSb290KCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubm9kZS5ub2RlTmFtZSwgdGhpcy5iRW5kVGFnP1wiRU5EXCI6XCJTVEFSVFwiLCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBhbnkpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggPSBuZXh0U2xvdEluZGV4OyAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5sYXN0Q2hpbGQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgJiYgdGhpcy5ub2RlLmxhc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSlcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNsYXNzIFZpc1V0aWwge1xuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudCB0YWdzIHdoaWNoIGNhbiBub3QgYmUgaGlkZGVuLCB3aGVuIGhpZGRlbiBpc1xuICAgIC8vIGFkZGVkIHRvIHRoZXNlcyBlbGVtZW50cyBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZyBhdCBhbGwuXG4gICAgLy8gIGFyZWEgLS0+IGFyZWEgZWxlbWVudCBpcyBwYXJ0IG9mIGEgbWFwIGVsZW1lbnQgYW5kIGl0IGNhbiBub3QgYmUgaGlkZGVuIGJlY2F1c2UgaXQgaXMgdXNlZCB0b1xuICAgIC8vICAgICAgICAgICBtYWtlIGFuIGNlcnRpYW4gcGFydHMgb2YgYW4gbWFwIGludGVyYWN0aXZlLlxuICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgLy8gICAgICAgICAgICBjYW4gb25seSBiZSBoaWRkZW4gaWYgdGhlIHBhcmVudCBpcyBoaWRkZW4uXG4gICAgLy8gIGF1ZGlvIC0tPiBJZiB0aGlzIGVsZW1lbnQgaXMgaGlkZGVuIGl0IHdpbGwgc3RpbGwgcGxheSB0aGUgbXVzaWMsIHNvIHdlIHNob3VsZCBzdGlsbCB0cmlnZ2VyXG4gICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgLy8gTm90ZTogQWxsIGVsZW1lbnQgdGFncyB0aGF0IGFyZSBhZGRlZCBoZXJlIHNob3VsZCBiZSBhZGRlZCBhcyBsb3dlcmNhc2UsIGFzIHdlIGFyZSB1c2luZyBpbmRleE9mIHRvIGRvIHRoZSBjaGVjay5cbiAgICBwdWJsaWMgc3RhdGljIHVuaGlkZWFibGVFbGVtZW50cyA9IFsnYXJlYScsICdwYXJhbScsICdhdWRpbyddO1xuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50cyB0YWdzIHdoaWNoIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBzaW5jZSB3ZSBoYXZlIHJ1bGVzIHRyaWdnZXJpbmdcbiAgICAvLyBvbiB0aGVzZXMgZWxlbWVudHMgd2UgbmVlZCB0byBtYWtlIHRoZW4gdmlzaWJsZSBieSBkZWZhdWx0IHNvIHRoYXQgdGhlIHJ1bGVzIGNhbiB0cmlnZ2VyIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgLy8gQ2hlY2sgSGlkZGVuIENvbnRlbnQgb3B0aW9uIGluIHRoZSB0b29scy5cbiAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAvLyAgbGluayAtLT4gbGluayBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IHRoZSBhY3R1YWxseSBDU1Mgc2NyaXB0IGlzIHN0aWxsIGV4ZWN1dGVkIHNvIHdlIGhhdmUgdG9cbiAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgaGVhZCAtLT4gaGVhZCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgYmVoYXZlIGNvcnJlY3RcbiAgICAvLyAgdGl0bGUgLS0+IHRpdGxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBkaXNwbGF5IHRoZSB0aXRsZVxuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ3RpdGxlJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBzZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpKTtcblxuICAgICAgICAvLyBXZSBzaG91bGQgb25seSBhbGxvdyBub2RlVHlwZSBlbGVtZW50LCBhbmQgVGV4dE5vZGUgYWxsIG90aGVyIG5vZGVzVHlwZXNcbiAgICAgICAgLy8gd2UgY2FuIHJldHVybiB0aGUgdmlzaWJpbGl0eSBhcyB2aXNpYmxlLlxuICAgICAgICAvLyBGb2xsb3dpbmcgbm9kZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB2aXNhYmxlIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGNhbiBub3RcbiAgICAgICAgLy8gYWN0dWFsbHkgY2hhbmdlIHRoZWlyIHZpc2liaWxpdHkuXG4gICAgICAgIC8vICBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSAtLT4gN1xuICAgICAgICAvLyAgTm9kZS5DT01NRU5UX05PREUgICAgICAgICAgICAgICAgLS0+IDhcbiAgICAgICAgLy8gIDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovICAgICAgICAgICAgICAgLS0+IDlcbiAgICAgICAgLy8gIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFICAgICAgICAgIC0tPiAxMFxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICAgICAgLS0+IDExXG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvd25lckRvY3VtZW50IGlzIHByZXNlbnQgYmVmb3JlIG1vdmluZyBmb3J3YXJkXG4gICAgICAgIC8vIGluIGRldGVjdGluZyBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC4gSW4gdGhlIGNhc2UgdGhhdCBvd25lckRvY3VtZW50XG4gICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IHRoZW4gd2Ugc2ltcGx5IHJldHVybiBub2RlIGlzIHZpc2libGUgYnkgZGVmYXVsdC5cbiAgICAgICAgaWYgKCFub2RlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IGNvbXBTdHlsZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoaXMgbm9kZSBpcyBhIHNjcmlwdCwgbGluayBvciBzdHlsZSBub2RlLCByaWdodCBhd2F5IHJldHVybiBub2RlIGlzIHZpc2libGVcbiAgICAgICAgLy8gYmVjYXVzZSBzY3JpcHRzLCBsaW5rcyBhbmQgc3R5bGUgbm9kZXMgY2FuIG5vdCBiZSBoaWRkZW4gYnkgSFRNTCBhdHRyaWJ1dGUgb3IgQ1NTIG9yIGFyZSBoaWRkZW4gYnkgZGVmYXVsdC4gQnV0IHdlIHdhbnQgdG8gc2NhblxuICAgICAgICAvLyB0aGUgZWxlbWVudHMgZXZlcnl0aW1lIGFzIHRoZXkgcmVuZGVyIGNvbnRlbnQgc3RpbGwgd2hpY2ggaXMgc3RpbGwgdmlzaWJsZSB0byB1c2Vycy5cbiAgICAgICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgICAgIC8vICBsaW5rIC0tPiBsaW5rIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgICAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgICAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgICAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgICAgICBpZiAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSBudWxsICYmIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaXMgdmlzaWJsZSwgd2UgY2hlY2sgY291cGxlIG9mIENTUyBwcm9wZXJ0aWVzIGFuZCBoaWRkZW4gYXR0cmlidXRlLlxuICAgICAgICAvLyBhcmVhLCBwYXJhbSBhbmQgYXVkaW8gZWxlbWVudHMgd2UgZG8gbm90IGNoZWNrIGlmIHRoZXkgYXJlIGhpZGRlbiBhcyBpdCBkb2VzIG5vdCBhcHBseSB0byB0aGVtLlxuICAgICAgICAvLyBDaGVjayB0aGUgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IHdoaWNoIGlzIHBhcnQgb2YgdGhlIHJ1bGVzLCB0byBjaGVjayBpZiB0aGlzIGVsZW1lbnQgaXMgYWxsb3dlZCB0byBiZSBoaWRkZW4gb3Igbm90XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgdGhlIGVsZW1lbnQgaXMgcGFydCBvZiB0aGUgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IHRoZW4gd2UgZG8gbm90IHJ1biB0aGUgaGlkZGVuIGNoZWNrIG9uIHRoaXMgZWxlbWVudCxcbiAgICAgICAgLy8gYW5kIGdvIHN0cmlnaHQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICAvLyBBcnJheSBjaGVjayBlbGVtZW50cyBsaWtlOlxuICAgICAgICAvLyAgYXJlYSAtLT4gYXJlYSBlbGVtZW50IGlzIHBhcnQgb2YgYSBtYXAgZWxlbWVudCBhbmQgaXQgY2FuIG5vdCBiZSBoaWRkZW4gYmVjYXVzZSBpdCBpcyB1c2VkIHRvXG4gICAgICAgIC8vICAgICAgICAgICBtYWtlIGFuIGNlcnRpYW4gcGFydHMgb2YgYW4gbWFwIGludGVyYWN0aXZlLlxuICAgICAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgICAgICAvLyAgICAgICAgICAgIGNhbiBvbmx5IGJlIGhpZGRlbiBpZiB0aGUgcGFyZW50IGlzIGhpZGRlbi5cbiAgICAgICAgLy8gIGF1ZGlvIC0tPiBJZiB0aGlzIGVsZW1lbnQgaXMgaGlkZGVuIGl0IHdpbGwgc3RpbGwgcGxheSB0aGUgbXVzaWMsIHNvIHdlIHNob3VsZCBzdGlsbCB0cmlnZ2VyXG4gICAgICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHVuaGlkZWFibGVFbGVtZW50cyBhcnJheSBpcyBub3QgZGVmaW5lZCB0aGVuIHdlIGp1c3Qgc2NhbiBhbGwgZWxlbWVudHMgYW5kIGRvIG5vIGZpbHRlcmluZyBhdCBhbGwuXG4gICAgICAgIGlmIChWaXNVdGlsLnVuaGlkZWFibGVFbGVtZW50cyA9PT0gbnVsbCB8fCBWaXNVdGlsLnVuaGlkZWFibGVFbGVtZW50cyA9PT0gdW5kZWZpbmVkIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdFZpZXcgZXhpc3RzIGZvciB0aGlzIG5vZGUsIGlmIGl0IGRvZXMgdGhlbiB1c2UgdGhpcyB0byBydW4gdGhlIGdldENvbXB1dGVkU3R5bGVcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHRvIGdldCB0aGUgQ1NTIHN0eWxlIGZvciB0aGUgbm9kZS5cbiAgICAgICAgICAgIGlmIChub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGdldENvbXB1dGVkU3R5bGUgb24gdGhpcyBub2RlIHRvIGZldGNoIHRoZSBDU1MgY29tcHVhdGlvbiBvZiB0aGUgbm9kZVxuICAgICAgICAgICAgICAgIGNvbXBTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBkZWZhdWx0VmlldyBkb2VzIG5vdCBleGlzdHMgcmV0dXJuIHRydWUgdG8gaWRlbnRpZnkgdGhhdCB0aGlzXG4gICAgICAgICAgICAvLyBub2RlIGlzIHZpc2libGUsIGJlY2F1c2Ugd2VyZSBub3QgYWJsZSB0byBkZXRlY3QgaWYgaXQgd2FzIG5vdC5cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBnZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUbyBnZXQgdGhlIGhpZGRlbiBwcm9wZXJ0eSB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBzcGVjaWFsIGNoZWNrIGFzIGluIHNvbWUgY2FzZXMgdGhlIGhpZGRlbiBwcm9wZXJ0eSB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYSBib29sZWFuLCBmb3IgdGhlc2VzIGNhc2VzIHdlIHNldCBpdCB0byBmYWxzZSBhcyB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZXJtaW5lIHRoZSB0cnVlIGhpZGRlbiBjb25kaXRpb24uXG4gICAgICAgICAgICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGJlY2F1c2UgZm9ybSBlbGVtZW50cyBhcmUgYWJsZSB0byBwZXJmb3JtIGFuIG92ZXJyaWRlLCBzbyB3aGVuIHdlIGhhdmUgaWQ9XCJoaWRkZW5cIiBmb3IgYW4gZWxlbWVudFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgdW5kZXIgdGhlIGZvcm0gZWxlbWVudCB0aGVuLCBub2RlLmhpZGRlbiBnaXZlcyB0aGUgZWxlbWVudC9saXN0IG9mIGVsZW1lbnRzIHdoaWNoIGhhdmUgaWQ9XCJoaWRkZW5cIi4gUmVmZXIgdG9cbiAgICAgICAgICAgIC8vIG1vemlsbGEgYnVnOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjY3MzU2XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHkgPSB0eXBlb2YgKG5vZGUgYXMgYW55KS5oaWRkZW4gPT09IFwiYm9vbGVhblwiID8gKG5vZGUgYXMgYW55KS5oaWRkZW4gOiBmYWxzZTtcbiAgICAgICAgICAgIC8vIElmIGNvbXBTdHlsZSBvYmplY3QgaXMgZW1wdHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIHByb3BlcnR5LCBub2RlIGRvZXMndCBoYXZlIGhpZGRlbiBhdHRyaWJ1dGUgYW5kIGRvZXMndCBoYXZlIGN1c3RvbSBQVFxuICAgICAgICAgICAgLy8gaGlkZGVuIHByb3BlcnR5IHRoZW4gd2UgY2FuIGp1c3QgcmV0dXJuIHRydWUgKG5vZGUgdmlzaWJsZSkgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgIGlmICghY29tcFN0eWxlICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5ICYmIC8vIHRoaXMgY292ZXJzIGZhbHNlLCBudWxsLCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAoaGlkZGVuQXR0cmlidXRlID09PSBudWxsIHx8IGhpZGRlbkF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgICAgICFoaWRkZW5Qcm9wZXJ0eUN1c3RvbSAvLyBUaGlzIGNvdmVycyBmYWxzZSwgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFnZXRDYWNoZShub2RlLCBcIlZpc2liaWxpdHlfQ2hlY2tfUGFyZW50XCIsIG51bGwpICYmIGNvbXBTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICdoaWRkZW4nKSkpIHx8XG4gICAgICAgICAgICAgICAgKGNvbXBTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXNwbGF5JykgIT09ICdibG9jaycgICYmIChoaWRkZW5Qcm9wZXJ0eSB8fCBoaWRkZW5BdHRyaWJ1dGUgIT0gbnVsbCB8fCBoaWRkZW5Qcm9wZXJ0eUN1c3RvbSkpKSkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBhIGN1c3RvbSBleHBhbmRvcyBwcm9wZXJ0eSBvbiB0aGUgdGhlIG5vZGUgdG8gaWRlbnRpZnkgdGhhdCBpdCBpcyBoaWRkZW4sIHNvIHRoYXQgd2UgY2FuIHVzZXNcbiAgICAgICAgICAgICAgICAvLyB1c2UgdGhpcyBpbiB0aGUgcnVsZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIGlzIGhpZGRlbiBvciBub3QsIGlmIHdlIG5lZWQgdG8uXG4gICAgICAgICAgICAgICAgLy8gVXNlIGV4cGFuZG9zIHByb3BlcnR5IGluc3RlYWQgb2YgYSBoYXNoIG1hcCB3aGljaCBzdG9yZXMgdGhlIGVsZW1lbnRzLCBhZGRpbmcvY2hlY2tpbmcgZXhwYW5kb3NcbiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGlzIGEgbG90IGZhc3RlciBwZXJmb3JtYW5jZSB3aGlzZS4gRm9yIEhhc2ggbWFwIHdlIG5lZWQgdG8gc3RvcmUgYmFzZWQgb24geHBhdGgsIGFuZCB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAvLyB4cGF0aCBpdCBpcyBtb3JlIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICAgICAgICAgICAgICBzZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gdGhlIGhpZGRlbiBDU1MsIHByb3BlcnR5IG9yIGF0dHJpYnV0ZS4gT25seSBrZWVwIGNoZWNraW5nIHVudGlsIHdlIGFyZSBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBwYXJlbnROb2RlXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBub2RlIGV4aXN0cyBhbmQgdGhlIG5vZGV0eXBlIGlzIGVsZW1lbnQgKDEpLCB0aGVuIHJ1biByZWN1cnNpdmUgY2FsbCB0byBwZXJmb3JtIHRoZSBjaGVja1xuICAgICAgICAvLyBhbGwgdGhlIHdheSB1cCB0byB0aGUgdmVyeSBwYXJlbnQgbm9kZS4gVXNlIHJlY3Vyc2l2ZSBjYWxsIGhlcmUgaW5zdGVhZCBvZiBhIHdoaWxlIGxvb3Agc28gdGhhdCB3ZSBkbyBub3RcbiAgICAgICAgLy8gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGxvZ2ljIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGhhdmUgYSBwYXJlbnQgZWxlbWVudCBnb2luZyB0aHJvdWdoIHRoZSBpc05vZGVWaXNpYmxlIGZ1bmN0aW9uIHdlIGhhdmUgdG8gbWFyayBpdCBhcyBzdWNoXG4gICAgICAgICAgICAvLyBzbyB0aGF0IGluIHRoZSBmdW5jdGlvbiB3ZSBjYW4gc2tpcCBjaGVja2luZyB2aXNpYmlsaXR5OiBoaWRkZW4gZm9yIHBhcmVudCBlbGVtZW50cyBzaW5jZSB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgICAgICAgIC8vIGlzIGluaGVyaXRlZCwgd2hpY2ggYWxsb3dzIGEgY2hpbGQgdG8gaGF2ZSBhIGRpZmZlcmVudCBzZXR0aW5nIHRoZW4gdGhlIGNoaWxkLiBUaGlzIHByb3BlcnR5IG9ubHkgbmVlZHMgdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgLy8gb25jZSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBwYXNzZWQgZG93biBhbmQgdGhhdCBpcyBhbGwuIElnbm9yZSBpdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHRoYXQgd2UgaXRlcmF0ZSBvdmVyLlxuICAgICAgICAgICAgc2V0Q2FjaGUocGFyZW50RWxlbWVudCBhcyBFbGVtZW50LCBcIlZpc2liaWxpdHlfQ2hlY2tfUGFyZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVWaXNpYmxlID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBmb3VuZCB0byBub3QgYmUgdmlzaWJsZSB0aGVuIGFkZCB0aGUgY3VzdG9tIFBUX05PREVfSElEREVOIHRvIHRydWUuXG4gICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyBpbiB0aGUgcnVsZXMuXG4gICAgICAgICAgICBpZiAoIW5vZGVWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVWaXNpYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRydWUgKG5vZGUgaXMgdmlzaWJsZSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVIaWRkZW5Gcm9tQVQobm9kZTogRWxlbWVudCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUobm9kZSkgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3RvcikgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjb21wdXRlZFwiO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiY3NzXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxzdHlsZS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHN0eWxlW2lkeF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICByZXRWYWxbbmFtZV0gPSBzdHlsZVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZVJ1bGVQb2xpY3kgfSBmcm9tIFwiLi9JUnVsZVwiXG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVHdWlkZWxpbmVDYXRlZ29yeSB7XG4gICAgQUNDRVNTSUJJTElUWSA9IFwiQWNjZXNzaWJpbGl0eVwiLFxuICAgIERFU0lHTiA9IFwiRGVzaWduXCIsXG4gICAgT1RIRVIgPSBcIk90aGVyXCJcbn1cblxuZXhwb3J0IGVudW0gZUd1aWRlbGluZVR5cGUge1xuICAgIERFRkFVTFQgPSBcImRlZmF1bHRcIixcbiAgICBFWFRFTlNJT04gPSBcImV4dGVuc2lvblwiXG59XG5cbmV4cG9ydCB0eXBlIENoZWNrcG9pbnQgPSB7XG4gICAgbnVtOiBzdHJpbmcsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL2Jsb2IvbWFpbi9zcmMvZGF0YS9zYy11cmxzLmpzb25cbiAgICBzY0lkPzogc3RyaW5nLFxuICAgIC8vIEpDSDogYWRkIG5hbWUgb2YgY2hlY2twb2ludCBhbmQgc3VtbWFyeSBkZXNjcmlwdGlvblxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB3Y2FnTGV2ZWw6IHN0cmluZyxcbiAgICBzdW1tYXJ5OiBzdHJpbmcsXG4gICAgcnVsZXM/OiBBcnJheTx7IFxuICAgICAgICBpZDogc3RyaW5nLCBcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LCBcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLFxuICAgICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgIH0+XG59XG5cbmV4cG9ydCB0eXBlIEd1aWRlbGluZSA9IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogZUd1aWRlbGluZUNhdGVnb3J5LFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgdHlwZT86IGVHdWlkZWxpbmVUeXBlLFxuICAgIGNoZWNrcG9pbnRzOiBBcnJheTxDaGVja3BvaW50PlxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnksIGVHdWlkZWxpbmVUeXBlIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuL0lNYXBwZXJcIjtcbmltcG9ydCB7IE5sc01hcCBhcyBObHNNYXBOZXcsIEhlbHBNYXAgYXMgSGVscE1hcE5ldywgSUVuZ2luZSBhcyBJRW5naW5lTmV3IH0gZnJvbSBcIi4vSUVuZ2luZVwiO1xuaW1wb3J0IHsgUmVwb3J0IGFzIFJlcG9ydE5ldyB9IGZyb20gXCIuL0lSZXBvcnRcIjtcbmltcG9ydCB7IGVUb29sa2l0TGV2ZWwgYXMgZVRvb2xraXRMZXZlbE5ldyB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIlxuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4vSUJvdW5kc1wiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUGFzcyhyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUmVuZGVyKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogMCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVGYWlsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLkZBSUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQb3RlbnRpYWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUE9URU5USUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlTWFudWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLk1BTlVBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBSdWxlUmVzdWx0ID0ge1xuICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3ksIGVSdWxlQ29uZmlkZW5jZV0sXG4gICAgcmVhc29uSWQ/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgbWVzc2FnZUFyZ3M/OiBzdHJpbmdbXSxcbiAgICBhcGlBcmdzPzogYW55W11cbn1cblxuZXhwb3J0IHR5cGUgSXNzdWUgPSBSdWxlUmVzdWx0ICYge1xuICAgIHJ1bGVJZDogc3RyaW5nLFxuXG4gICAgbm9kZTogTm9kZSxcbiAgICAvLyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBjYXRlZ29yeT86IGVHdWlkZWxpbmVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzogQm91bmRzLFxuICAgIHNuaXBwZXQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBydWxlc2V0czogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nIHwgc3RyaW5nW11cbiAgICAgICAgbnVtOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbE5ldyxcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXVxuICAgIH0+XG5cbiAgICByZWZhY3Rvcj86IHtcbiAgICAgICAgW29sZFJ1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW29sZFJlYXNvbkNvZGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaGVscDoge1xuICAgICAgICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBcbiAgICAgKiBIb3cgdGhpcyBydWxlIG1hcHMgdG8gQUNUIHJ1bGVzLCBpZiBhbnkgKGh0dHBzOi8vYWN0LXJ1bGVzLmdpdGh1Yi5pby9ydWxlcy8pXG4gICAgICogXG4gICAgICogc3RyaW5nOiBGb3IgYSBzaW5nbGUgcnVsZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBleGFjdGx5IHRvIHRoZSBydWxlIChQYXNzIC0+IHBhc3MsIFBvdGVudGlhbCAtPiBjYW50VGVsbCwgRmFpbCAtPiBmYWlsLCB1bmxpc3RlZCA9PiBpbmFwcGxpY2FibGUpXG4gICAgICogQXJyYXk8PjogQ3VzdG9tIG1hcHBpbmcgb2YgcnVsZSB0byBBQ1QgcmVzdWx0c1xuICAgICAqL1xuICAgIGFjdD86IHN0cmluZyB8IHN0cmluZ1tdIHwgQXJyYXk8c3RyaW5nIHwge1xuICAgICAgICBbYWN0UnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IFwicGFzc1wiIHwgXCJmYWlsXCIgfCBcImNhbnRUZWxsXCIgfCBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9PlxuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gfCBudWxsXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gSXNzdWU7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwb3J0ID0gUmVwb3J0TmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIE5sc01hcCA9IE5sc01hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBIZWxwTWFwID0gSGVscE1hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIElFbmdpbmUgPSBJRW5naW5lTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHsgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVDYXRlZ29yeVxuICovXG5leHBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnkgYXMgZVJ1bGVDYXRlZ29yeSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVUeXBlXG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVUeXBlIGFzIGVSdWxlc2V0VHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSBhcyBSdWxlVjQsIGVSdWxlUG9saWN5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBTdHlsZU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9zdHlsZS9TdHlsZU1hcHBlclwiO1xuaW1wb3J0IHsgYTExeVJ1bGVzZXRzIH0gZnJvbSBcIi4uL3J1bGVzZXRzXCI7XG5pbXBvcnQgKiBhcyBjaGVja1J1bGVzVjQgZnJvbSBcIi4uL3J1bGVzXCI7XG5pbXBvcnQgeyBHdWlkZWxpbmUsIGVHdWlkZWxpbmVDYXRlZ29yeSB9IGZyb20gXCIuLi9hcGkvSUd1aWRlbGluZVwiO1xuaW1wb3J0IHsgSUVuZ2luZSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uL2FwaS9JUmVwb3J0XCI7XG5pbXBvcnQgeyBJQ2hlY2tlciB9IGZyb20gXCIuLi9hcGkvSUNoZWNrZXJcIjtcblxubGV0IGNoZWNrUnVsZXMgPSBbXTtcbmxldCBjaGVja05scyA9IHt9O1xubGV0IGNoZWNrSGVscCA9IHt9O1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCBsYW5ncyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoRW5naW5lLmdldExhbmd1YWdlcygpKSk7XG4gICAgLy8gRGVmYXVsdCBsYW5nIHRvIGVuLVVTIGlmIG5vdGhpbmcgZWxzZSBzcGVjaWZpZWQgaXMgZm91bmRcbiAgICBsYW5ncy5wdXNoKFwiZW4tVVNcIik7XG4gICAgLy8gUHJvY2VzcyBWNCBydWxlcyBpbnRvIHRoZSBWMiBmb3JtYXRcbiAgICBmb3IgKGxldCBydWxlbmFtZSBpbiBjaGVja1J1bGVzVjQpIHtcbiAgICAgICAgLy8gQ29udmVydCBydWxlXG4gICAgICAgIGxldCB2NFJ1bGU6IFJ1bGVWNCA9IGNoZWNrUnVsZXNWNFtydWxlbmFtZV07XG4gICAgICAgIGNoZWNrUnVsZXMucHVzaCh2NFJ1bGUpO1xuICAgICAgICAvLyBHbyBiYWNrd2FyZHMgYmVjYXVzZSB0aGUgZmlyc3QgbGFuZyBpcyB0aGUgcHJlZmVycmVkLCBzb1xuICAgICAgICAvLyBlYXJsaWVyIGxhbmd1YWdlcyB3aWxsIG92ZXJyaWRlIGxhdGVyIGxhbmd1YWdlc1xuICAgICAgICBmb3IgKGxldCBpZHg9bGFuZ3MubGVuZ3RoLTE7IGlkeCA+PTA7IC0taWR4KSB7XG4gICAgICAgICAgICBjb25zdCBsYW5nSWQgPSBsYW5nc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUubWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdID0gdjRSdWxlLm1lc3NhZ2VzW2xhbmdJZF07XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5oZWxwKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlYXNvbklkIGluIHY0UnVsZS5oZWxwW2xhbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF1bcmVhc29uSWRdID0gYC8ke2xhbmdJZH0vJHt2NFJ1bGUuaGVscFtsYW5nSWRdW3JlYXNvbklkXX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDb252ZXJ0IFJTXG4gICAgICAgIGZvciAoY29uc3QgcnNTZWN0aW9uIG9mIHY0UnVsZS5ydWxlc2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMgYXMgR3VpZGVsaW5lW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hlY2tSc0lkcyA6IHN0cmluZ1tdID0gdHlwZW9mIHJzU2VjdGlvbi5pZCA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24uaWRdIDogcnNTZWN0aW9uLmlkO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja1JzSWRzLmluY2x1ZGVzKHJzLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIHJzLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tDUElkcyA6IHN0cmluZ1tdID0gdHlwZW9mIHJzU2VjdGlvbi5udW0gPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLm51bV0gOiByc1NlY3Rpb24ubnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ1BJZHMuaW5jbHVkZXMoY3AubnVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzID0gY3AucnVsZXMgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHY0UnVsZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZXM6IHJzU2VjdGlvbi5yZWFzb25Db2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHJzU2VjdGlvbi5sZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGtpdExldmVsOiByc1NlY3Rpb24udG9vbGtpdExldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbl9pbml0aWFsaXplKCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIC4uL2FwaS9JR3VpZGVsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVzZXQgPSBHdWlkZWxpbmU7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2VyIGltcGxlbWVudHMgSUNoZWNrZXIge1xuICAgIHByaXZhdGUgZ3VpZGVsaW5lczogR3VpZGVsaW5lW10gPSBbXTtcblxuICAgIGVuZ2luZTogSUVuZ2luZTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0R3VpZGVsaW5lcygpLlxuICAgICAqL1xuICAgIHJ1bGVzZXRzOiBHdWlkZWxpbmVbXSA9IHRoaXMuZ3VpZGVsaW5lcztcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0R3VpZGVsaW5lSWRzKCkuXG4gICAgICovXG4gICAgcnVsZXNldElkczogc3RyaW5nW10gPSBbXTtcbiAgICBydWxlc2V0UnVsZXM6IHsgW3JzSWQ6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBydWxlTGV2ZWxzIDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX0gPSB7fTtcbiAgICBydWxlQ2F0ZWdvcnkgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlR3VpZGVsaW5lQ2F0ZWdvcnkgfX0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGVuZ2luZSA9IHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSgpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IEFSSUFNYXBwZXIoKSk7XG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IFN0eWxlTWFwcGVyKCkpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRSdWxlcyhjaGVja1J1bGVzKTtcbiAgICAgICAgZW5naW5lLmFkZE5sc01hcChjaGVja05scyk7XG4gICAgICAgIGVuZ2luZS5hZGRIZWxwTWFwKGNoZWNrSGVscCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZXNldChycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZ3VpZGVsaW5lIHRvIHRoZSBlbmdpbmUuIElmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGd1aWRlbGluZSB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBndWlkZWxpbmUgXG4gICAgICovXG4gICAgYWRkR3VpZGVsaW5lKGd1aWRlbGluZTogR3VpZGVsaW5lKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmUuaWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlR3VpZGVsaW5lKGd1aWRlbGluZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ndWlkZWxpbmVzLnB1c2goZ3VpZGVsaW5lKTtcbiAgICAgICAgdGhpcy5ydWxlc2V0SWRzLnB1c2goZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgY29uc3QgcnVsZUlkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdID0gdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSBndWlkZWxpbmUuY2F0ZWdvcnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZXNldFJ1bGVzW2d1aWRlbGluZS5pZF0gPSBydWxlSWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBhIHJ1bGUgZm9yIGFsbCBndWlkZWxpbmVzXG4gICAgICogQHBhcmFtIHJ1bGVJZCBcbiAgICAgKi9cbiAgICBlbmFibGVSdWxlKHJ1bGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3VpZGVsaW5lIG9mIHRoaXMuZ2V0R3VpZGVsaW5lcygpKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBndWlkZWxpbmUuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY3AucnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ1bGUuZW5hYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRHdWlkZWxpbmUoZ3VpZGVsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgYSBydWxlIGZvciBhbGwgZ3VpZGVsaW5lc1xuICAgICAqIEBwYXJhbSBydWxlSWQgXG4gICAgICovXG4gICAgZGlzYWJsZVJ1bGUocnVsZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBndWlkZWxpbmUgb2YgdGhpcy5nZXRHdWlkZWxpbmVzKCkpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRHdWlkZWxpbmUoZ3VpZGVsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGd1aWRlbGluZSBmcm9tIHRoZSBlbmdpbmVcbiAgICAgKiBcbiAgICAgKiBHZW5lcmFsbHksIHRoZXJlIGlzbid0IGEgZ29vZCByZWFzb24gdG8gZG8gdGhpcy4gVXNlcnMgc2hvdWxkIGp1c3Qgbm90IHNlbGVjdCB0aGUgZ3VpZGVsaW5lIGFzIGFuIG9wdGlvbiBpbiBjaGVja1xuICAgICAqIEBwYXJhbSBndWlkZWxpbmVJZFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlR3VpZGVsaW5lKGd1aWRlbGluZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGd1aWRlbGluZUlkIGluIHRoaXMucnVsZXNldFJ1bGVzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ydWxlc2V0UnVsZXNbZ3VpZGVsaW5lSWRdO1xuICAgICAgICAgICAgdGhpcy5ydWxlc2V0cyA9IHRoaXMuZ3VpZGVsaW5lcyA9IHRoaXMuZ3VpZGVsaW5lcy5maWx0ZXIoZ3VpZGVsaW5lID0+IGd1aWRlbGluZS5pZCAhPT0gZ3VpZGVsaW5lSWQpO1xuICAgICAgICAgICAgdGhpcy5ydWxlc2V0SWRzID0gdGhpcy5nZXRHdWlkZWxpbmVJZHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZ3VpZGVsaW5lcyBhdmFpbGFibGUgaW4gdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEd1aWRlbGluZXMoKSA6IEd1aWRlbGluZVtdIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ndWlkZWxpbmVzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpZHMgb2YgdGhlIGd1aWRlbGluZXMgYXZhaWxhYmxlIGluIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRHdWlkZWxpbmVJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpZGVsaW5lcy5tYXAoZ3VpZGVsaW5lID0+IGd1aWRlbGluZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQGRlcHJlY2F0ZWQgU2VlIGFkZEd1aWRlbGluZVxuICAgICAqL1xuICAgIGFkZFJ1bGVzZXQocnM6IFJ1bGVzZXQpIHtcbiAgICAgICAgdGhpcy5hZGRHdWlkZWxpbmUocnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBjaGVjayBvZiB0aGUgc3BlY2lmaWVkIG5vZGUvZG9jdW1lbnRcbiAgICAgKiBAcGFyYW0gbm9kZSBET01Ob2RlIG9yIERvY3VtZW50IG9uIHdoaWNoIHRvIHJ1biB0aGUgY2hlY2tcbiAgICAgKiBAcGFyYW0gZ3VpZGVsaW5lSWRzIEd1aWRlbGluZSBpZHMgdG8gY2hlY2sgd2l0aCB0byBzcGVjaWZ5IHdoaWNoIHJ1bGVzIHRvIHJ1blxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGNoZWNrKG5vZGU6IE5vZGUgfCBEb2N1bWVudCwgZ3VpZGVsaW5lSWRzPzogc3RyaW5nIHwgc3RyaW5nW10pIDogUHJvbWlzZTxSZXBvcnQ+IHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHJ1bGVzIHRvIHJ1blxuICAgICAgICBsZXQgcnVsZUlkcyA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgLy8gRml4IHRoZSBpbnB1dFxuICAgICAgICBpZiAoIWd1aWRlbGluZUlkcykge1xuICAgICAgICAgICAgcnVsZUlkcyA9IHRoaXMuZW5naW5lLmdldFJ1bGVzSWRzKCk7XG4gICAgICAgIH0gZWxzZXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ3VpZGVsaW5lSWRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgZ3VpZGVsaW5lSWRzID0gW2d1aWRlbGluZUlkc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiBndWlkZWxpbmVJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBydWxlSWRzID0gcnVsZUlkcy5jb25jYXQodGhpcy5ydWxlc2V0UnVsZXNbcnNJZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcmVwb3J0IGxldmVsc1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLnJ1bihub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcG9ydCkge1xuICAgICAgICAgICAgICAgIHJlcG9ydC5ubHMgPSB7fVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydWxlSWQgaW4gY2hlY2tObHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gPSByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBjaGVja05sc1tyZXN1bHQucnVsZUlkXVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWFzb25JZCBpbiBjaGVja05sc1tyZXN1bHQucnVsZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXSA9IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jYXRlZ29yeSA9IG15VGhpcy5nZXRDYXRlZ29yeShndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzdWx0LnBhdGguY3NzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICBwcml2YXRlIGdldExldmVsKHJzSWRzOiBzdHJpbmdbXSwgcnVsZUlkOiBzdHJpbmcpIDogZVJ1bGVQb2xpY3kge1xuICAgICAgICBpZiAoIXJzSWRzKSByZXR1cm4gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlZJT0xBVElPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04gJiYgcmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENhdGVnb3J5KHJzSWRzOiBzdHJpbmdbXSwgcnVsZUlkPzogc3RyaW5nKSA6IGVHdWlkZWxpbmVDYXRlZ29yeSB7XG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gXCJcIjtcblxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlQ2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZUd1aWRlbGluZUNhdGVnb3J5Lk9USEVSO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnNJZHMpIHtcbiAgICAgICAgICAgIHJzSWRzID0gdGhpcy5nZXRHdWlkZWxpbmVJZHMoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiByc0luZm9bcnNJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVHdWlkZWxpbmVDYXRlZ29yeS5PVEhFUjtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYV90YXJnZXRfd2FybmluZzogUnVsZSA9IHtcbiAgICBpZDogXCJhX3RhcmdldF93YXJuaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206YVt0YXJnZXRdLGRvbTphcmVhW3RhcmdldF0sZG9tOmJhc2VbdGFyZ2V0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FfVGFyZ2V0QW5kVGV4dFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlcnMgc2hvdWxkIGJlIHdhcm5lZCBpbiBhZHZhbmNlIGlmIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93IG9yIG90aGVyd2lzZSBjaGFuZ2UgdGhlaXIgY29udGV4dFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkluZm9ybSB0aGUgdXNlciB3aGVuIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93IG9yIG90aGVyd2lzZSBjaGFuZ2UgdGhlaXIgY29udGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjMuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gc2tpcCB0aGUgcnVsZSBpZiBpdCdzIEFUIGhpZGRlbiBhbmQgbm90IHRhYmJhYmxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgJiYgIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiLCBcIm5ldyB0YWJcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT0gXCJfcGFyZW50XCIgfHwgdFN0ciA9PSBcIl9zZWxmXCIgfHwgdFN0ciA9PSBcIl90b3BcIiB8fCBSUFRVdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LHRTdHIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBOYW1lIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZnJhbWVzZXQg4oCTIG11c3QgaGF2ZSBwb3RlbnRpYWwgdG8gY3JlYXRlIG5ldyB3aW5kb3c/XG4gICAgICAgICAgICAvLyBTZWUgaWYgYSBuZXcgd2luZG93IGlzIG1lbnRpb25lZFxuICAgICAgICAgICAgbGV0IHRleHRTdHIgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikpXG4gICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZihwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlW2ldKSAhPSAtMSkgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhX3RleHRfcHVycG9zZTogUnVsZSA9IHtcbiAgICBpZDogXCJhX3RleHRfcHVycG9zZVwiLFxuICAgIC8vIGRvYy1iaWJsaW9yZWYgaXMgYSBsaW5rXG4gICAgY29udGV4dDogXCJhcmlhOmxpbmssYXJpYTpkb2MtYmlibGlvcmVmXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIeXBlcmxpbmtzIG11c3QgaGF2ZSBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlaXIgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIeXBlcmxpbmsgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSHlwZXJsaW5rIGhhcyBubyBsaW5rIHRleHQsIGxhYmVsIG9yIGltYWdlIHdpdGggYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMi40LjRcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFwiYzQ4N2FlXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSdWxlIG9ubHkgcGFzc2VzIGlmIGFuIGVsZW1lbnQgaGFzIGlubmVyIGNvbnRlbnQsXG4gICAgICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgb25seSBoaWRkZW4gY29udGVudCB1bmRlciB0aGUgdGhlIGVsZW1lbnQgaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgfHwgUlBUVXRpbC5ub25UYWJhYmxlQ2hpbGRDaGVjayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYXBwbGV0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGV0X2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BcHBsZXRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcHBsZXQ+IGVsZW1lbnRzIG11c3QgcHJvdmlkZSBhbiAnYWx0JyBhdHRyaWJ1dGUgYW5kIGFuIGFsdGVybmF0aXZlIGRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkFuIDxhcHBsZXQ+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgdGhhdCBwcm92aWRlcyBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgYW4gPGFwcGxldD4gZWxlbWVudCBkdXBsaWNhdGVzIHRoZSAnY29kZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkFuIDxhcHBsZXQ+IGVsZW1lbnQgcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCwgYnV0IGRvZXMgbm90IHByb3ZpZGUgaW5uZXIgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjEuMS4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjb2RlXCIpICYmIGFsdCA9PSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb2RlXCIpLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIVJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dFwiOiB7XG4gICAgICAgICAgICAwOiBgSEFBQ19BcHBsaWNhdGlvbl9Sb2xlX1RleHQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIDA6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgYmUgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBub24tZGVjb3JhdGl2ZSBzdGF0aWMgdGV4dCBhbmQgaW1hZ2UgY29udGVudCB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBhcmUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuMS4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZVZpc2libGUoY2hpbGRyZW5baV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImRvY3VtZW50XCIpIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNoaWxkcmVuW2ldLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmVhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJlYV9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXJlYVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FyZWFfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8YXJlYT4gZWxlbWVudHMgaW4gYW4gaW1hZ2UgbWFwIG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGFyZWE+IGVsZW1lbnQgaW4gYW4gaW1hZ2UgbWFwIGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjEuMS4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG59XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcywgZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzLCBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYX0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbHVtbmhlYWRlciwgYXJpYTpmb3JtLCBhcmlhOmhlYWRpbmcsIGFyaWE6cm93aGVhZGVyLCBhcmlhOnRhYmxlLCBkb2MtYmFja2xpbmssIGRvYy1iaWJsaW9lbnRyeSwgZG9jLWJpYmxpb3JlZiwgZG9jLWdsb3NzcmVmLCBkb2Mtbm90ZXJlZiwgZG9jLXBhZ2VicmVha1wiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZCBmb3IgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJFbGVtZW50IDx7MH0+IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgd2l0aCBjZXJ0YWluIHJvbGVzIHNob3VsZCBoYXZlIGFjY2Vzc2libGUgbmFtZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyB3aGVuIHRhYmxlIGVsZW1lbnQgd2l0aCBhIGNhcHRpb24gYXMgZmlyc3QgY2hpbGRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd0YWJsZScgXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZCAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY2FwdGlvbidcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLnRleHRDb250ZW50ICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBjb25zdCBpbnZhbGlkUm9sZXMgPSBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMgJiYgaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBnZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICggUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgLy93aGVuIG11bHRpcGxlIHJvbGVzIHNwZWNpZmllZCwgb25seSB0aGUgZmlyc3QgdmFsaWQgcm9sZSBpcyBhcHBsaWVkLCBhbmQgdGhlIG90aGVycyBqdXN0IGFzIGZhbGxiYWNrc1xuICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dLm5hbWVGcm9tICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKSkge1xuICAgICAgICAgICAgICAgIC8vaWYgKCFSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBoaWRkZW4gdGV4dD9cbiAgICAgICAgICAgICAgICBpZiAoIVJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVzWzBdXSk7ICBcbiAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZXNbMF1dKTsgICBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9JbnZhbGlkVGFiaW5kZXhGb3JBY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgc2V0IHRvIFxcXCJ7MX1cXFwiIGlzIG5vdCB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgc2hvdWxkIGJlIHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gUnVsZSBub3Qgc3VwcG9ydGVkIG9uIG1vYmlsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBieSBkaXNhYmxlZCBodG1sNSBhdHRyaWJ1dGUgb3IgYXJpYS1kaXNhYmxlZDpcbiAgICAgICAgLy8gIDEuIEluIHRoZSBjYXNlIHRoYXQgdGhpcyBlbGVtZW50IGhhcyBhIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgdGhlIGVsZW1lbnQgc3VwcG9ydHMgaXQsIHdlIG1hcmsgdGhpcyBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgLy8gIDIuIEluIHRoZSBjYXNlIHRoYXQgdGhpcyBlbGVtZW50IGhhcyBhIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIHRoZW4sIHdlIG1hcmsgdGhpcyBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgLy8gRm9yIGJvdGggb2YgdGhlIGNhc2VzIGFib3ZlIHdlIGRvIG5vdCBuZWVkIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgY2hlY2tzLCBhcyB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBpbiBzb21lIGZvcm0gb3IgYW5vdGhlci5cbiAgICAgICAgaWYgKFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBhdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgYmxhbmtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBpcyAwIG9yIC0xXG4gICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBvbmUgb2YgdGhlIGNoaWxkcmVuIGlzIHRhYmJhYmxlLiBpbiB0aGlzIGNhc2UsIHRoZSB0YWIgd2lsbCBzdG9wIG9uIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkKSBcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCkgPiAwO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBub2RlIHRva2VuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBpZCByZWZlcmVuY2VkIGJ5IGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS5zcGxpdChcIiBcIikuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1hY3RpdmVkZXNjZW5kYW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY3RpdmVEZXNjZW5kYW50Q2hlY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiRmFpbF80XCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgcmVmZXJlbmNlcyBhIGhpZGRlbiBub2RlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgaXMgbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGRlc2NlbmRhbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiRWxlbWVudCBpcyBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGNvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSB0aGUgJ2lkJyBvZiBhIG5vbi1lbXB0eSwgbm9uLWhpZGRlbiBhY3RpdmUgY2hpbGQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBjb21ib2JveCBhY3RpdmUgZGVzY2VuZGFudHMgaGFuZGxlZCBieSAnY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQnXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudF9pZCA9IFJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCB8fCBET01VdGlsLnNhbWVOb2RlKGRlc2NlbmRhbnRfaWQsIHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzIGlzIGEgdGV4dGJveCB3aXRoIGFyaWEtY29udHJvbHMgcmVmZXJyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBcbiAgICAgICAgLy8gIHN1cHBvcnRzIGFyaWEtYWN0aXZlZGVzY2VuZGFudCwgYW5kIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgc3BlY2lmaWVkIGZvciB0aGUgXG4gICAgICAgIC8vICB0ZXh0Ym94IHJlZmVycyB0byBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIHRoZSBlbGVtZW50IGNvbnRyb2xsZWQgYnkgdGhlIHRleHRib3ggb3IgaXMgYSBsb2dpY2FsIFxuICAgICAgICAvLyAgZGVzY2VuZGFudCBvZiB0aGF0IGNvbnRyb2xsZWQgZWxlbWVudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJ0ZXh0Ym94XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgICAgIHBvZklkID0gMztcbiAgICAgICAgICAgIGxldCBjb250cm9sbGVkX2lkcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVkX2lkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb250cm9sbGVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBjb250cm9sbGVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlICYmICFET01VdGlsLnNhbWVOb2RlKGNvbnRyb2xsZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgY29udHJvbGxlZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25zX2lkcyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhjb250cm9sbGVkX2VsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3duc19pZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc19pZHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQT0YzOiBJJ20gbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBpcyBub3QgYSBkZXNjZW5kYW50IGFuZCBub3Qgb3duZWQgYnkgdGhlIGVsZW1lbnQgXG4gICAgICAgIC8vIHRoYXQgcmVmZXJlbmNlZCBpdC5cbiAgICAgICAgaWYgKHBvZklkID09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXBwbGljYXRpb25MYW5kbWFya3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0FwcGxpY2F0aW9uTGFuZG1hcmtMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZSB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAvLyByZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFydGljbGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXJ0aWNsZVJvbGVzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsID09PSBcIlwiIHx8ICEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX2FsbG93ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCdzIHJvbGVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGF0dHJpYnV0ZShzKSAnezB9JyByZWZlcmVuY2VkIGJ5IHRoZSBlbGVtZW50IDx7MX0+IGlzIG5vdCBhIHZhbGlkIEFSSUEgc3RhdGUgb3IgcHJvcGVydHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI1Zjk5YTdcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBcbiAgICAgICAgLy8gVGhpcyBnZXRzIGFsbCBlbGVtZW50cyB3aXRoIGF0dHJpYnV0ZXMgc28gd2Ugc3RpbGwgaGF2ZSBzb21lXG4gICAgICAgIC8vIE91dCBvZiBTY29wZSBzaW5jZSBub3QgYWxsIGF0dHJpYnV0ZXMgYXJlIGFyaWEgXG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgICAgICBsZXQgZmFpbGVkUHJvcGVydGllcyA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBqdXN0IGhhdmUgYXJpYSBhdHRyaWJ1dGVzIHdoaWNoIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIG9yIGZhaWwgYmFzZWQgb24gd2hldGhlciB0aGVyZSBwcm9wZXJ0eSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFUeXBlcykgeyAvLyBpZiBwcm9wZXJ0eSBpcyBub3QgaW4gdmFsaWQgcHJvcGVydHkgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZhaWxlZFByb3BlcnRpZXMgY29tbWEgc2VwIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gZmFpbGVkUHJvcGVydGllcyArIFwiLCBcIiArIGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtmYWlsZWRQcm9wZXJ0aWVzLCBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpDSCAtIHBhc3NpbmcgaXMgYmFzZWQgb24gYWxsIGF0dHJpYnV0ZXMgbm90IGp1c3QgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vICAgICAgIGxlYWRpbmcgdG8gT1ZFUiBDT1VOVElORyBzbyBtb3ZlZCBwYXNzIHVwXG4gICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMsIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIGluIGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgdGhlIEFSSUEgYXR0cmlidXRlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGxldCBpbnZhbGlkQXR0cmlidXRlcyA9IGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcyAmJiBpbnZhbGlkQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghYXJpYUF0dHJpYnV0ZXMgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2NvbmZsaWN0XCIsIFtjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ10sIGNvbmZsaWN0QXR0cmlidXRlc1tpXVsnaHRtbEF0dHInXV0pKTtcbiAgICAgICAgICAgIGlmIChhcmlhQXR0cmlidXRlcy5pbmNsdWRlcyhjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ10pKVxuICAgICAgICAgICAgICAgIFJQVFV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddXSwgYXJpYUF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cmlidXRlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlcHJlY2F0ZWRBcmlhUm9sZXMsIGdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIEFSSUEgcm9sZXMgYW5kIGF0dHJpYnV0ZSBhcmUgdXNlZCBwZXIgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcIlRoZSBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBmb3IgdGhlIHJvbGUgXFxcInsxfVxcXCIgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGRlcHJlY2F0ZWQgQVJJQSByb2xlIG9yIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IGdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9hcmlhX3JvbGUnLCBbZGVwcmVjYXRlZFJvbGVzW2ldXSkpOyAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IGdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gXCJyb2xlXCI6XCJhbnlcIiwgXCJhdHRyaWJ1dGVcIjphcmlhQXR0cnNbaV19XG4gICAgICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGUgPT09ICdhbnknKVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9hcmlhX2F0dHInLCBbZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0uYXR0cmlidXRlXSkpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfcm9sZV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZSwgZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0ucm9sZV0pKTtcbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9FbXB0eVByb3BlcnR5VmFsdWVcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJUaGUgZWxlbWVudCBhdHRyaWJ1dGUocyk6ICd7MH0nIHZhbHVlIGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2hlbiBzcGVjaWZ5aW5nIGEgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBlbXB0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW5cbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gUlBUVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0aWVzID0gMDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGVzW2pdLCBydWxlQ29udGV4dCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCByZXF1aXJlZFJvbGVQcm9wcyA9IFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gcmVxdWlyZWRSb2xlUHJvcHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHJlcXVpcmVkUm9sZVByb3BzW2ldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGVzW2ldID09IFwicmFkaW9ncm91cFwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocm9sZXNbaV0gPT0gXCJwcm9ncmVzc2JhclwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gUlBUVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBwZXJtaXR0ZWRSb2xlcy5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcGVybWl0dGVkUm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IGFsbG93ZWRBdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IFwiYXJpYS1jaGVja2VkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1zZWxlY3RlZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWV4cGFuZGVkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1vcmllbnRhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWxldmVsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiAhYXR0ck5hbWVBcnIuaW5jbHVkZXMoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGdldEludmFsaWRBcmlhQXR0cmlidXRlcywgZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBIVE1MIGF0dHJpYnV0ZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIEFSSUEgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgdGhlIEFSSUEgYXR0cmlidXRlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGxldCBpbnZhbGlkQXR0cmlidXRlcyA9IGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcyAmJiBpbnZhbGlkQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWYgY29uZmxpY3QgYWxyZWFkeSByZXBvcnRlZCwgaWdub3JlIHJlcG9ydGluZyBvdmVybGFwXG4gICAgICAgIGxldCBjb25mbGljdEF0dHJpYnV0ZXMgPSBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb25mbGljdEF0dHJpYnV0ZXMgJiYgY29uZmxpY3RBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCBhcmlhQXR0cnMgPSBbXTtcbiAgICAgICAgbGV0IGh0bWxBdHRycyA9IFtdO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyBcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlID09PSAnJykgYXR0clZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nKSBcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZXhhbWluZWRIdG1sQXRyTmFtZXMgPSBSUFRVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdvdmVybGFwcGluZycpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnUGFzcycpIHsgLy9wYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ0ZhaWxlZCcpIHsgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYUF0dHJzW2ldWyduYW1lJ10sIGl0ZW1bJ2F0dHInXV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2hlbiB1c2luZyBhIEFSSUEgcm9sZSBvbiBhbiBlbGVtZW50LCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhhdCByb2xlIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBbiBlbGVtZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlKHMpOiAnezF9J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjQuMS4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjRlOGFiNlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vbGV0IGltcGxpY2l0Um9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvSW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUm9sZXMgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwLCByb2xlc0xlbmd0aCA9IHJvbGVzLmxlbmd0aDsgaiA8IHJvbGVzTGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCAmJiBpbXBsaWNpdFJvbGUuaW5jbHVkZXMocm9sZXNbal0pKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgUlBUVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGVzW2pdLCBydWxlQ29udGV4dCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCByZXF1aXJlZFJvbGVQcm9wcyA9IFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGxldCByb2xlTWlzc2luZ1JlcVByb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRSb2xlcysrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwcm9wZXJ0aWVzTGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgcHJvcGVydGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCByZXF1aXJlZFJvbGVQcm9wc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGFyaWEtbGFiZWxsZWRieSBpc24ndCBwcmVzZW50LCBhbiBhcmlhLWxhYmVsIHdpbGwgbWVldCB0aGUgcmVxdWlyZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSB8fCAocm9sZXNbaV0gIT0gXCJyYWRpb2dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS12YWx1ZXRleHRcIikpIHx8IChyb2xlc1tpXSAhPSBcInByb2dyZXNzYmFyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWNvbnRyb2xzXCIgJiYgcm9sZXNbal0gPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGNoZWNrIHNpbmNlIGFyaWEtY29udHJvbHMgaW4gdGhlIHRleHRib3ggb2YgYSBjb21ib2JveCBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gcnVsZSBIQUFDX0NvbWJvYm94X011c3RfaGF2ZV9UZXh0X0lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVNaXNzaW5nUmVxUHJvcCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwOyAvLyBvbmx5IGFyaWEgYXR0cmlidXRlcyBzbyBOTyBPVVQgT0YgU0NPUEVcbiAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICByZXRUb2tlbi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogcmV0VG9rZW4pO1xuICAgICAgICBpZiAodGVzdGVkUm9sZXMgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5VmFsdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcHJvcGVydHkgdmFsdWVzIG11c3QgYmUgdmFsaWRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHZhbHVlIFxcXCJ7MH1cXFwiIHNwZWNpZmllZCBmb3IgYXR0cmlidXRlICd7MX0nIG9uIGVsZW1lbnQgPHsyfT4gaXMgbm90IHZhbGlkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjZhNzI4MVwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwcm9wZXJ0eURhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlcztcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnR5VmFsdWVzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKG5vZGVWYWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKCd1bmRlZmluZWQnKSAhPSAtMSAmJiBub2RlVmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmFuc2xhdGUgJ3VuZGVmaW5lZCcgdG8gbWVhbiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtcmVsZXZhbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9ucywgcmVtb3ZhbHMsIHRleHQ7IG9yIGEgc2luZ2xlIGNhdGNoLWFsbCB2YWx1ZSBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlcyA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGFsbCBpcyBzcGVjaWZpZWQsIGl0IGNhbm5vdCBoYXZlIGFueSBvdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXMubGVuZ3RoID4gMSAmJiBhdHRyVmFsdWVzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyVmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRpdmlkdWFsIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlc1tqXSAhPSBcIlwiICYmICFkYXRhVHlwZXMudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZXNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFthdHRyTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChhdHRyVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpVmFsID0gcGFyc2VJbnQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihpVmFsKSB8fCAoXCJcIiArIGlWYWwgIT09IG5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZlZhbCA9IHBhcnNlRmxvYXQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcFYgPSBub2RlVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wViAhPT0gXCJ0cnVlXCIgJiYgdG1wViAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKHZhbHVlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyByZXRNc2cucHVzaCAoZGF0YVR5cGVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJhbm5lclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVCYW5uZXJMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYmFubmVyX3NpbmdsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206aGVhZGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PbmVCYW5uZXJJblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGVyZSBtdXN0IGJlIG9ubHkgb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG9uIHRoZSBwYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiYmFubmVyXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkgPT09IG51bGw7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jaGlsZF90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nRm9jdXNhYmxlQ2hpbGRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJmYWlsX21pc3NpbmdfY2hpbGRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJOb25lIG9mIHRoZSBkZXNjZW5kZW50IGVsZW1lbnRzIHdpdGggXFxcInsxfVxcXCIgcm9sZSBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVJIGNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGRlc2NlbmRhbnQgZm9yIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoUlBUVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gQW4gQVJJQSBsaXN0IGlzIG5vdCBpbnRlcmFjdGl2ZVxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCB7IFwibGlzdFwiOiB0cnVlLCBcInJvd1wiOiB0cnVlLCBcInJvd2dyb3VwXCI6IHRydWUsIFwidGFibGVcIjogdHJ1ZSwgXCJncmlkXCI6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGEgdmFsaWQgbWVzc2FnZSBmb3IgbW9iaWxlIGJlY2F1c2UgYWxsIGVsZW1lbnRzIGFyZSBmb2N1c2FibGUgaW4gaU9TIHdoZW4gVm9pY2VPdmVyIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbWJvYm94XG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgaWQgb2YgdGhlIGVsZW1lbnQgaXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIGVsZW1lbnQgd2l0aCBcImFyaWEtY29udHJvbHNcIiBvciBcImFyaWEtZXhwYW5kZWRcIiBhbmQgd2l0aCBjZXJ0YWluIHJvbGVzLiBJZiBzbywgZm9jdXMgaXMgY29udHJvbGxlZCBieSB0aGUgcmVmZXJlbmNpbmcgZWxlbWVudFxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvKippZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW2FyaWEtaGFzcG9wdXA9J3RydWUnXSwgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW2FyaWEtZXhwYW5kZWQ9J3RydWUnXWApO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgICAgICBpZiAoZWxlbSAmJiBSUFRVdGlsLmlzVGFiYmFibGUoZWxlbSkgJiYgcm9sZXMgJiYgcm9sZXMubGVuZ3RoID4wICYmIHJvbGVzLnNvbWUocj0+Y29udGFpbmVycy5pbmNsdWRlcyhyKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBSUFRVdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBpblNjb3BlID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzLmluY2x1ZGVzKHJvbGVzW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQgIT0gJ3RydWUnICYmICFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSAmJiAhUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluU2NvcGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcImRlc2NlbmRhbnQ6OipbXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAgKz0gXCJAcm9sZT0nXCIgKyByZXFDaGlsZHJlbltpXSArIFwiJyBvciBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHhwID0geHAuc3Vic3RyaW5nKDAsIHhwLmxlbmd0aCAtIDQpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgUlBUVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGNoaWxkIGlzIG5vdCBmb2N1c2FibGUgdmlhIHRhYmluZGV4LiAgU2VlIGlmIHRoZXJlIGlzIGEgZ3JhbmRjaGlsZCB0aGF0IGlzIGZvY3VzYWJsZSBieSBkZWZhdWx0IG9yIGJ5IHRhYmluZGV4LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIgPSByLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSByLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgYXJyYXlzL3N0cmluZ3MgYXJlIGVtcHR5LCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gdmlvbGF0aW9uIHNvIHdlIGNhbiByZXNldCBpdCBiYWNrIHRvIHBhc3NlZCwgdGhlIHJlYXNvbiBmb3IgdGhpc1xuICAgICAgICAvLyBpcyB0aGF0IHdlIGFyZSBzZXR0aW5nIHBhc3NlZD1mYWxzZSB3aGlsZSB3ZSBwZXJmb3JtIGEgbG9vcCB3aGljaCBjYXVzZXMgdmlvbGF0aW9uIHRvIHRyaWdnZXIgZXZlbiBpZiB0aGVyZSBpcyBubyBpc3N1ZXMuIEluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIHdob2xlIHJ1bGUgdG8gc3dpdGNoIGZyb20gdXNpbmcgcGFzc2VkIGluIHRoYXQgd2F5IHNpbXBseSBkbyB0aGUgY2hlY2sgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgaWYgKG5vZGVOYW1lLmxlbmd0aCA+IDAgJiYgcm9sZU5hbWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFpblNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdfY2hpbGRcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jaGlsZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3ZhbGlkXCIsXG4gICAgLy9jb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiXSxcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIiwgXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIEFSSUEgcm9sZSBtdXN0IG93biBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBbiBlbGVtZW50IHdpdGggYSBBUklBIHJvbGUgb3ducyBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm9fY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgZG9lcyBub3Qgb3duIGFueSBjaGlsZCBlbGVtZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgcm9sZShzKTogXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIG93bnMgdGhlIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBcXFwiezF9XFxcIiB0aGF0IGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgcm9sZShzKTogXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcImJjNGE3NVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gIEZvciBjb21ib2JveCwgd2UgaGF2ZSBnMTE5MyAuLi4gZzExOTkgdG8gY2hlY2sgdGhlIHZhbHVlcyBldGMuXG4gICAgICAgIC8vICBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMTE1MiBhZ2Fpbi4gU28sIHdlIGJ5cGFzcyBpdCBoZXJlLlxuICAgICAgICBpZiAocm9sZXMuaW5jbHVkZXMoXCJjb21ib2JveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVxdWlyZWRDaGlsZFJvbGVzLmluZGV4T2YoJ2dyb3VwJyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIGEgcm9sZSBkb2Vzbid0IHJlcXVpcmUgYSBjaGlsZCB3aXRoIGFueSBzcGVjaWZpYyByb2xlXG4gICAgICAgICAqIHRoZSByZXZlcnNlIG1pZ2h0IGJlIG5vdCB0cnVlIC0gcGFyZW50IHdpbGwgYmUgY2hlY2tlZCBpbiBScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljcyBydWxlXG4gICAgICAgICovXG4gICAgICAgICBpZiAocmVxdWlyZWRDaGlsZFJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBSUFRVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFkaXJlY3RBVENoaWxkcmVuIHx8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIHJlcXVpcmVkIHJvbGUgZG9zZW4ndCBjb250YWluIGFueSBhY2Nlc3NpYmxlIGNoaWxkXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdoZW4gYSB3aWRnZXQgaXMgbWlzc2luZyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBkdWUgdG8gc2NyaXB0IGV4ZWN1dGlvbiBvciBsb2FkaW5nLCBcbiAgICAgICAgICAgICAqIGF1dGhvcnMgTVVTVCBtYXJrIGEgY29udGFpbmluZyBlbGVtZW50IHdpdGggJ2FyaWEtYnVzeScgZXF1YWwgdG8gdHJ1ZS4gXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICBsZXQgYnVzeSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYnVzeVwiKTtcbiAgICAgICAgICAgICBpZiAoIWJ1c3kgfHwgYnVzeSAhPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbm9fY2hpbGRcIiwgcmV0VG9rZW4pO1xuICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgLy8gaXQncyAnYnVzeScgbG9hZGluZywgaWdub3JlIGl0IFxuICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgdmlvbGF0ZUVsZW1Sb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICAgICAgaWYgKCFjaGlsZFJvbGVzIHx8IGNoaWxkUm9sZXMubGVuZ3RoID09IDApIFxuICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHdoZW4gbXVsdGlwbGUgcm9sZXMgYXJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBmb3IgYSByb2xlLCBhdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2Ygb25lIHJlcXVpcmVkIG93bmVkIGVsZW1lbnQgaXMgZXhwZWN0ZWQuIFxuICAgICAgICAgICAgICAgICAqIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4gaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aGUgbGlzdGVkIG93bmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSwgdGhlIHJlcXVpcmVtZW50IGlzIG1ldCBpZiBpdCBoYXMgYW55IG9uZSBvZiB0aGUgcmVxdWlyZWQgcm9sZXMuICAgXG4gICAgICAgICAgICAgICAgICovICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gY2hpbGRSb2xlcy5zb21lKHI9PiByZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQpIFxuICAgICAgICAgICAgICAgICAgICB2aW9sYXRlRWxlbVJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlbGVtZW50IHNpbmNlIGl0J3Mgbm90IHNlbWFudGljLCBzaG91bGRuJ3QgaGFwcGVuIFxuICAgICAgICAgICAgfSAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICBpZiAodmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB2aW9sYXRlRWxlbVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2godmlvbGF0ZUVsZW1Sb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9jaGlsZFwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29tcGxlbWVudGFyeUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTphc2lkZVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeUxhbmRtYXJrTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db21wbGVtZW50YXJ5UmVxdWlyZWRMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcms6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb250ZW50IGlzIG5vdCB3aXRoaW4gYSBsYW5kbWFyayBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIGNvbnRlbnQgbXVzdCByZXNpZGUgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBhIGxhbmRtYXJrIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXJhbXMgPSBnZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxhbmRtYXJrczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImNoZWNrYm94XCIsIFwiZ3JpZFwiLCBcImhlYWRpbmdcIiwgXCJsaW5rXCIsIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwidGFibGlzdFwiLCBcInRleHRib3hcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmVlZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJwXCIsIFwidGFibGVcIiwgXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiYVwiLCBcIm9sXCIsIFwidWxcIiwgXCJkbFwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaDZcIiwgXCJlbWJlZFwiLCBcIm9iamVjdFwiLCBcImFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vTGFuZG1hcmtlZFJvbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHJvbGVzIGRvbid0IHJlcXVpcmUgbGFuZG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiZGlhbG9nXCIsIFwidG9vbHRpcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXBMYW5kbWFya3M6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcE5vTGFuZG1hcmtlZFJvbGVzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29udmVydCBhcnJheXMgdG8gbWFwc1xuICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGFuZG1hcmtzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrc1twYXJhbXMubGFuZG1hcmtzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0c1twYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzW3BhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8ICAvLyBhdm9pZCBkaWFnbm9zaW5nIGcxMTU3IGZvciBub24tdmlzaWJsZSBub2Rlc1xuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1zV2l0aG91dENvbnRlbnQgPSBbXCJhcmVhXCIsIFwiaW5wdXRcIiwgXCJlbWJlZFwiLCBcImJ1dHRvblwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSAmJiAvL29ubHkgdHJpZ2dlciB0aGUgcnVsZSBvbiBlbGVtZW50cyB0aGF0IGhhdmUgY29udGVudFxuICAgICAgICAgICAgZWxlbXNXaXRob3V0Q29udGVudC5pbmRleE9mKG5vZGVOYW1lKSA9PT0gLTEpIHsgLy8gYSBmZXcgZWxlbXMgd2lob3V0IGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBza2lwcGVkXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGZvciBsYXlvdXQgdGFibGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcInRhYmxlXCIgJiYgUlBUVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHBvc3NpYmxlIG9ycGhhblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLCB0cnVlKTtcbiAgICAgICAgLy9leGNsdWRlIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwieHl6LmNzc1wiPiBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4oIzYwOClcbiAgICAgICAgLy9oYXZpbmcgbGluayBpbiB0aGUgaGVhZCBjb3VsZCBjYXVzZSBsb3Qgb2YgdmlvbGFpb25zICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnbGluaycpIHtcbiAgICAgICAgICAgIGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQgPSBub2RlTmFtZSBpbiBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzO1xuICAgICAgICBpZiAoaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0IHx8IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbmNlc3RvciBoYXMgbGFuZG1hcmsgcm9sZXMgb3IgaW1wbGljaXQgbGFuZCBtYXJrIHJvbGVzXG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZXMgPSBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLm1hcChpbmZvID0+IGluZm8ucm9sZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlIGluIHBhcmFtcy5tYXBMYW5kbWFya3MpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZmFpbCBlbGVtZW50cyB3aGVuIGEgcGFyZW50IG9yIHNpYmxpbmcgaGFzIGZhaWxlZCAtIGNhdXNlcyB0b28gbWFueSBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBnZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBnZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHdhbGtFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBydWxlIGlmIGVsZW1lbnQgaXMgYSBzdGFuZC1hbG9uZSB3aWRnZXRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb250ZW50aW5mb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0xhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29udGVudGluZm9fbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbnRlbnRpbmZvV2l0aE5vTWFpbl9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIHByZXNlbnQgd2l0aG91dCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIG9ubHkgcGVybWl0dGVkIHdpdGggYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9jb25zaWRlciBpbXBsaWNpdCByb2xlXG4gICAgICAgIGlmICghUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbnRlbnRpbmZvSW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBmb3VuZCBvbiBhIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50IG9yIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IGhhdmUgb25lIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9maW5kIG91dCBpZiA8Zm9vdGVyPiBlbGVtZW50IGhhcyBzaWJsaW5ncyBhcyA8Zm9vdGVyPiBoYXMgaW1wbGljaXQgY29udGVudGluZm8gcm9sZVxuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhUlBUVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJyb3dzZXJzIGlnbm9yZSB0aGUgZXhwbGljaXQgYW5kIGltcGxpY2l0IEFSSUEgcm9sZXMgb2YgdGhlIGRlc2NlbmRhbnRzIG9mIGNlcnRhaW4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGNvbnRhaW5zIHZhbGlkIGRlc2NlbmRhbnRzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGNvbnRhaW5zIGRlc2NlbmRhbnRzIHdpdGggaW1wbGljaXQgcm9sZXMgXFxcInsxfVxcXCIgd2hpY2ggYXJlIGlnbm9yZWQgYnkgYnJvd3NlcnNcIixcbiAgICAgICAgICAgIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGNvbnRhaW5zIGRlc2NlbmRhbnRzIHdpdGggcm9sZXMgXFxcInsxfVxcXCIgd2hpY2ggYXJlIGlnbm9yZWQgYnkgYnJvd3NlcnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCIzMDduNXpcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IHJlcXVpcmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoIVJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZHJlbiBmcm9tIGFjY2Vzc2liaWxpdHkgdHJlZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyBvbmVzIHdpdGggYXJpYS1vd25zICAgIFxuICAgICAgICBsZXQgZGlyZWN0QVRDaGlsZHJlbiA9IFJQVFV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkaXJlY3RBVENoaWxkcmVuICYmIGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXByZXNlbnRhdGlvbmFsIGNoaWxkcmVuXG4gICAgICAgICAgICBsZXQgZXhwbGljaXRSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgPGltZz4gYW5kIDxzdmc+XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gZGlyZWN0QVRDaGlsZHJlbltqXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0YWcgPT09ICdpbWcnIHx8IHRhZyA9PT0gJ3N2ZycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGdldCBleHBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGltcGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBleHBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goZXhwbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGltcGxpY2l0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpbXBsaWNpdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICAgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmRvY3VtZW50XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZURvY3VtZW50Um9sZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggYSBcXFwiZG9jdW1lbnRcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBlbGVtZW50cyB3aXRoIGEgXFxcImRvY3VtZW50XFxcIiByb2xlIG11c3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCA9PT0gXCJcIiB8fCAhKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDE7XG5cbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja10sZG9tOipbb25ibHVyXSwgZG9tOipbb25kYmxjbGlja10sIGRvbToqW29uZm9jdXNdLCBkb206KltvbmtleWRvd25dLGRvbToqW29ua2V5cHJlc3NdLCBkb206KltvbmtleXVwXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2VvdXRdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ucmVzaXplXSwgZG9tOipbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9FdmVudEhhbmRsZXJNaXNzaW5nUm9sZV9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCAnezF9JyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlIHNwZWNpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggZXZlbnQgaGFuZGxlcnMgbXVzdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhpcyBydWxlIGlzIHBhc3NlZCBpZiBhIGVsZW1lbnQgaGFzIGF0dHJpYnV0IHJvbGUgXG4gICAgICAgIC8vYWxzbywgcGFzc2VkIG9mIGVsZW1lbnQgaGFzIGFueSBpbXBsaWNpdCByb2xlcy4gXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc0FueVJvbGUocnVsZUNvbnRleHQsIHRydWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvL3Bhc3MgaWYgdGhpcyBlbGVtZW50IGlzIHJlY2VpdmVkIGZvY3VzIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNmb2N1c2FibGVCeURlZmF1bHQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvL3ZhbGlkYXRlIGlmIHRoaXMgZWxlbWVudCBoYXMgYW55IG9mIHRoZSBnaXZlbiBldmVudCBoYW5kbGVyJ3NcbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IGV2ZW50QXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIC8vIEZyb20gV0NBRzIwX1NjcmlwdF9Vc2VXM0NEb21GdW5jdGlvbnNcbiAgICAgICAgLy9sZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uY29udGV4dG1lbnVcIiwgXCJvbmRibGNsaWNrXCIsIFwib25rZXlkb3duXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ua2V5cHJlc3NcIiwgXCJvbmtleXVwXCIsIFwib25sb2FkXCIsIFwib25tb3VzZWRvd25cIiwgXCJvbm1vdXNldXBcIiwgXCJvbm1vdXNlbW92ZVwiLCBcIm9ubW91c2VvdXRcIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25tb3VzZW92ZXJcIiwgXCJvbm1vdXNld2hlZWxcIiwgXCJvbnJlc2V0XCIsIFwib25wYXN0ZVwiLCBcIm9ucmVzaXplXCIsIFwib25zY3JvbGxcIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25zZWxlY3RcIiwgXCJvbnN1Ym1pdFwiLCBcIm9uYWN0aXZhdGVcIiwgXCJvbmRlYWN0aXZhdGVcIiwgXCJvbm1vdXNlZW50ZXJcIiwgXCJvbm1vdXNlbGVhdmVcIl07XG4gICAgICAgIGxldCBldmVudHMgPSBbXCJvbmJsdXJcIiwgXCJvbmZvY3VzXCIsIFwib25jaGFuZ2VcIiwgXCJvbmNsaWNrXCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25yZXNpemVcIlxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShldmVudHNbaV0pKVxuICAgICAgICAgICAgICAgIGV2ZW50QXJyLnB1c2goZXZlbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKGV2ZW50QXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGZhbHNlLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVGb3JtTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJmb3JtXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBQZXIgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGlmIGl0IGhhcyBhbiBhcmlhIGxhYmVsIG9yIHRpdGxlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwiZm9ybVwiIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgfHxcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImZvcm1cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiZcbiAgICAgICAgICAgICAgICAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2dyYXBoaWNfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfU3ZnQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIGdyYXBoaWNzIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byAxLjEuMSBmcm9tIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgfHwgIXJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikuaW5jbHVkZXMoXCJncmFwaGljcy1cIikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuIDxkaXY+LCA8c3Bhbj4sIGV0YylcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW3J1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIildKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaGlkZGVuX25vbnRhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWhpZGRlbj10cnVlXSwgZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0gZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfaGlkZGVuX2ZvY3VzX21pc3VzZVwiOiB7IFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlLmh0bWxgLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGhpZGRlbiBlbGVtZW50IHNob3VsZCBub3QgY29udGFpbiBhbnkgdGFiYmFibGUgZWxlbWVudHNcIiwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgXFxcInswfVxcXCIgc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgd2l0aGluIHRoZSBzdWJ0cmVlIG9mIGFuIGVsZW1lbnQgd2l0aCBhbiAnYXJpYS1oaWRkZW4nIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICd0cnVlJ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjMuMVwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogSGFuZGxlIHRlc3RjYXNlIHdpdGggZm9jdXMganVtcGluZyBhd2F5XG4gICAgYWN0OiBcIjZjZmE4NFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZElkUmVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2lkJyBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIHRoZSBBUklBIHByb3BlcnR5ICd7MX0nIHZhbHVlIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBBUklBIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5IHVuaXF1ZSBpZCBvZiBhbiBleGlzdGluZyBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogNmE3MjgxIC0gTmVlZCBhIHNlcGFyYXRlIHJlYXNvbiBjb2RlIHdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCByZXF1aXJlZC4gQUNUIHNheXMgaXQncyBva2F5IHRvIGJlXG4gICAgLy8gaW52YWxpZCB3aGVuIG5vdCByZXF1aXJlZC4gSSB0aGluayB3ZSBzaG91bGQgc3RpbGwgZmFpbCwgYnV0IGZsYWcgaXQgYXMgYSBkaWZmZXJlbnQgcmVhc29uIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBzdWJzZXRcbiAgICAvLyBhbGlnbnMgd2l0aCBBQ1QuXG4gICAgYWN0OiBbXCI1OTc5NmZcIiwgXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3MgPSB0cnVlO1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IG5vbkV4aXN0YW50SURzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgaWRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHRlc3RlZFJlZmVyZW5jZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGF0dHJMZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRzT25lSURSZWYgPSAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIGRhdGEgdHlwZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBpZCByZWZzIGRvIGVycm9yIGNoZWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNPbmVJRFJlZiB8fCAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRSZWZlcmVuY2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZUxlbmd0aCA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRBcnJheSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYW4gZW1wdHkgSUQgUmVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZUxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRva2Vucy5wdXNoKFwiXFxcIlwiICsgY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdG9vIG1hbnkgSURSZWZzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3VwcG9ydHNPbmVJRFJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGhhcyB0b28gbWFueSBJRFJlZnMgaXQgaXMgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FwdHVyZSBhbGwgdGhlIElEUmVmcyBmb3IgaWRUb2tlbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gMCwgbGVuZ3RoID0gaWRBcnJheS5sZW5ndGg7IHogPCBsZW5ndGg7ICsreikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVt6XSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRva2Vucy5wdXNoKGlkQXJyYXlbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpZCByZWZzIGFyZSBpbnZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgbm9kZVZhbHVlTGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W2pdLmxlbmd0aCA+IDApIHsgLy8gaXQgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIHNwYWNlcyBhcmUgb25lIGFmdGVyIHRoZSBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBieSBJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRBcnJheVtqXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBlbGVtZW50QnlJZCAhPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgZXhpc3RzIGFuZCB0aGlzIGlzIGFuIGFyaWEgYXR0cmlidXRlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGhpZGRlbiBJRCByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlIGNoZWNrLCBpbiB0aGUgY2FzZSB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB0aGVuIHdlIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyAmJiAhZGF0YVR5cGVzLmhpZGRlbklEUmVmU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRva2Vucy5wdXNoKGlkQXJyYXlbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgb25lIG9mIHRoZSBpZCByZWZlcmVuY2VzIG5lZWQgdG8gYmUgdmFsaWQgdG8gbWFyayB0aGUgcnVsZSBhcyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGlmIHdlIGZpbmQgYSBzaW5nbGUgdmlzaWJsZSBlbGVtZW50IHRoZW4gc3RvcCBjaGVja2luZyBhbmQgbWFyayBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzcykgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgcmV0VG9rZW4yLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIHJldFRva2VuMy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgaWYgKGlkVG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXRUb2tlbjEucHVzaChpZFRva2Vucy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjIsIHJldFRva2VuM10pO1xuICAgICAgICBpZiAodGVzdGVkUmVmZXJlbmNlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKSwgcmV0VG9rZW4zLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9pbWdfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pbWdfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6aW1nXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfSW1nQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLCAvKkNoYW5nZSBtYXBwaW5nIHRvIDEuMS4xIGZyb20gNC4xLjIgKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCIyM2EyYThcIiwge1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBJZiBubyByb2xlLCB0aGlzIGlzIGltcGxpY2l0LCBhbmQgY292ZXJlZCBieSBXQ0FHMjBfSW1nX0hhc0FsdFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvKiBKQ0ggLSBQb2ludHMgb2YgZmFpbHVyZVxuICAgICAgICAgKiAgICAwLiBNaXNzaW5nIGFsdCBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICogICAgMS4gTWlzc2luZyBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgKiAgICAyLiBNaXNzaW5nIHRpdGxlIGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGxldCBhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdLZXlib2FyZEhhbmRsZXJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiVmVyaWZ5IHRoZSA8ezB9PiBlbGVtZW50IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMga2V5Ym9hcmQgYWNjZXNzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgV0FJX0FSSUEgVUkgY29tcG9uZW50cyBtdXN0IHByb3ZpZGUga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCByb2xlcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQsIHRoZSAnYXJpYV9yb2xlX3JlZHVuZGFudCcgcnVsZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGFuZCBhZGRyZXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBydWxlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFsaXN0JyAmJiByb2xlcyAmJiByb2xlcy5pbmNsdWRlcyhcImxpc3Rib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gUlBUVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIC8vIENvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSB3aWRnZXQgcm9sZXMuIFRoZXkgYWN0IGFzIGNvbnRhaW5lcnMgdGhhdCBtYW5hZ2Ugb3RoZXIsIGNvbnRhaW5lZCB3aWRnZXRzLlxuICAgICAgICBsZXQgcm9sZUNvbnRhaW5lcnMgPSBbXCJjb21ib2JveFwiLCBcImdyaWRcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRyZWVcIiwgXCJ0cmVlZ3JpZFwiXTtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dO1xuICAgICAgICAgICAgaWYgKHJvbGVDb250YWluZXJzLmluZGV4T2Yocm9sZXNbal0pID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgb24gdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgZm91bmQgb24gcGFyZW50LiAgU2VlIGlmIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGFyZSBvbiByZXF1aXJlZCBjaGlsZCBlbGVtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXFDaGlsZHJlbikgeyAvKiBTTUYgVE9ETyBtZW51YmFyIGRvZXMgbm90IGhhdmUgYW55IHJlcUNoaWxkcmVuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZXF1aXJlZENoaWxkcmVuTGVuZ3RoID0gcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcIipbY29udGFpbnMoQHJvbGUsJ1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicpXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgUlBUVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoci5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgci5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRpZCBub3QgaGF2ZSBhIGtleSBoYW5kbGVyLiAgU2VlIGlmIGFueSBvZiB0aGUgZ3JhbmRjaGlsZHJlbiBkby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgUlBUVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgcmVxdWlyZWQgY2hpbGRyZW4gKG9yIGFueSBkZXNjZW5kYW50cyBvZiB0aGUgcmVxdWlyZWQgY2hpbGRyZW4pIG11c3QgaGF2ZSBrZXlwcmVzcy9rZXlkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgaXQgaXMgYSBmYWlsdXJlLCBubyBuZWVkIHRvIGtlZXAgY2hlY2tpbmcgYW55IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBmYWlsZWQgdGhlIGtleWRvd24va2V5cHJlc3MsIGFuZCBpdCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNoaWxkcmVuLCBzdWNoIGFzIG1lbnViYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBzYXZlZFBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGxlYXZlIGl0IHRvIHRoZSBjb21ib2JveCBydWxlcyB0byBjaGVja1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVkUGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5LCBhcmlhOmJhbm5lciwgYXJpYTpjb250ZW50aW5mbywgYXJpYTptYWluLCBhcmlhOm5hdmlnYXRpb24sIGFyaWE6cmVnaW9uLCBhcmlhOnNlYXJjaCwgYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJsYW5kbWFya19uYW1lX3VuaXF1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzBcIjogXCJGYWlsXzBcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiTXVsdGlwbGUgXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGggdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgZGlzdGluZ3Vpc2hlZCBieSB1bmlxdWUgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcIk11bHRpcGxlIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGZyb20gb25lIGFub3RoZXIgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgXFxcInsxfVxcXCIgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNdWx0aXBsZSBsYW5kbWFya3Mgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJ2FyaWEtbGFiZWxsZWRieScgb3IgJ2FyaWEtbGFiZWwnIG9yIGJlIG5lc3RlZCBpbiBhIGRpZmZlcmVudCBwYXJlbnQgcmVnaW9uc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVE9ETyBkbyBJIG5lZWQgdG8gZml0ZXIgb3V0IGJhZCBjb250ZW50aW5mbyBub2RlczogVGhlIGZvb3RlciBlbGVtZW50IGlzIG5vdCBhIGNvbnRlbnRpbmZvIGxhbmRtYXJrIHdoZW4gaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBmb2xsb3dpbmcgSFRNTDUgc2VjdGlvbmluZyBlbGVtZW50czogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhpcyBsYW5kbWFyayBpcyBpbnNpZGUgYSBkaWFsb2cgZWxlbWVudC4gSWYgaXQgaXMgd2UgYXJlIGdvaW5nIHRvIHNraXAgY2hlY2tpbmcgaXQuIFxuICAgICAgICB2YXIgY29weU9mUnVsZUNvbnRleHQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgdmFyIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29weU9mUnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC51bnNoaWZ0KGNvcHlPZlJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGNvcHlPZlJ1bGVDb250ZXh0ID0gY29weU9mUnVsZUNvbnRleHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAvLyBTa2lwcGluZyBjaGVja2luZyBsYW5kbWFya3MgdGhhdCBoYXBwZW4gdG8gYmUgaW5zaWRlIGRpYWxvZyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWdpbmluZyBmb3JtQ2FjaGUgd29ya1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA6IHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogc3RyaW5nW10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IHN0cmluZ1tdXG4gICAgICAgIH0gPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tRU5URVJJTkcgRk9STSBDQUNIRVwiKVxuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1RlbXAgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLFtyb2xlPVwic2VhcmNoXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXMgPSBBcnJheS5mcm9tKG5hdmlnYXRpb25Ob2Rlc1RlbXApO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBbXTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgLy8gVGhpcyBibG9jayBvZiBjb2RlIGZpbHRlcnMgb3V0IGFueSBuYXYgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgYW4gZGlhbG9nLiBBcyB0aG9zZSBhcmUgbm90IG9uZXMgd2Ugd2FudCB0byB0ZXN0IGFnYWluc3QgYXMgd2UgY29uc2lkZXIgZGlhbG9ncyBhcmUgc2VwYXJhdGUgbG9jYXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGFnZS4gICAgXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGEgPSBuYXZpZ2F0aW9uTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGRpYWxvZ05vZGVGb3VuZEZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYSkge1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEudGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGEuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ05vZGVGb3VuZEZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZGlhbG9nTm9kZUZvdW5kRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncy5wdXNoKG5hdmlnYXRpb25Ob2Rlc1tpXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncztcblxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbGV0IGVscyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxzLnB1c2goYSk7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBuZWFyZXN0IGxhbmRtYXJrIHBhcmVudCBiYXNlZCBvbiB0aGUgdGFnTmFtZSBvciB0aGUgcm9sZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJBU0lERVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT09URVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9STVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFJTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJOQVZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VDVElPTlwiLFxuICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVOYW1lVHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxzW2pdLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKTsgLy8gVE9ETyB3ZSBhcmUgbm90IGNvdmVyaW5nIHRoZSBjYXNlIHdoZXJlIGEgZWxlbWVuZW50IHdpdGggbXVsdGlwbGUgcm9sZXMuIEUuZy4gcm9sZSA9IFwiZm9ybSBiYW5uZXJcIi4gVGhpcyBpcyBhIGltcHJvdm1lbnQgd2UgbWlnaHQgd2FudCB0byBhZGQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZVRyaWdnZXIgfHwgcm9sZU5hbWVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWFyZXN0IHBhcmVudC1sYW5kbWFyayBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKGVsc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gZWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgZmlsZSBzbyBpdCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5jb21wdXRlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzIHRvIGZpbmQgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NfMF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wYXJlIGFnYWluc3Qgb3Vyc2VsZnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCB0d28gcm9vdCBub2Rlcywgc28gd2Ugc2hvdWxkIGNvbXBhcmUgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2ldKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBoYXZlIHRoZSBzYW1lIHJvbGUgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBoYXZlIHRoZSBzYW1lIChjb21wdXRlZCkgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIkZhaWxfMFwiKTsgLy8gRmFpbCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyAmJiBzYW1lIG5vZGUgcm9sZXMgQlVUIGRpZmZlcmVudCBjb21wdXRlZCBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IGEgUGFzc18wLiBCdXQgd2UgbmVlZCB0byBjaGVjayBhbGwgbm9kZXMgdG8gc2VlIGlmIGFub3RoZXIgb25lIGZhaWxzLiBTbyBzZXQgYSBmbGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzXzBfZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgYnV0IGRpZmZlcmVudCBub2RlIHJvbGVzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgYSBzaW5nbGUgcm9vdCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgTk9UIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5zYW1lTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBzYW1lIHBhcmVudC1sYW5kbWFyayBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2ldKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBoYXZlIHRoZSBzYW1lIHJvbGUgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBoYXZlIHRoZSBzYW1lIChjb21wdXRlZCkgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIkZhaWxfMFwiKTsgLy8gRmFpbCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyAmJiBzYW1lIG5vZGUgcm9sZXMgQlVUIGRpZmZlcmVudCBjb21wdXRlZCBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IGEgUGFzc18wLiBCdXQgd2UgbmVlZCB0byBjaGVjayBhbGwgbm9kZXMgdG8gc2VlIGlmIGFub3RoZXIgb25lIGZhaWxzLiBTbyBzZXQgYSBmbGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzXzBfZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgYnV0IGRpZmZlcmVudCBub2RlIHJvbGVzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgcGFyZW50cyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc18wX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIm51bGxcIik7IC8vIFRoaXMgaXMgbm90IHRoZSBrZXl3b3JkIG51bGwgb24gcHVycG9zZS4gSXQgaXMgYSBzcGFjZWhvbGRlciBpbiB0aGUgYXJyYXkgc28gaW5kZXhlcyBtYXRjaCB1cC5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgPSBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBmb3JtQ2FjaGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gQWRkIHZhbGlkYXRpb24gdGhhdCBhbGwgMyBhcnJheXMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tRW5kIGZvcm1DYWNoZVwiKVxuICAgICAgICB9IC8vIEVuZCBmb3JtQ2FjaGVcblxuICAgICAgICBsZXQgaW5kZXhUb0NoZWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleFRvQ2hlY2sgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJQYXNzXzBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiRmFpbF8wXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMFwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpbmRleFRvQ2hlY2tdLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9tYWluX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm1haW5cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNSZXF1aXJlTGFiZWxfSW1wbGljaXRfMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY29udGV4dExhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBwYXJlbnREb2NSb2xlID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCBtYWlucyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWlucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1haW5zW2ldID09PSBydWxlQ29udGV4dCkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQgPSBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIGxldCB0aGlzUGFyZW50RG9jUm9sZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgICAgICBtYWluc1tpXSxcbiAgICAgICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzUGFyZW50RG9jUm9sZSA9PT0gcGFyZW50RG9jUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmdldEFyaWFMYWJlbChtYWluc1tpXSkgPT09IGNvbnRleHRMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX21haW5fbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNWaXNpYmxlTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcIm1haW5cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIHZpc2libGUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGUgc2hvdWxkIGhhdmUgYSB1bmlxdWUgdmlzaWJsZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vY2FsbCBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbiB3aXRoIGNvbnNpZGVySW1wbGljaXQgZmxhZyBhcyB0cnVlXG4gICAgICAgIC8vc28gdGhhdCB0aGUgbWV0aG9kIHJldHVycyA8bWFpbj4gZWxlbWVudHNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGxhbmRtYXJrcyk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bmF2aWdhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVOYXZpZ2F0aW9uTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibmF2aWdhdGlvblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9wYXJlbnRfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUGFyZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgcm9sZSBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSB2YWxpZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBpcyBub3QgY29udGFpbmVkIGluIG9yIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyByb2xlczogXFxcInsxfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IENoZWNrIEZhaWwgM1xuICAgIGFjdDogXCJmZjg5YzlcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgYSBwcmVzZW50YXRpb25hbCBjaGlsZCBvZiBhbiBlbGVtZW50XG4gICAgICAgIGlmIChSUFRVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgbm9uZSBvciBwcmVzZW50YXRpb24gcm9sZVxuICAgICAgICBsZXQgcHJlc2VudGF0aW9uUm9sZXMgPSBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdO1xuICAgICAgICBjb25zdCBmb3VuZCA9IHJvbGVzLnNvbWUocj0+IHByZXNlbnRhdGlvblJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lclJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRDb250YWluZXIgPSAwO1xuXG4gICAgICAgIGxldCBhbmNlc3RvclJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGNvdW50ID0gMjtcbiAgICAgICAgd2hpbGUgKHBhcmVudFJvbGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gY291bnRdO1xuXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IHJvbGVzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlc3RlZENvbnRhaW5lcisrO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lclJvbGVzID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLmNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY29udGFpbmVyc0xlbmd0aCA9IGNvbnRhaW5lclJvbGVzLmxlbmd0aDsgIXBhc3NlZCAmJiBpIDwgY29udGFpbmVyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhcmVudFJvbGUgPT09IGNvbnRhaW5lclJvbGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKGNvbnRhaW5lclJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICh0ZXN0ZWRDb250YWluZXIgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVSZWdpb25zVW5pcXVlTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggYSBcXFwicmVnaW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGlmIGl0IGhhcyBhbiBhcmlhIGxhYmVsIG9yIHRpdGxlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwicmVnaW9uXCIgfHxcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHxcbiAgICAgICAgICAgIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwicmVnaW9uXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJlxuICAgICAgICAgICAgICAgICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcmVnaW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVnaW9uTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBhIFxcXCJyZWdpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggYW4gJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcm9sZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRSb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXJpYV9yb2xlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgbXVzdCBoYXZlIGEgdmFsaWQgJ3JvbGUnIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIHJvbGUgJ3swfScgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBpcyBub3QgdmFsaWQgcGVyIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNvbWUgb2YgdGhlIHJvbGVzLCAnezB9JywgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBhcmUgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmVjaGVja1xuICAgIGFjdDogXCI2NzRiMTBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcm9sZVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChyb2xlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpbnZhbGlkUm9sZXMgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gcm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgaXNUYWJsZURlc2NlbmRhbnQsIGFyZVJvbGVzRGVmaW5lZCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfcm9sZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfcm9sZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQW4gZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50IDx7MX0+XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgc2hvdWxkIG5vdCBiZSByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZWxlbU5hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYXJpYVJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBhcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICBpZiAocGFyZW50Um9sZSAhPT0gbnVsbCAmJiBwYXJlbnRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFpbXBsaWNpdFJvbGVzIHx8IGltcGxpY2l0Um9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFpbXBsaWNpdFJvbGVzLmluY2x1ZGVzKGFyaWFSb2xlc1tpXSkpICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgZWxzZSAgICAgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYVJvbGVzW2ldLCBlbGVtTmFtZV0pKTtcbiAgICAgICAgfSAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnNlYXJjaFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVTZWFyY2hMYW5kbWFya3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJzZWFyY2hcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBhcmVSb2xlc0RlZmluZWQsIGlzVGFibGVEZXNjZW5kYW50LCBnZXRJbnZhbGlkUm9sZXMsIGdldERlcHJlY2F0ZWRBcmlhUm9sZXMsIGdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcywgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX3NlbWFudGljc19yb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gYW5kIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBicm93c2VyIHNpbmNlIHRoZSBlbGVtZW50IGlzIGZvY3VzYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcm9sZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSkgYW5kIGZyYWdtZW50IG5vZGVzICgxMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBhcmlhX3JvbGVfYWxsb3dlZC4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGNvbnN0IHVuZGVmaW5lZFJvbGVzID0gZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodW5kZWZpbmVkUm9sZXMgJiYgdW5kZWZpbmVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IGdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCwgdGhlbiBza2lwXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtcImdlbmVyaWNcIiwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGludmFsaWRSb2xlcyA9IGdldEludmFsaWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMgPT09IG51bGwgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcblxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpIHx8IGludmFsaWRSb2xlcy5pbmNsdWRlcyhcIm5vbmVcIikgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9tUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIFRoaXMgcnVsZSBpcyBpbiB0aGUgc2FtZSBmaWxlIGJlY2F1c2UgdGhlcmUgaXMgYSBkZXBlbmRlbmN5IHRoYXQgYXJpYV9yb2xlX3ZhbGlkIHJ1bnMgZmlyc3QsXG4vLyBhbmQgdGhlIGluZm8gaXMgcGFzc2VkIGJ5IGNhY2hlLCBidXQgdGhlcmUgaXNuJ3QgYSBkZXBlbmRlbmN5IGluIHRoZSBGYWlsXzIgc2NlbmFyaW8sIHNvIHJlZ3VsYXJcbi8vIGRlcGVuZGVuY3kgY2Fubm90IGJlIHVzZWRcbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgLy8gVGhlIHRoZSBBUklBIHJvbGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgYW5kIEFSSUEgcm9sZSB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIGFyZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgYW5kIEFSSUEgcm9sZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiB3aXRoIEFSSUEgcm9sZSBcXFwiezJ9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiB3aXRoIGltcGxpY2l0IEFSSUEgcm9sZSBcXFwiezJ9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiNWMwMWVhXCIsIHsgXCI0NmNhN2ZcIjogeyBcIlBhc3NcIjogXCJwYXNzXCIsIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImZhaWxcIiwgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIG9ubHkgY2hlayBlbGVtZW50ICgxKVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgbm8gYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzOnN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzID09PSBudWxsIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICAgICAgaWYgKCFhcmVSb2xlc0RlZmluZWQocm9sZXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9ubyBleHBsaWNpdCByb2xlIGRlZmluZWRcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGV4cGxpY2l0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZmFpbGVkQXR0cmlidXRlcyA9IGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghZmFpbGVkQXR0cmlidXRlcyB8fCBmYWlsZWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIiwgW2FyaWFBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG5cbiAgICAgICAgaWYgKHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChleHBsaWNpdClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgXCJub25lXCJdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnRvb2xiYXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlVG9vbGJhclVuaXF1ZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSB0b29sYmFyIGNvbXBvbmVudHMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCB0b29sYmFyIGNvbXBvbmVudHMgb24gYSBwYWdlIG11c3QgaGF2ZSB1bmlxdWUgbGFiZWxzIHNwZWNpZmllZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3dpZGdldF9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3dpZGdldF9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1dpZGdldExhYmVsc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IG11c3QgaGF2ZSBhIHByb2dyYW1tYXRpY2FsbHkgYXNzb2NpYXRlZCBuYW1lXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludGVyYWN0aXZlIGNvbXBvbmVudCB3aXRoIEFSSUEgcm9sZSAnezB9JyBkb2VzIG5vdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwibTZiMXEzXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gYW5kIHJvbGU9bm9uZSBzaW5jZSB0aGVzZSAyIHJvbGVzIGFyZSBub3QgaW4gdGhlIGxpc3Qgb2Ygd2lkZ2V0IHR5cGUgcm9sZXMgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiZcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImhpZGRlblwiKSB8fFxuICAgICAgICAgICAgKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGRpYWdub3NlIHRoYXQgYSBjb21ib2JveCBpbnB1dCB0ZXh0Ym94IGhhcyBhIGxhYmVsKGdpdGh1YiBpc3N1ZSAjMTEwNClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1Sb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzXG4gICAgICAgIGxldCBza2lwUm9sZXMgPSBbXG4gICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgXCJsaXN0Ym94XCIsXG4gICAgICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1yYWRpb1wiLFxuICAgICAgICAgICAgXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJzZWFyY2hib3hcIixcbiAgICAgICAgICAgIFwic2xpZGVyXCIsXG4gICAgICAgICAgICBcInNwaW5idXR0b25cIixcbiAgICAgICAgICAgIFwic3dpdGNoXCIsXG4gICAgICAgICAgICBcInRleHRib3hcIixcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIixcbiAgICAgICAgICAgIFwibGlua1wiLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2tpcFJvbGVzLmluY2x1ZGVzKGVsZW1Sb2xlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhZ05hbWUgPT09IFwib3V0cHV0XCIgfHxcbiAgICAgICAgICAgICh0YWdOYW1lID09PSBcImlucHV0XCIgJiZcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImZpbGVcIilcbiAgICAgICAgKSB7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBGb3JtL2lucHV0IGVsZW1lbnRzIGFyZSBjaGVja2VkIGJ5IEc0MSwgd2Ugc2tpcCB0aGVtIGZyb20gdGhpcyBydWxlLiBHaXRodWIgaXNzdWUgNDQ5XG4gICAgICAgICAgICBsZXQgc2tpcEVsZW1lbnRzID0gW1xuICAgICAgICAgICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICBcInRleHRhcmVhXCIsXG4gICAgICAgICAgICAgICAgXCJzZWxlY3RcIixcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YWxpc3RcIixcbiAgICAgICAgICAgICAgICBcIm9wdGdyb3VwXCIsXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcImtleWdlblwiLFxuICAgICAgICAgICAgICAgIFwib3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIFwibWV0ZXJcIixcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2tpcEVsZW1lbnRzLmluZGV4T2YocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT1cbiAgICAgICAgICAgICAgICAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIHRoZSBwb3B1cCBsaXN0IG9mIGEgY29tYm9ib3guXG4gICAgICAgIGxldCByb2xlc1RvQ2hlY2sgPSBbXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXNUb0NoZWNrLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBSUFRVdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21ib2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vd25zXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyaWFfb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bnMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYV9vd25zLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bnNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBwcm9oaWJpdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9nZXQgYXR0cmlidXRlIHJvbGVzIGFzIHdlbGwgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBsZXQgbnVtV2lkZ2V0c1Rlc3RlZCA9IDA7XG4gICAgICAgIGxldCBpbnRlcmFjdGl2ZVJvbGVUeXBlcyA9IFtcIndpZGdldFwiLCBcImxpdmVSZWdpb25cIiwgXCJ3aW5kb3dcIl07XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IHBhc3NlZCAmJiBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZVJlcXVpcmVkICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5yb2xlVHlwZSAmJlxuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlUm9sZVR5cGVzLmluY2x1ZGVzKHBhdHRlcm4ucm9sZVR5cGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICArK251bVdpZGdldHNUZXN0ZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBBbGwgd2lkZ2V0cyBtYXkgaGF2ZSBhbiBhdXRob3Igc3VwcGxpZWQgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgIC8vIFRpdGxlIGlzIGxlZ2FsLCBidXQgZG9uJ3QgYWR2ZXJ0aXNlIGl0cyB1c2UgaW4gZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBFbmNvdXJhZ2UgdXNlIG9mIGFyaWEtbGFiZWwsIGFyaWEtbGFiZWxsZWRieSBvciBodG1sIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZUZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwiY29udGVudHNcIikgPj0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgd2lkZ2V0J3MgYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIGJ5IGVsZW1lbnQncyBpbm5lciB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudE9yQWx0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgaW1wbGljaXQgbGFiZWwsIGxpa2UgPGxhYmVsPjxpbnB1dCAuLi4uPmFiYyA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBhc3NlZCAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLmNsZWFuV2hpdGVzcGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ubmFtZUZyb20uaW5kZXhPZihcInByb2hpYml0ZWRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9oaWJpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtV2lkZ2V0c1Rlc3RlZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtlbGVtUm9sZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZCkge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFzY2lpYXJ0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXNjaWlhcnRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnByZSwgZG9tOmxpc3RpbmcsIGRvbTp4bXAsIGRvbTpwbGFpbnRleHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9QcmVfQVNDSUlBcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgQVNDSUkgYXJ0IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBU0NJSSBhcnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlY2lzaW9uIGluIHBsYW5uaW5nIDkvNy8yMyB0aGF0IHRoaXMgcnVsZSBjYXVzZXMgbW9yZSByZXZpZXdzIHRoYXQgd2Ugc2VlIGFjdHVhbCBwcm9ibGVtcyBpbiBjb250ZW50LCBzbyB0dXJuIHRoZXNlIHJ1bGVzIG9mZlxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBGaXggZm9yIElEV0Igd3JpdGVycy4gRG9uJ3QgdHJpZ2dlciBpZiBjb250ZW50IGlzIGluIGEgY29kZSBlbGVtZW50LiAgVGhlIGNvZGUgZWxlbWVudCBpcyBzZWFyY2hlZCBmb3JcbiAgICAgICAgLy8gaW4gdmFyaW91cyBwbGFjZXMgYmVjYXVzZSBvZiB0aGUgd2VpcmQgd2F5IHZhcmlvdXMgYnJvd3NlcnMgcmVuZGVyIDxjb2RlPjxwcmU+PC9wcmU+PC9jb2RlLiAgRmlyZWZveCxcbiAgICAgICAgLy8gSHRtbFVuaXQgYW5kIENocm9tZSBhbGwgcmVuZGVyIGRpZmZlcmVudGx5LiAgRmlyZWZveDogPGNvZGU+PC9jb2RlPjxwcmU+PC9wcmU+ICBIdG1sVW5pdDogPC9jb2RlPjxwcmU+PGNvZGU+PC9jb2RlPjwvcHJlPlxuICAgICAgICAvLyBTZWUgdW5pdCB0ZXN0IENvZGVFbGVtZW50QWJvdmVQcmVFbGVtZW50Lmh0bWwuICBEb24ndCBrbm93IGhvdyBSUFQgcmVuZGVycywgc28gY292ZXIgYWxsIHRoZSBiYXNlcy5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJwcmVcIikge1xuICAgICAgICAgICAgaWYgKChydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcgJiYgcnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJjb2RlXCIpIHx8XG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb2RlXCIpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImNvZGVcIikpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgdHh0VmFsdWUgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgbGFzdENoYXJhY3RlciA9IFwiXCI7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0ZXh0IGNvbnRlbnRcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgcGFzc2VkICYmIChpZHggPCB0eHRWYWx1ZS5sZW5ndGgpOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IGNoU3RyID0gdHh0VmFsdWUuc3Vic3RyKGlkeCwgMSk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbHBoYW51bWVyaWMgb3IgcHVuY3R1YXRpb25cbiAgICAgICAgICAgIGlmICgvW1xcdyFAIyQlJlxcKigpLiw/XFxbXFxde308Pj1cIjpcXC9cXFxcLV0vLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IHNhbWUgY2hhcmFjdGVyIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gY2hTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgKyAxOztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9cXHMvLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXIgPSBjaFN0cjtcblxuICAgICAgICAgICAgLy8gTWFrZSB0aGUgZGVjaXNpb25cbiAgICAgICAgICAgIGlmIChub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID49IDUgfHwgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGJsaW5rX2Nzc19yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxpbmtfY3NzX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbGlua19DU1NUcmlnZ2VyMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRG8gbm90IHVzZSB0aGUgXFxcImJsaW5rXFxcIiB2YWx1ZSBvZiB0aGUgJ3RleHQtZGVjb3JhdGlvbicgcHJvcGVydHkgZm9yIGxvbmdlciB0aGFuIGZpdmUgc2Vjb25kc1wiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSBDU1MgJ3RleHQtZGVjb3JhdGlvbicgcHJvcGVydHkgaXMgbm90IHVzZWQgZm9yIG1vcmUgdGhhbiB0aGFuIGZpdmUgc2Vjb25kc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMi4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0ZXh0VmFsdWUgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoJ3N0eWxlJykpIHtcbiAgICAgICAgICAgIHRleHRWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0ZXh0VmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwidGV4dC1kZWNvcmF0aW9uOmJsaW5rXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGJsaW5rX2VsZW1fZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19lbGVtX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpibGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JsaW5rX0Fsd2F5c1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbnRlbnQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5IG11c3Qgbm90IGJlIHVzZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBmb3VuZCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYmxvY2txdW90ZV9jaXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YmxvY2txdW90ZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Jsb2NrcXVvdGVfSGFzQ2l0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCA8YmxvY2txdW90ZT4gc2hvdWxkIG5vdCBiZSB1c2VkIG9ubHkgZm9yIHF1b3RhdGlvbnMsIG5vdCBpbmRlbnRhdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZSA8YmxvY2txdW90ZT4gb25seSBmb3IgcXVvdGF0aW9ucywgbm90IGluZGVudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImNpdGVcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgY2l0ZUVsZW1zID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImNpdGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaXRlRWxlbXMgIT0gbnVsbCAmJiBjaXRlRWxlbXMubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGNhbnZhc19jb250ZW50X2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYW52YXNcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQ2FudmFzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSA8Y2FudmFzPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYW52YXM+IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGNhcHRpb25fdHJhY2tfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfVmlkZW9fSGFzTm9UcmFja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBjYXB0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhbnkgbWVhbmluZ2Z1bCBhdWRpbyBvciBwcm92aWRlIGEgY2FwdGlvbiB0cmFjayBmb3IgdGhlIDx2aWRlbz4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPHZpZGVvPiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4xXCIsIFwiMS4yLjJcIiwgXCIxLjIuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVmlkZW9FbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWdub3JlIGRlY29yYXRpdmUgdmlkZW8gaWYgdXNlciB1c2VzIGFyaWEtaGlkZGVuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyYWNrcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJhY2tcIik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCB0cmFja3NbaV0uZ2V0QXR0cmlidXRlKFwia2luZFwiKSA9PT0gJ2NhcHRpb25zJztcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVja3MgZm9yIGFkZGl0aW9uIG9mIGR5bmFtaWMgdHJhY2tzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC50ZXh0VHJhY2tzICYmIHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlQ29udGV4dC50ZXh0VHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHJ1bGVDb250ZXh0LnRleHRUcmFja3NbaV0ua2luZCA9PT0gJ2NhcHRpb25zJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgdXNlZCBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIGNvbWJvYm94XCIsXG4gICAgICAgICAgICBcIkZhaWxfbWlzc2luZ1wiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfaW5fcG9wdXBcIjogXCJUaGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgcG9wdXAgcmVmZXJlbmNlZCBieSAnaWQnIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2l0aCB0aGUgcm9sZXMgXFxcInsxfVxcXCIsIHdoaWNoIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBBUklBIHJvbGUgb2YgJ29wdGlvbicsICdncmlkY2VsbCcsICdyb3cnLCBvciAndHJlZWl0ZW0nXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlICdhcmlhLXNlbGVjdGVkJyBzZXQgdG8gdHJ1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIG11c3QgYmUgdXNlZCB0byBkZWZpbmUgZm9jdXMgd2l0aGluIHRoZSBjb21ib2JveCBwb3B1cCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFRoaXMgcnVsZSBvbmx5IGFwcGxpZXMgaWYgdGhlIGFjdGl2ZWRlc2NlbmRhbnQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGxldCBhY3RpdmVJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgaWYgKCFhY3RpdmVJZCB8fCBhY3RpdmVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFjdGl2ZUlkKTtcbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX21pc3NpbmdcIiwgW2FjdGl2ZUlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50ICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhY3RpdmVJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gW107XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZVBhc3MoXCJGYWlsX25vdF9pbl9wb3B1cFwiLCBbYWN0aXZlSWQsIHBvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGFjdGl2ZUVsZW0sIHRydWUpO1xuICAgICAgICBsZXQgdmFsaWRSb2xlcyA9IFtcIm9wdGlvblwiLCBcImdyaWRjZWxsXCIsIFwicm93XCIsIFwidHJlZWl0ZW1cIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IGFjdGl2ZVJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCIsIFthY3RpdmVJZCwgYWN0aXZlUm9sZXMuam9pbihcIixcIildKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpICE9PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIiwgW2FjdGl2ZUlkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTm9kZVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiRmFpbF9pbmxpbmVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSBjb21ib2JveCBkb2VzIG5vdCB1c2UgJ2FyaWEtYXV0b2NvbXBsZXRlJyB2YWx1ZSAnXFxcImlubGluZVxcXCInIG5vciBkb2VzIGl0IGhhdmUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBkZWZpbmVkIHdpdGhpbiB0aGUgcG9wdXBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGNvbWJvYm94IGhhcyB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaW5jb3JyZWN0bHkgc2V0IG9uIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5IFxcXCJ7MH1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHN1cHBvcnQgYW4gJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgdmFsdWUgc2V0IHRvICdcXFwiaW5saW5lXFxcIicgXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBjb21ib2JveCB0aGF0IHN1cHBvcnRzIGF1dG9jb21wbGV0aW9uIGJlaGF2aW9yIG11c3QgaGF2ZSB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgb25seSBvbiBpdHMgdGV4dCBpbnB1dCBlbGVtZW50IHdpdGggYSB2YWxpZCB2YWx1ZTsgYSB2YWx1ZSBvZiAnXFxcImlubGluZVxcXCInIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBJZCwgcG9wdXBFbGVtZW50IH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICBsZXQgcmV0VmFsID0gW107XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKSA9PT0gXCJpbmxpbmVcIikge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2lubGluZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTsgXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHBvcHVwRWxlbWVudCBpdHNlbGYgaGFzIFwiYXJpYS1hdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgcGFzc2VkID0gIXBvcHVwRWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKTtcbiAgICAgICAgICAgIC8vIGlmIGFueSBjaGlsZCBvZiBwb3B1cEVsZW1lbnQgaGFzIFwiYXJpYS1hdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4gJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3BvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5mdW5jdGlvbiBwYXR0ZXJuRGV0ZWN0KGVsZW06IEVsZW1lbnQpOiBTdHJpbmcge1xuICAgIC8vIGNoZWNrICdleHBsaWNpdCcgcm9sZSBjb21ib2JveCBhbmQgdGhhdCBpdCBpcyBub3QgPHNlbGVjdD4uIFxuICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZWxlY3RcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgIT09IFwiY29tYm9ib3hcIikge1xuICAgICAgICByZXR1cm4gXCJpbXBsaWNpdFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgJiYgKCFlbGVtLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInRleHRcIilcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjAgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyB0byBjb250aW51ZSB0byBhbGxvd1xuICAgICAgICByZXR1cm4gXCIxLjBcIjtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJpbnB1dFwiXG4gICAgICAgICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpICYmICFlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgLy8gTG9va3MgbGlrZSB0aGlzIGlzIGFuIEFSSUEgMS4xIHBhdHRlcm4sIHdoaWNoIHRoZSBBUklBIDEuMiBzcGVjIHNheXMgaXMgbm93IGludmFsaWRcbiAgICAgICAgcmV0dXJuIFwiMS4xXCI7XG4gICAgfVxuICAgIC8vIEFzc3VtZSB0aGV5J3JlIHRyeWluZyB0byBkbyB0aGUgbGF0ZXN0LCAxLjIgcGF0dGVyblxuICAgIHJldHVybiBcIjEuMlwiO1xufVxuXG5leHBvcnQgbGV0IGNvbWJvYm94X2Rlc2lnbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X3ZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlBhc3NfMS4wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiRmFpbF8xLjFcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJQYXNzXzEuMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMCwgd2hpY2ggaXMgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMSwgd2hpY2ggaXMgbm90IGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gbXVzdCBiZSB2YWxpZCBmb3IgQVJJQSAxLjJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5EZXRlY3QocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFdlIGRvbid0IGFzc2VzcyBuYXRpdmUgc2VsZWN0IGVsZW1lbnRzIGhlcmVcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGV4cGFuZGVkID0gKFJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWV4cGFuZGVkXCIpIHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICAgICAgbGV0IGVkaXRhYmxlID0gdGFnTmFtZSA9PT0gXCJpbnB1dFwiICYmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiKTtcblxuICAgICAgICBsZXQga2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgICAgICBjYWNoZVtrZXldID0ge1xuICAgICAgICAgICAgICAgIFwiaW5wdXRFbGVtZW50XCI6IGVkaXRhYmxlID8gcnVsZUNvbnRleHQgOiBudWxsLFxuICAgICAgICAgICAgICAgIFwicGF0dGVyblwiOiBwYXR0ZXJuLFxuICAgICAgICAgICAgICAgIFwiZXhwYW5kZWRcIjogZXhwYW5kZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIGNhY2hlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIHhwYXRoP1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjFcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xLjFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X3RhYmJhYmxlXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkRPTSBmb2N1cyBpcyBhbGxvd2VkIG9ubHkgb24gdGhlIGNvbWJvYm94IGVsZW1lbnQgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJUaGUgY29tYm9ib3ggZWxlbWVudCBkb2VzIG5vdCBhbGxvdyBET00gZm9jdXMgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiOiBcIlRoZSBwb3B1cCBvZiB0aGUgY29tYm9ib3ggaGFzIERPTSBmb2N1cyBvciBoYXMgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgZGVmaW5lZCwgd2hpY2ggaXMgbm90IGFsbG93ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJiYWJsZSBmb2N1cyBmb3IgdGhlIGNvbWJvYm94IG11c3QgYmUgYWxsb3dlZCBvbmx5IG9uIHRoZSB0ZXh0IGlucHV0LCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcG9wdXBSb2xlID0gUlBUVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpWzBdO1xuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXVxuICAgICAgICBpZiAoIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9ub3RfdGFiYmFibGVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBtYWtlcyBzZW5zZSB0byBjaGVjayB0aGUgcG9wdXAgd2hlbiBleHBhbmRlZFxuICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIGRpYWxvZ3MsIHJldHVybiBwYXNzIHNpbmNlIHRoZSBtYWluIGVsZW1lbnQgd2FzIGZvY3VzYWJsZSBhYm92ZVxuICAgICAgICBpZiAoZXhwYW5kZWQgPT09IGZhbHNlIHx8IHBvcHVwUm9sZSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhUlBUVXRpbC5pc1RhYmJhYmxlKHBvcHVwRWxlbWVudCkgJiYgIVJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShwb3B1cEVsZW1lbnQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpOztcbiAgICAgICAgICAgIC8vIGlmIGFueSBjaGlsZCBvZiBwb3B1cEVsZW1lbnQgaGFzIFwiYXJpYS1hdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4gJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzVGFiYmFibGUobncubm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKG53Lm5vZGUsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcgJiYgbncubm9kZSA9PT0gcG9wdXBFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQpIGJyZWFrOyAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfdGFiYmFibGVfY2hpbGRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X2hhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMCkgYXBwcm9wcmlhdGVseSByZWZlcmVuY2VzIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAncm9sZScgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCIgc2hvdWxkIGJlIG9uZSBvZiBcXFwibGlzdGJveFxcXCIsIFxcXCJncmlkXFxcIiwgXFxcInRyZWVcXFwiIG9yIFxcXCJkaWFsb2dcXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIlRoZSB2YWx1ZSBvZiB0aGUgY29tYm9ib3ggJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBtYXRjaCB0aGUgJ3JvbGUnIHZhbHVlIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGF0dHJpYnV0ZSAnYXJpYS1oYXNwb3B1cCcgdmFsdWUgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHJvbGUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3B1cCByb2xlIGlzIGxpc3Rib3gsIGdyaWQsIHRyZWUsIG9yIGRpYWxvZyBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgcG9wdXBSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJsaXN0Ym94XCIsIFwiZ3JpZFwiLCBcInRyZWVcIiwgXCJkaWFsb2dcIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IHBvcHVwUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIiwgW3BvcHVwUm9sZXMuam9pbihcIixcIiksIHBvcHVwSWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwb3B1cFJvbGUgPSB2YWxpZFJvbGVzWzBdO1xuICAgICAgICAgICAgbGV0IGhhc3BvcHVwVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSB8fCBcImxpc3Rib3hcIjtcbiAgICAgICAgICAgIC8vIFBvcHVwIHJvbGUgbXVzdCBtYXRjaCBhcmlhLWhhc3BvcHVwIHVubGVzcyBwb3B1cFJvbGUgaXMgbGlzdGJveCwgdGhlbiBhcmlhLWhhc3BvcHVwIHNob3VsZCBub3QgYmUgZGVmaW5lZCAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChoYXNwb3B1cFZhbCAhPT0gcG9wdXBSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHVwUm9sZSAhPT0gXCJsaXN0Ym94XCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIiwgW2hhc3BvcHVwVmFsLCBwb3B1cFJvbGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfZGVzaWduX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9jb2xsYXBzZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIChmb3IgQVJJQSAxLjIpIG9yIHRoZSAnYXJpYS1vd25zJyAoZm9yIEFSSUEgMS4wKSBhdHRyaWJ1dGUgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IG11c3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCByZWZlcmVuY2VkIGJ5ICdhcmlhLW93bnMnIChBUklBIDEuMCkgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9leHBhbmRlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCByZWZlcmVuY2VkIGJ5ICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIGV4aXN0cyBhbmQgaXMgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9jb2xsYXBzZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgaW4gaXRzIGNvbGxhcHNlZCBzdGF0ZSBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHZpc2libGUgcG9wdXAgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiVGhlICdhcmlhLW93bnMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyBhdHRyaWJ1dGUgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGlzIG1pc3NpbmdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIjogXCJUaGUgY29tYm9ib3ggJ2FyaWEtZXhwYW5kZWQnIGF0dHJpYnV0ZSBpcyB0cnVlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIG5vdCB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJUaGUgY29tYm9ib3ggJ2FyaWEtZXhwYW5kZWQnIGF0dHJpYnV0ZSBpcyBmYWxzZSwgYnV0IHRoZSBjb21ib2JveCBwb3B1cCBpcyB2aXNpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjRlOGFiNlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9jb2xsYXBzZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9jb2xsYXBzZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBjYWNoZSA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGNvbnN0IGNhY2hlZEVsZW0gPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG5cbiAgICAgICAgbGV0IHBvcHVwSWQ7XG4gICAgICAgIGxldCBwb3B1cEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT09IFwiMS4yXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudCwgc3RpY2sgaXQgaW4gdGhlIGNhY2hlIGFuZCB0aGVuIGNoZWNrIGl0cyByb2xlXG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBJZCA9IHBvcHVwSWQ7XG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBFbGVtZW50ID0gcG9wdXBFbGVtZW50O1xuXG5cbiAgICAgICAgaWYgKGV4cGFuZGVkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGFuZGVkICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhleHBhbmRlZCA/IFwiUGFzc18xLjBfZXhwYW5kZWRcIiA6IFwiUGFzc18xLjBfY29sbGFwc2VkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKGV4cGFuZGVkID8gXCJQYXNzXzEuMl9leHBhbmRlZFwiIDogXCJQYXNzXzEuMl9jb2xsYXBzZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZGVidWdfcGF0aHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGVidWdfcGF0aHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJERUJVR1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIHJ1bGVDb250ZXh0LnNldEF0dHJpYnV0ZShcImRvbVBhdGhcIiwgY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aCk7XG4gICAgICAgIHJ1bGVDb250ZXh0LnNldEF0dHJpYnV0ZShcImFyaWFQYXRoXCIsIGNvbnRleHRbXCJhcmlhXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGRldGVjdG9yX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRldGVjdG9yX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiRVhURU5TSU9OU1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZXJDb250ZXh0ID0gY29udGV4dEhpZXJhcmNoaWVzLmFyaWFbY29udGV4dEhpZXJhcmNoaWVzLmFyaWEubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbXSwgW3tcbiAgICAgICAgICAgIG5hbWU6IGhpZXJDb250ZXh0LmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIHJvbGU6IGhpZXJDb250ZXh0LnJvbGUsXG4gICAgICAgICAgICB0YWJpbmRleDogcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgXCIwXCIpXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZGlyX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJkaXJfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltkaXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0VsZW1fRGlyVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludmFsaWQgdmFsdWUgdXNlZCBmb3IgdGhlICdkaXInIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidkaXInIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIFxcXCJsdHJcXFwiLCBcXFwicnRsXFxcIiwgb3IgXFxcImF1dG9cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkaXJTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkaXJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGRpclN0ciA9PSBcImx0clwiIHx8IGRpclN0ciA9PSBcInJ0bFwiIHx8IGRpclN0ciA9PSBcImF1dG9cIjtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbaHJlZl0sZG9tOmFyZWFbaHJlZl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfTWVkaWFfRG9jdW1lbnRUcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkb3dubG9hZCBtZWNoYW5pc20gZG9lcyBub3QgY2F1c2UgYSBrZXlib2FyZCB0cmFwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRmlsZSBkb3dubG9hZCBtZWNoYW5pc21zIHNob3VsZCBiZSBrZXlib2FyZC1vcGVyYWJsZSBhbmQgcHJlc2VydmUgcGFnZSBmb2N1cyBsb2NhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBocmVmID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgbGV0IGV4dCA9IFJQVFV0aWwuZ2V0RmlsZUV4dChocmVmKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFbXCIuZG9jeFwiLCBcIi5kb2NcIiwgXCIucGRmXCIsIFwiLm9kdFwiXS5pbmNsdWRlcyhleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY2Nlc3NrZXlfTmVlZExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBIVE1MIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gSFRNTCBlbGVtZW50IHdpdGggYW4gYXNzaWduZWQgJ2FjY2Vzc2tleScgYXR0cmlidXRlIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSkpIHsgLy8gaWdub3JlIGhpZGRlblxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgLy8gYXNzdW1lIHRoZSB2YWxpZGl0eSBvZiB0aGUgaWQgKG9mIGFyaWEtbGFiZWxsZWRieSkgaXMgY2hlY2tlZCBieSBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIikge1xuICAgICAgICAgICAgLy8gYXNzdW1lIHRoZSB2YWxpZGl0eSBvZiB0aGUgbGFiZWwsIGUuZy4gZW1wdHkgbGFiZWwsIGlzIGNoZWNrZWQgYnkgYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FjY2Vzc2tleV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9FbGVtX1VuaXF1ZUFjY2Vzc0tleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiJ2FjY2Vzc2tleScgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBlbGVtZW50IGlzIG5vdCB1bmlxdWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWVzIG9uIGVhY2ggZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBtYXAgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLCB7fSk7XG5cbiAgICAgICAgbGV0IGtleSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFjY2Vzc2tleVwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gIShrZXkgaW4gbWFwKTtcbiAgICAgICAgbWFwW2tleV0gPSB0cnVlO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFwcGxldFwiLCBcImJhc2Vmb250XCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZm9udFwiLCBcImlzaW5kZXhcIiwgXCJsaXN0aW5nXCIsXG4gICAgXCJwbGFpbnRleHRcIiwgXCJzcGFjZXJcIiwgXCJzXCIsIFwic3RyaWtlXCIsIFwidVwiLCBcInhtcFwiLFxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcImFjcm9ueW1cIiwgXCJmcmFtZVwiLCBcImZyYW1lc2V0XCIsIFwibm9mcmFtZXNcIiwgXCJub2VtYmVkXCIsIFwiYmlnXCIsIFwiYmxpbmtcIiwgXCJtYXJxdWVlXCIsIFwidHRcIixcblxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhbGlnblwiLCBcImxpbmtcIiwgXCJhcmNoaXZlXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJjbGVhclwiLCBcImNvZGVcIiwgXCJjb2xvclwiLFxuICAgIFwiY29tcGFjdFwiLCBcImZhY2VcIiwgXCJoc3BhY2VcIiwgXCJsYW5ndWFnZVwiLCBcImxpbmtcIiwgXCJub3NoYWRlXCIsIFwibm93cmFwXCIsIFwib2JqZWN0XCIsXG4gICAgXCJwcm9tcHRcIiwgXCJzdGFydFwiLCBcInRleHRcIiwgXCJ2ZXJzaW9uXCIsIFwidmxpbmtcIiwgXCJ2c3BhY2VcIlxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUyA9IHtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcInRkXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcIm5vd3JhcFwiLCBcInZhbGlnblwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIiwgXCJiZ2NvbG9yXCJdLFxuICAgIFwidGhcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJiZ2NvbG9yXCIsIFwiYWxpZ25cIiwgXCJub3dyYXBcIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJsaVwiOiBbXCJ0eXBlXCIsIFwidmFsdWVcIiwgXCJ0eXBlXCJdLFxuICAgIFwidWxcIjogW1widHlwZVwiLCBcImNvbXBhY3RcIl0sXG4gICAgXCJwcmVcIjogW1wid2lkdGhcIl0sXG5cbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJtZXRhXCI6IFtcImh0dHAtZXF1aXZcIl0sXG4gICAgXCJhXCI6IFtcImNoYXJzZXRcIiwgXCJjb29yZHNcIiwgXCJzaGFwZVwiLCBcInJldlwiLCBcInNjaGVtZVwiXSxcbiAgICBcImxpbmtcIjogW1wicmV2XCIsIFwiY2hhcnNldFwiLCBcInRhcmdldFwiXSxcbiAgICBcImltZ1wiOiBbXCJuYW1lXCIsIFwibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcImFyZWFcIjogW1wibm9ocmVmXCJdLFxuICAgIFwiaGVhZFwiOiBbXCJwcm9maWxlXCJdLFxuICAgIFwiaHRtbFwiOiBbXCJ2ZXJzaW9uXCJdLFxuICAgIFwiaWZyYW1lXCI6IFtcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJmcmFtZWJvcmRlclwiLCBcIm1hcmdpbmhlaWdodFwiLCBcIm1hcmdpbndpZHRoXCIsIFwic2Nyb2xsaW5nXCJdLFxuICAgIFwib2JqZWN0XCI6IFtcImFyY2hpdmVcIiwgXCJjb2RlXCIsIFwiY29kZWJhc2VcIiwgXCJjb2RldHlwZVwiLCBcImRlY2xhcmVcIiwgXCJzdGFuZGJ5XCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJwYXJhbVwiOiBbXCJ0eXBlXCIsIFwidmFsdWV0eXBlXCJdLFxuICAgIFwic2NyaXB0XCI6IFtcImxhbmd1YWdlXCJdLFxuICAgIFwiYm9keVwiOiBbXCJhbGlua1wiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwibGlua1wiLCBcInRleHRcIiwgXCJ2bGlua1wiXSxcbiAgICBcImJyXCI6IFtcImNsZWFyXCJdLFxuICAgIFwiY2FwdGlvblwiOiBbXCJhbGlnblwiXSxcbiAgICBcImNvbFwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJkaXZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJkbFwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwiaHJcIjogW1wiYWxpZ25cIiwgXCJub3NoYWRlXCIsIFwic2l6ZVwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJoMlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImgzXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNVwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaW5wdXRcIjogW1wiYWxpZ25cIiwgXCJ1c2VtYXBcIl0sXG4gICAgXCJsZWdlbmRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJtZW51XCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJvbFwiOiBbXCJjb21wYWN0XCIsIFwidHlwZVwiLCBcInR5cGVcIl0sXG4gICAgXCJwXCI6IFtcImFsaWduXCJdLFxuICAgIFwidGFibGVcIjogW1wiYmdjb2xvclwiLCBcImNlbGxwYWRkaW5nXCIsIFwiY2VsbHNwYWNpbmdcIiwgXCJmcmFtZVwiLCBcInJ1bGVzXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcInRib2R5XCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcImNoYXJvZmZcIl0sXG4gICAgXCJ0Zm9vdFwiOiBbXCJhbGlnblwiLCBcImNoYXJvZmZcIiwgXCJjaGFyXCIsIFwidmFsaWduXCJdLFxuICAgIFwidGhlYWRcIjogW1wiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJhbGlnblwiXSxcbiAgICBcInRyXCI6IFtcImFsaWduXCIsIFwiYmdjb2xvclwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCJdXG59XG5cbmZ1bmN0aW9uIGFycmF5VG9Db250ZXh0U3RyKG9iaiwgdHlwZSkge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnSFRNTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOipbJyArIHByb3AgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gb2JqVG9Db250ZXh0U3RyKG9iaiwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVF9BVFRSSUJVVEVTJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9ialtwcm9wXSBhcyBTdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoXCIsIFwiKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcCArICdbJyArIGl0ZW0gKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206YXBwbGV0LCBkb206YmFzZWZvbnQsIGRvbTpjZW50ZXIsIGRvbTpkaXIsIGRvbTpmb250LCBkb206aXNpbmRleCwgZG9tOmxpc3RpbmcsIGRvbTptZW51LCBkb206cGxhaW50ZXh0LCBkb206c3BhY2VyLCBkb206cywgZG9tOnN0cmlrZSwgZG9tOnUsIGRvbTp4bXAsIGRvbTphY3JvbnltLCBkb206ZnJhbWUsIGRvbTpmcmFtZXNldCwgZG9tOm5vZnJhbWVzLCBkb206bm9lbWJlZCwgZG9tOmJpZywgZG9tOmJsaW5rLCBkb206bWFycXVlZSwgZG9tOnR0TmFOZG9tOipbYWxpZ25dLCBkb206KltsaW5rXSwgZG9tOipbYXJjaGl2ZV0sIGRvbToqW2JhY2tncm91bmRdLCBkb206KltiZ2NvbG9yXSwgZG9tOipbY2xlYXJdLCBkb206Kltjb2RlXSwgZG9tOipbY29sb3JdLCBkb206Kltjb21wYWN0XSwgZG9tOipbZmFjZV0sIGRvbToqW2hzcGFjZV0sIGRvbToqW2xhbmd1YWdlXSwgZG9tOipbbGlua10sIGRvbToqW25vc2hhZGVdLCBkb206Kltub3dyYXBdLCBkb206KltvYmplY3RdLCBkb206Kltwcm9tcHRdLCBkb206KltzdGFydF0sIGRvbToqW3RleHRdLCBkb206Klt2ZXJzaW9uXSwgZG9tOipbdmxpbmtdLCBkb206Klt2c3BhY2VdTmFOZG9tOnRkW2hlaWdodF0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthYmJyXSwgZG9tOnRkW2F4aXNdLCBkb206dGRbY2hhcl0sIGRvbTp0ZFtjaGFyb2ZmXSwgZG9tOnRkW2hlaWdodF0sIGRvbTp0ZFtub3dyYXBdLCBkb206dGRbdmFsaWduXSwgZG9tOnRkW3dpZHRoXSwgZG9tOnRkW2FsaWduXSwgZG9tOnRkW2JnY29sb3JdLCBkb206dGhbaGVpZ2h0XSwgZG9tOnRoW3dpZHRoXSwgZG9tOnRoW2FiYnJdLCBkb206dGhbYXhpc10sIGRvbTp0aFtjaGFyb2ZmXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFtiZ2NvbG9yXSwgZG9tOnRoW2FsaWduXSwgZG9tOnRoW25vd3JhcF0sIGRvbTp0aFtjaGFyXSwgZG9tOnRoW3ZhbGlnbl0sIGRvbTp0aFt3aWR0aF0sIGRvbTpsaVt0eXBlXSwgZG9tOmxpW3ZhbHVlXSwgZG9tOmxpW3R5cGVdLCBkb206dWxbdHlwZV0sIGRvbTp1bFtjb21wYWN0XSwgZG9tOnByZVt3aWR0aF0sIGRvbTptZXRhW2h0dHAtZXF1aXZdLCBkb206YVtjaGFyc2V0XSwgZG9tOmFbY29vcmRzXSwgZG9tOmFbc2hhcGVdLCBkb206YVtyZXZdLCBkb206YVtzY2hlbWVdLCBkb206bGlua1tyZXZdLCBkb206bGlua1tjaGFyc2V0XSwgZG9tOmxpbmtbdGFyZ2V0XSwgZG9tOmltZ1tuYW1lXSwgZG9tOmltZ1tsb25nZGVzY10sIGRvbTppbWdbYWxpZ25dLCBkb206aW1nW2hzcGFjZV0sIGRvbTppbWdbdnNwYWNlXSwgZG9tOmltZ1tib3JkZXJdLCBkb206YXJlYVtub2hyZWZdLCBkb206aGVhZFtwcm9maWxlXSwgZG9tOmh0bWxbdmVyc2lvbl0sIGRvbTppZnJhbWVbbG9uZ2Rlc2NdLCBkb206aWZyYW1lW2FsaWduXSwgZG9tOmlmcmFtZVtmcmFtZWJvcmRlcl0sIGRvbTppZnJhbWVbbWFyZ2luaGVpZ2h0XSwgZG9tOmlmcmFtZVttYXJnaW53aWR0aF0sIGRvbTppZnJhbWVbc2Nyb2xsaW5nXSwgZG9tOm9iamVjdFthcmNoaXZlXSwgZG9tOm9iamVjdFtjb2RlXSwgZG9tOm9iamVjdFtjb2RlYmFzZV0sIGRvbTpvYmplY3RbY29kZXR5cGVdLCBkb206b2JqZWN0W2RlY2xhcmVdLCBkb206b2JqZWN0W3N0YW5kYnldLCBkb206b2JqZWN0W2FsaWduXSwgZG9tOm9iamVjdFtoc3BhY2VdLCBkb206b2JqZWN0W3ZzcGFjZV0sIGRvbTpvYmplY3RbYm9yZGVyXSwgZG9tOnBhcmFtW3R5cGVdLCBkb206cGFyYW1bdmFsdWV0eXBlXSwgZG9tOnNjcmlwdFtsYW5ndWFnZV0sIGRvbTpib2R5W2FsaW5rXSwgZG9tOmJvZHlbYmFja2dyb3VuZF0sIGRvbTpib2R5W2JnY29sb3JdLCBkb206Ym9keVtsaW5rXSwgZG9tOmJvZHlbdGV4dF0sIGRvbTpib2R5W3ZsaW5rXSwgZG9tOmJyW2NsZWFyXSwgZG9tOmNhcHRpb25bYWxpZ25dLCBkb206Y29sW2FsaWduXSwgZG9tOmNvbFtjaGFyXSwgZG9tOmNvbFtjaGFyb2ZmXSwgZG9tOmNvbFt2YWxpZ25dLCBkb206Y29sW3dpZHRoXSwgZG9tOmRpdlthbGlnbl0sIGRvbTpkbFtjb21wYWN0XSwgZG9tOmhyW2FsaWduXSwgZG9tOmhyW25vc2hhZGVdLCBkb206aHJbc2l6ZV0sIGRvbTpoclt3aWR0aF0sIGRvbTpoclthbGlnbl0sIGRvbTpoMlthbGlnbl0sIGRvbTpoM1thbGlnbl0sIGRvbTpoNFthbGlnbl0sIGRvbTpoNVthbGlnbl0sIGRvbTpoNlthbGlnbl0sIGRvbTppbnB1dFthbGlnbl0sIGRvbTppbnB1dFt1c2VtYXBdLCBkb206bGVnZW5kW2FsaWduXSwgZG9tOm1lbnVbY29tcGFjdF0sIGRvbTpvbFtjb21wYWN0XSwgZG9tOm9sW3R5cGVdLCBkb206b2xbdHlwZV0sIGRvbTpwW2FsaWduXSwgZG9tOnRhYmxlW2JnY29sb3JdLCBkb206dGFibGVbY2VsbHBhZGRpbmddLCBkb206dGFibGVbY2VsbHNwYWNpbmddLCBkb206dGFibGVbZnJhbWVdLCBkb206dGFibGVbcnVsZXNdLCBkb206dGFibGVbd2lkdGhdLCBkb206dGFibGVbYWxpZ25dLCBkb206dGJvZHlbYWxpZ25dLCBkb206dGJvZHlbY2hhcl0sIGRvbTp0Ym9keVt2YWxpZ25dLCBkb206dGJvZHlbY2hhcm9mZl0sIGRvbTp0Zm9vdFthbGlnbl0sIGRvbTp0Zm9vdFtjaGFyb2ZmXSwgZG9tOnRmb290W2NoYXJdLCBkb206dGZvb3RbdmFsaWduXSwgZG9tOnRoZWFkW2NoYXJdLCBkb206dGhlYWRbY2hhcm9mZl0sIGRvbTp0aGVhZFt2YWxpZ25dLCBkb206dGhlYWRbYWxpZ25dLCBkb206dHJbYWxpZ25dLCBkb206dHJbYmdjb2xvcl0sIGRvbTp0cltjaGFyXSwgZG9tOnRyW2NoYXJvZmZdLCBkb206dHJbdmFsaWduXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaXMgZGVwcmVjYXRlZCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZmFpbF9hdHRyXCI6IFwiVGhlIEhUTUwgYXR0cmlidXRlKHMpIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbV9hdHRyXCI6IFwiVGhlIEhUTUwgYXR0cmlidXRlKHMpIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgZm9yIHRoZSA8ezF9PiBlbGVtZW50IGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF2b2lkIHVzZSBvZiBvYnNvbGV0ZSBmZWF0dXJlcyBpZiBwb3NzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gSFRNTFVuaXQgYXV0byBhZGRzIGEgdGJvZHlbYWxpZ249bGVmdF0gdG8gdGFibGVzIGlmIHRib2R5IGlzIG1pc3NpbmchXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRib2R5XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWxpZ25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdlYmNvbXBvbmVudCBlbGVtZW50LCBIVE1MIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBkZXByZWNhdGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVFMuaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1cIiwgW25vZGVOYW1lXSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZ2xvYmFsIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBhdHRycyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYXR0clwiLCBbdmlvbGF0aW9uc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBlbGVtZW50ICYgYXR0cmlidXRlXG4gICAgICAgIHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdICYmIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXS5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbV9hdHRyXCIsIFt2aW9sYXRpb25zLCBub2RlTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2lkXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fVW5pcXVlSWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgJ2lkJyBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGhhcyB0aGUgaWQgXFxcInsxfVxcXCIgdGhhdCBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBlbGVtZW50ID09PSBydWxlQ29udGV4dDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGxldCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2xhbmddLCBkb206Klt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjaGFuZ2UgaW4gbGFuZ3VhZ2Ugb2Ygc3BlY2lmaWMgY29udGVudCBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICAvLyBcImI1YzNmOFwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgXCJkZTQ2ZTRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIElmIGl0J3MgdGhlIEhUTUwgbm9kZSwgdGhhdCdzIGhhbmRsZWQgYnkgaHRtbF9sYW5nX3ZhbGlkXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJodG1sXCIpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIGxldCByZXRWYWwgPSByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgICAgIGlmIChyZXRWYWwudmFsdWVbMV0gIT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIGFjdHVhbGx5IGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50IC0gc2tpcCBzdWJ0cmVlcyB0aGF0IGhhdmUgb3RoZXIgbGFuZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGVsZW1lbnQpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIHNlbGVjdG9yTWF0Y2hlc0VsZW0sIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0sIGdldFJvdGF0aW9uRGVncmVlfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG51bGwpO1xuICAgICAgICBpZiAoIW9yaWVudGF0aW9uVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICAvLyBmaW5kIGlmIHRoZSBlbGVtZW50IG1hdGNoZXMgb3JpZW50YXRpb24gc2VsZWN0b3IocylcbiAgICAgICAgbGV0IG1lZGlhX3RyYW5zZm9ybXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XSkuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddKS5sZW5ndGggPiAwICYmIHNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybXMucHVzaChvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddLnRyYW5zZm9ybSk7ICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG5vIG1hdGNoLCB0aGUgZWxlbWVudCBpcyBub3QgaW4gbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtXG4gICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1lZGlhX3RyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhX3RyYW5zZm9ybSA9IG1lZGlhX3RyYW5zZm9ybXNbaV07XG4gICAgICAgICAgICBsZXQgY29udGFpbnNSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgWydyb3RhdGUnLCAncm90YXRlM2QnLCAncm90YXRlWicsICdtYXRyaXgnLCAnbWF0cml4M2QnXS5mb3JFYWNoKHJvdGF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3JtLmluY2x1ZGVzKHJvdGF0aW9uKSkgY29udGFpbnNSb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG5vIHJvdGF0aW9uIHRyYW5zZm9ybSwgc2tpcFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1JvdGF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGRlZ3JlZSA9IGdldFJvdGF0aW9uRGVncmVlKG1lZGlhX3RyYW5zZm9ybSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIG9yIDM2MG4gZGVncmVlIHJvdGF0aW9uIFxuICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgeyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHBhZ2Ugcm90YXRpb24gdHJhbnNmb3JtYXRpb24sIGV4YW1wbGVcbiAgICAgICAgICAgICAqICBodG1sIHsgdHJhbnNmb3JtOiByb3RhdGUoMi41ZGVnKTsgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZSA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBjb21wZW5zYXRlIHRoZSBtZWRpYSBvcmllbnRhdGlvbiB3aXRoIHRoZSBwYWdlIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZV9kZWdyZWUgPSBnZXRSb3RhdGlvbkRlZ3JlZShkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKTtcbiAgICAgICAgICAgICAgICBkZWdyZWUgLT0gcGFnZV9kZWdyZWU7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhbGxvdyAxIGRlZ3JlZSBmbG9hdGluZyByYW5nZSBmb3IgdGhlIHJpZ2h0IGFuZ2xlXG4gICAgICAgICAgICBpZiAoKGRlZ3JlZSA+IDg5ICYmIGRlZ3JlZSA8IDkxKSB8fCAoZGVncmVlID4gLTkxICYmIGRlZ3JlZSA8IC04OSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xvY2tlZFwiLCBbbm9kZU5hbWVdKSk7XG4gICAgICAgICAgICBlbHNlIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldFBpeGVsc0Zyb21TdHlsZSB9IGZyb20gXCIuLi8vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIG51bTogW1wiMi4xLjFcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIm9zc3c5a1wiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJpZnJhbWVcIiwgXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCBpZiBubyB2aXNpYmxlIGNvbnRlbnRcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZSwgaW5hcHBsaWNhYmxlXG4gICAgICAgIGlmICgoc3R5bGVzLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnIHx8IHN0eWxlcy5vdmVyZmxvd1ggPT09ICdoaWRkZW4nKVxuICAgICAgICAgICAgJiYgKHN0eWxlcy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyB8fCBzdHlsZXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIG92ZXJhbGwgc2Nyb2xsYWJsZSBlbGVtZW50IChjbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoIGFuZCBjbGllbnRIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQpIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgocnVsZUNvbnRleHQub2Zmc2V0V2lkdGgsIHJ1bGVDb250ZXh0Lm9mZnNldEhlaWdodCkgPCAzMCB8fCBNYXRoLm1pbihydWxlQ29udGV4dC5vZmZzZXRXaWR0aCwgcnVsZUNvbnRleHQub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBudWxsOyBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCB4IGFuZCB5IHNjcm9sbCBkaXN0YW5jZXMgPCBlbGVtZW50J3MgaG9yaXpvbnRhbC92ZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeCA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0xlZnQsIHJ1bGVDb250ZXh0KSArIGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1JpZ2h0LCBydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeSA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgcnVsZUNvbnRleHQpICsgZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nQm90dG9tLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5zY3JvbGxXaWR0aCAtICBydWxlQ29udGV4dC5jbGllbnRXaWR0aCA8IDEgKyBwYWRkaW5nX3ggXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5zY3JvbGxIZWlnaHQgLSAgcnVsZUNvbnRleHQuY2xpZW50SGVpZ2h0IDwgMSsgcGFkZGluZ195KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBwYXNzIGlmcmFtZSBlbGVtZW50IGhhcyBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIG5vdCBuZWdhdGl2ZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgJiYgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3RhYmJhYmxlXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgY29udGVudCBpcyB0YWJiYWJsZVxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ludGVyYWN0aXZlXCIpO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpbiBGaXJlZm94IGlmIG5vIHRhYmluZGV4IGF0IGFsbCAobm90IHRlc3RlZCBpbiBlbWJlZGRlZCBvciBhbnkgc2ltdWxhdG9yKVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfc2Nyb2xsYWJsZVwiLCBbbm9kZU5hbWVdKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZWZpbmVkU3R5bGVzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDpcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9yb2xlXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaGFzIGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCdzIHJvbGUgJ3swfScgaXMgbm90IGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIFJQVFV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gUlBUVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgZWxlbWVudHMgd2l0aCBDU1Mgb3ZlcmZsb3c6IHNjcm9sbCBvciBhdXRvXG4gICAgICAgIGxldCBzdHlsZXMgPSBnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlc1snb3ZlcmZsb3cteCddID09PSAnc2Nyb2xsJyB8fCBzdHlsZXNbJ292ZXJmbG93LXknXSA9PT0gJ3Njcm9sbCcgXG4gICAgICAgICAgICB8fCBzdHlsZXNbJ292ZXJmbG93LXgnXSA9PT0gJ2F1dG8nIHx8IHN0eWxlc1snb3ZlcmZsb3cteSddID09PSAnYXV0bycpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlnbm9yZSAnYXBwbGljYXRpb24nIHJvbGUgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBkbyBub3QgZm9sbG93IGEgc3RhbmRhcmQgaW50ZXJhY3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkgYSB3aWRnZXQgcm9sZTpodHRwczovL3d3dy53My5vcmcvVFIvMjAyMy9QUi1XQUktQVJJQS0xLjItMjAyMzAzMjgvI2FwcGxpY2F0aW9uIFxuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJhcHBsaWNhdGlvblwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZWxlbWVudHMgd2hvc2Ugcm9sZXMgYWxsb3cgbm8gZGVzY2VuZGFudHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUgb3Igd2l0aCBhIHRhYmluZGV4ID49IDAgXG4gICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiB3aWRnZXRfdGFiYmFibGVfc2luZ2xlIGFuZCBhcmlhX2NoaWxkX3RhYmJhYmxlXG4gICAgICAgIGNvbnN0IHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkID1bXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImltZ1wiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIl07XG5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFyZW50X3JvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwYXJlbnQgYXMgRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgb25lIG9mIHRoZSBwYXJlbnQgcm9sZXMgaXMgaW4gcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcGFyZW50X3JvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQuaW5jbHVkZXMocGFyZW50X3JvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gUm93IGlzIHdlaXJkLiBJdCdzIHN0cnVjdHVyZSwgYnV0IGNhbiBhbHNvIGJlIHdpZGdldFxuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInJvd1wiIHx8IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb2N1c2FibGUgc2VwYXJhdG9ycyBhcmUgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInNlcGFyYXRvclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9yb2xlXCIsIFtyb2xlcy5sZW5ndGggPT09IDAgPyAnbm9uZScgOiByb2xlcy5qb2luKCcsICcpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcywgZ2V0Q29tcHV0ZWRTdHlsZSB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF90YWJiYWJsZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb24gdGhlIHNjcmVlbiB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaXMgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiQ29uZmlybSB0aGUgZWxlbWVudCBzaG91bGQgYmUgdGFiYmFibGUsIGFuZCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBoYXMga2V5Ym9hcmQgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZGVmaW5lZCBzdHlsZXMgb25seSBnaXZlIHRoZSBzdHlsZXMgdGhhdCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMCBcbiAgICAgICAgICAgIHx8IChkZWZpbmVkX3N0eWxlc1sncG9zaXRpb24nXT09PSdhYnNvbHV0ZScgJiYgZGVmaW5lZF9zdHlsZXNbJ2NsaXAnXSAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddLnJlcGxhY2VBbGwoJyAnLCAnJyk9PT0ncmVjdCgwcHgsMHB4LDBweCwwcHgpJ1xuICAgICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcblxuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA+PSAwICYmIGJvdW5kc1snbGVmdCddID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVmYXVsdF9zdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b3AgPSBib3VuZHNbJ3RvcCddO1xuICAgICAgICBsZXQgbGVmdCA9IGJvdW5kc1snbGVmdCddOyAgICAgXG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganMgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHsgICBcbiAgICAgICAgICAgIC8vIHdpdGggb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ107XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWyd0b3AnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBvbmZvY3VzX3N0eWxlc1sndG9wJ10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgcGFyZW50J3MgcG9zaXRpb24gaXMgJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ2xlZnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb25mb2N1c19zdHlsZXNbJ2xlZnQnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbWJlZF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtYmVkX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VtYmVkX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgPGVtYmVkPiBlbGVtZW50IGhhcyBhbHRlcm5hdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IGZvciA8ZW1iZWQ+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZW1iZWRfbm9lbWJlZF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VtYmVkX0hhc05vRW1iZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX25vZW1iZWRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9ub2VtYmVkX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIDxlbWJlZD4gZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1lbWJlZGRlZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGVtYmVkPiBlbGVtZW50cyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24tZW1iZWRkZWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibm9lbWJlZFwiKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibm9lbWJlZFwiKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbW90aWNvbnNfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlbW90aWNvbnNfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UZXh0X0Vtb3RpY29uc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBlbW90aWNvbnMgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbW90aWNvbnMgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGVpciBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVjaXNpb24gaW4gcGxhbm5pbmcgOS83LzIzIHRoYXQgdGhpcyBydWxlIGNhdXNlcyBtb3JlIHJldmlld3MgdGhhdCB3ZSBzZWUgYWN0dWFsIHByb2JsZW1zIGluIGNvbnRlbnQsIHNvIHR1cm4gdGhlc2UgcnVsZXMgb2ZmXG4gICAgXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGVtb3RpY29uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCI6LSlcIiwgXCI6KVwiLCBcIjpvKVwiLCBcIjpdXCIsIFwiOjNcIiwgXCI6YylcIiwgXCI6PlwiLCBcIj1dXCIsIFwiOClcIiwgXCI9KVwiLCBcIjpEXCIsIFwiQzpcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LURcIiwgXCI6RFwiLCBcIjhEXCIsIFwiWERcIiwgXCI9RFwiLCBcIj0zXCIsIFwiPD0zXCIsIFwiPD04XCIsIFwiLS0hLS1cIiwgXCI6LShcIiwgXCI6KFwiLCBcIjpjXCIsIFwiOjxcIiwgXCI6W1wiLFxuICAgICAgICAgICAgICAgICAgICBcIkQ6XCIsIFwiRDhcIiwgXCJEO1wiLCBcIkQ9XCIsIFwiRFhcIiwgXCJ2LnZcIiwgXCI6LTlcIiwgXCI7LSlcIiwgXCI7KVwiLCBcIiopXCIsIFwiO11cIiwgXCI7RFwiLCBcIjotUFwiLCBcIjpQXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiOi1wXCIsIFwiOnBcIiwgXCI9cFwiLCBcIjotw55cIiwgXCI6w55cIiwgXCI6LWJcIiwgXCI6YlwiLCBcIjotT1wiLCBcIjpPXCIsIFwiT19PXCIsIFwib19vXCIsIFwiOE9cIiwgXCJPd09cIiwgXCJPLU9cIixcbiAgICAgICAgICAgICAgICAgICAgXCIwX29cIiwgXCJPX29cIiwgXCJPM09cIiwgXCJvMG/CoDtvX287XCIsIFwiby4uLm9cIiwgXCIwdzBcIiwgXCI6LS9cIiwgXCI6L1wiLCBcIjpcXFxcXCIsIFwiPS9cIiwgXCI9XFxcXFwiLCBcIjpTXCIsIFwiOnxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkOi0pXCIsIFwicUItKVwiLCBcIjopflwiLCBcIjotKT4uLi4uXCIsIFwiOi1YXCIsIFwiOlhcIiwgXCI6LSNcIiwgXCI6I1wiLCBcIk86LSlcIiwgXCIwOjNcIiwgXCJPOilcIiwgXCI6JyhcIiwgXCI7KihcIixcbiAgICAgICAgICAgICAgICAgICAgXCJUX1RcIiwgXCJUVF9UVFwiLCBcIlQuVFwiLCBcIjotKlwiLCBcIjoqXCIsIFwiXm8pXCIsIFwiPjopXCIsIFwiPjspXCIsIFwiPjotKVwiLCBcIkIpXCIsIFwiQi0pXCIsIFwiOClcIiwgXCI4LSlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJePi4+XlwiLCBcIl48LjxeXCIsIFwiXj5fPl5cIiwgXCJePF88XlwiLCBcIkQ6PFwiLCBcIj46KFwiLCBcIkQtOjxcIiwgXCI+Oi0oXCIsIFwiOi1AWzFdXCIsIFwiOyhcIiwgXCJgX8K0XCIsIFwiRDxcIixcbiAgICAgICAgICAgICAgICAgICAgXCI8M1wiLCBcIjwzMzNcIiwgXCI9Xl9ePVwiLCBcIj0+Lj49XCIsIFwiPTxfPD1cIiwgXCI9Pi48PVwiLCBcIlxcXFwsLC9cIiwgXCJcXFxcbS9cIiwgXCJcXFxcbS9cXFxcPi48L1xcXFxtL1wiLCBcIlxcXFxvL1wiLCBcIlxcXFxvIG8vXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiby9cXFxcb1wiLCBcIjomXCIsIFwiOnVcIlxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGVtb3RpY29ucyA9IHZhbGlkYXRlUGFyYW1zLmVtb3RpY29ucy52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0ZXN0VGV4dCA9IFwiXCI7XG5cbiAgICAgICAgbGV0IHdhbGtOb2RlOiBOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2huZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgdGVzdFRleHQgKz0gXCIgXCIgKyB3YWxrTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlc3RUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgcGFzc2VkICYmIGogPCBlbW90aWNvbnMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZW1vdElkeCA9IHRlc3RUZXh0LmluZGV4T2YoZW1vdGljb25zW2pdKTtcbiAgICAgICAgICAgICAgICBsZXQgZUxuZ3RoID0gZW1vdGljb25zW2pdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIGVtb3RJZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2VzIGlmOiB0aGUgZW1vdGljb24gaXMgbm90IHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBlbW90aWNvbiBpcyBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSB1bmxlc3MgaXQncyBwdW5jdHVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXQncyBpbiBhIHByZSwgY29kZSwgb3Igc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA+IDAgJiYgIS9cXHMvLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggLSAxLCBlbW90SWR4KSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZW1vdElkeCA8IHRlc3RUZXh0Lmxlbmd0aCAtIGVMbmd0aCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCArIGVMbmd0aCwgZW1vdElkeCArIGVMbmd0aCArIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvWy4sISdcIj9dLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyB1c2FnZSBvZiAoOiBzdHVmZiA6KSBzaW5jZSB0aGlzIGlzIGEgY29tbWVudCBpbiBzb21lIGxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI6KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig6XCIpICYmIC9cXChcXDouKlxcOlxcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChlbW90aWNvbnNbal0gPT0gXCI7KVwiIHx8IGVtb3RpY29uc1tqXSA9PSBcIig7XCIpICYmIC9cXChcXDsuKlxcO1xcKS8udGVzdCh0ZXN0VGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0sIGVtb3RJZHggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHQsIHByZSwgY29kZVxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwiYm9keVwiXSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZXJyb3JfbWVzc2FnZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtaW52YWxpZD10cnVlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0Vycm9yTWVzc2FnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaGFzIGludmFsaWQgcmVmZXJlbmNlICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiQ3VzdG9tIGVycm9yIG1lc3NhZ2UgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGN1c3RvbSBlcnJvciBtZXNzYWdlIG11c3QgcmVmZXJlbmNlIGEgdmFsaWQgJ2lkJyB2YWx1ZSBhbmQgd2hlbiB0cmlnZ2VyZWQgdGhlIG1lc3NhZ2UgbXVzdCBiZSBhcHByb3ByaWF0ZWx5IGV4cG9zZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhcmlhX2Vyck1zZ0lkID0gUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGZpZWxkc2V0X2xhYmVsX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyb3VwXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJncm91cF93aXRoSW5wdXRzX2hhc05hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIkdyb3VwL0ZpZWxkc2V0IFxcXCJ7MH1cXFwiIHdpdGggYW4gaW5wdXQgaGFzIGEgdW5pcXVlIG5hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiR3JvdXAvRmllbGRzZXQgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgaGFzIGEgZHVwbGljYXRlIG5hbWUgdG8gYW5vdGhlciBncm91cFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyB3aXRoIG5lc3RlZCBpbnB1dHMgbXVzdCBoYXZlIHVuaXF1ZSBhY2Nlc3NpYmxlIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIiwgXCIzLjMuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5jb21wdXRlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cyA9IGdyb3Vwc1dpdGhJbnB1dHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM7XG5cbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixmb3JtQ2FjaGUpOyAgICBcbiAgICAgICAgfVxuICAgICAgICAvLyBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0czogXCIgK2VsZW1lbnQuaWQpXG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM6IFwiICtmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM6IFwiICtmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aClcblxuICAgICAgICBsZXQgcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNvbXB1dGVkTmFtZSA9IFwiXCI7XG4gICAgICAgIGlmICghZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGFueSBncm91cHMgd2l0aCBpbnB1dHMuIFRoZXJlZm9yZSB3ZSBzaG91bGQgc2tpcCB0aGlzIHJ1bGUgdHJpZ2dlci5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBvdXIgcnVsZUNvbnRleHQgaW4gdGhlIGNhY2hlXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBudWxsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kU2FtZU5hbWVGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBqIDwgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wYXJlIGFnYWluc3Qgb3Vyc2VsZnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFNhbWVOYW1lRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kU2FtZU5hbWVGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmFpbF8yXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcHV0ZWROYW1lID0gZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm51bGwgcmV0dXJuXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBhc3NfMVwiKVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzFcIiwgW2NvbXB1dGVkTmFtZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZmllbGRzZXRfbGVnZW5kX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZpZWxkc2V0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRmllbGRzZXRfSGFzTGVnZW5kXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxmaWVsZHNldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lIDxsZWdlbmQ+XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIjxmaWVsZHNldD4gZWxlbWVudCA8bGVnZW5kPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiA8ZmllbGRzZXQ+IGVsZW1lbnRzIHNob3VsZCBoYXZlIGEgc2luZ2xlLCBub24tZW1wdHkgPGxlZ2VuZD4gYXMgYSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sICAvL2h0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIyL1RlY2huaXF1ZXMvaHRtbC9INzFcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIGEgbGVnZW5kIGlzIGhpZGRlbiwgd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb25zIGZvciB0aGlzXG4gICAgICAgIGxldCBsZWdlbmRzID0gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcImxlZ2VuZFwiLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIGlmIChsZWdlbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIE5PIExlZ2VuZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIG1vcmUgdGhhbiBvbmUgbGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5nZXRJbm5lclRleHQobGVnZW5kc1swXSkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRmllbGRzZXQgaGFzIGxlZ2VuZCBidXQgbGVnZW5kIGlzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZmlndXJlX2xhYmVsX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmaWd1cmVfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206ZmlndXJlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0ZpZ3VyZV9sYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDxmaWd1cmU+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8ZmlndXJlPiBlbGVtZW50IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLiB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIHRoZSBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cyBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpmb3JtW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaW50ZXJhY3Rpbmcgd2l0aCBjb250ZW50IHdpbGwgbm90IG9wZW4gcG9wLXVwIHdpbmRvd3Mgb3IgY2hhbmdlIHRoZSBhY3RpdmUgd2luZG93IHdpdGhvdXQgaW5mb3JtaW5nIHRoZSB1c2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlciBzaG91bGQgYmUgaW5mb3JtZWQgaW4gYWR2YW5jZSB3aGVuIGludGVyYWN0aW5nIHdpdGggY29udGVudCBjYXVzZXMgYSBjaGFuZ2Ugb2YgY29udGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PT0gXCJfcGFyZW50XCIgfHwgdFN0ciA9PT0gXCJfc2VsZlwiIHx8IHRTdHIgPT09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsIHRTdHIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBOYW1lIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZnJhbWVzZXQg4oCTIG11c3QgaGF2ZSBwb3RlbnRpYWwgdG8gY3JlYXRlIG5ldyB3aW5kb3c/XG4gICAgICAgICAgICAvLyBTZWUgaWYgYSBuZXcgd2luZG93IGlzIG1lbnRpb25lZFxuICAgICAgICAgICAgbGV0IHRleHRTdHIgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikpXG4gICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBmb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJmb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MYWJlbF9VbmlxdWVGb3JcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBoYXMgbW9yZSB0aGFuIG9uZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvcm0gY29udHJvbHMgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBsZXQgbGFiZWxJZHMgPSBnZXRDYWNoZShGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCksIFwiUlBUX0xhYmVsX1NpbmdsZVwiLCB7fSlcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIShpZCBpbiBsYWJlbElkcyk7XG4gICAgICAgIGxhYmVsSWRzW2lkXSA9IHRydWU7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFudy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZm9ybV9zdWJtaXRfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fc3VibWl0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFtvbmNoYW5nZV0sIGRvbTppbnB1dFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb3JtX0NoYW5nZUVtcHR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNvbmZpcm0gdGhlIGZvcm0gZG9lcyBub3Qgc3VibWl0IGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBmb3JtIHNob3VsZCBub3QgYmUgc3VibWl0dGVkIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBmcmFtZV9zcmNfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZnJhbWVfc3JjX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZnJhbWUsIGRvbTppZnJhbWVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfRnJhbWVfU3JjSHRtbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IDxmcmFtZT4gY29udGVudCBpcyBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8ZnJhbWU+IGNvbnRhaW5pbmcgbm9uLUhUTUwgY29udGVudCBtdXN0IGJlIG1hZGUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzcmNcIikgJiZcbiAgICAgICAgICAgIFJQVFV0aWwuaXNIdG1sRXh0KFJQVFV0aWwuZ2V0RmlsZUV4dChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIikpKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZnJhbWVfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRnJhbWVfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmcmFtZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIklubGluZSBmcmFtZXMgbXVzdCBoYXZlIGEgdW5pcXVlLCBub24tZW1wdHkgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW5saW5lIGZyYW1lIGRvZXMgbm90IGhhdmUgYSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCAvKkNoYW5nZSBtYXBwaW5nIHRvIDQuMS4yIGZyb20gMi40LjEgdHlwbz8gKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFwiY2FlNzYwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLiB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIHRoZSBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cyBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaGVhZGluZ19jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkhlYWRpbmcgZWxlbWVudCBoYXMgZGVzY3JpcHRpdmUgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIG5vIGRlc2NyaXB0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIGVsZW1lbnRzIG11c3QgcHJvdmlkZSBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuNlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGhlYWRpbmdfbWFya3VwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJoZWFkaW5nX21hcmt1cF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpoMSwgZG9tOmgyLCBkb206aDMsIGRvbTpoNCwgZG9tOmg1LCBkb206aDZcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImhlYWRpbmdfY29udGVudF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSGVhZGVyc19GZXdXb3Jkc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgaGVhZGluZyBlbGVtZW50IGlzIGEgZ2VudWluZSBoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IG5vdCBiZSB1c2VkIGZvciBwcmVzZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgaGVhZGluZ0xlbmd0aFRocmVzaDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBoZWFkaW5nTGVuZ3RoVGhyZXNoID0gdmFsaWRhdGVQYXJhbXMuaGVhZGluZ0xlbmd0aFRocmVzaC52YWx1ZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwud29yZENvdW50KFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSkgPD0gaGVhZGluZ0xlbmd0aFRocmVzaDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuXG5leHBvcnQgbGV0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuICAgIFxuZXhwb3J0IGxldCBodG1sX3NraXBuYXZfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImh0bWxfc2tpcG5hdl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSHRtbF9Ta2lwTmF2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBodG1sX3NraXBuYXZfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlcmUgaXMgYSB3YXkgdG8gYnlwYXNzIGJsb2NrcyBvZiBjb250ZW50IHRoYXQgYXJlIHJlcGVhdGVkIG9uIG11bHRpcGxlIFdlYiBwYWdlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZyYW1lcyA9IFJQVFV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJmcmFtZVwiKTtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiaDFcIik7XG5cbiAgICAgICAgaWYgKChmcmFtZXMgIT0gbnVsbCAmJiBmcmFtZXMubGVuZ3RoID4gMCkgfHwgKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAvLyBJZiBmcmFtZXMgb3IgaGVhZGluZ3MgYXJlIHVzZWQsIHBhc3NcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBza2lwIGFuY2hvcnNcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgIXBhc3NlZCAmJiBpZHggPCBhbmNob3JzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSBhbmNob3JzW2lkeF0uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBocmVmICE9PSB0eXBlb2YgXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuYmFzZVZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBocmVmLmJhc2VWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0bXBMb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVApICE9IFwidW5kZWZpbmVkXCIgJiYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVAgIT0gbnVsbCkgeyAvLyBEQVAgc2V0cyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wTG9jYXRpb24gPSAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCBhcyBhbnkpLmxvY2F0aW9uRnJvbURBUDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyIHNjYW4gaGFzIHRoZSBsb2NhdGlvbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jSHJlZiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jSHJlZiA9IHRtcExvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRml4IHdlaXJkIGJ1Z3Mgd2l0aCBob3cgdmFyaW91cyBwYXJzZXJzIHJlcG9ydCBvbiBmaWxlOiB1cmwnczpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBocmVmID0gXCJmaWxlOi9cIiArIGhyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jSHJlZi5zdGFydHNXaXRoKFwiZmlsZTovLy9cIikpIGRvY0hyZWYgPSBcImZpbGU6L1wiICsgZG9jSHJlZi5zdWJzdHJpbmcoXCJmaWxlOi8vL1wiLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWYuY2hhckF0KDApID09IFwiI1wiIHx8IGhyZWYuc3RhcnRzV2l0aChkb2NIcmVmICsgXCIjXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKGhyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCB0YXJnZXQpICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RhcmdldF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNob3JzW2lkeF0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZm9yd2FyZCBqdW1waW5nIHRhcmdldHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBhbmNob3JzW2lkeF0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZihcIiNcIikgIT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gUlBUVXRpbC5nZXRGaWxlQW5jaG9yKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBuYW1lIGluIHRhcmdldHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppZnJhbWVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBzaG91bGQgbm90IGJlIGV4Y2x1ZGVkIGZyb20gdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgaWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBub3QgZXhjbHVkZWQgZnJvbSB0aGUgdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSA8aWZyYW1lPiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgaXMgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiYWtuN2JuXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGlmcmFtZSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAzMCB8fCBNYXRoLm1pbihib3VuZHNbJ2hlaWdodCddLCBib3VuZHNbJ3dpZHRoJ10pIDwgMTUpICBcbiAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuXG4gICAgICAgIC8vIHBhc3MgaWZyYW1lIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmcmFtZSBjb250ZW50XG4gICAgICAgIGNvbnN0IGlmcmFtRWxlbSA9IHJ1bGVDb250ZXh0IGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICBpZiAoIWlmcmFtRWxlbSB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudCB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYSBBUklBIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBzaG91bGQgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNTk3OTZmXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvZmFpbHVyZXMvRjY1XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgIT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19hbHRfYmFja2dyb3VuZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2JhY2tncm91bmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0JhY2tncm91bmRJbWdfSGFzVGV4dE9yVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGltcG9ydGFudCBiYWNrZ3JvdW5kIGltYWdlIGluZm9ybWF0aW9uIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgaW4gc3lzdGVtIGhpZ2ggY29udHJhc3QgbW9kZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJhY2tncm91bmQgaW1hZ2VzIHRoYXQgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvbiBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgc3R5bGUgPSBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhY2tncm91bmRJbWdzID0gc3R5bGUuYmFja2dyb3VuZEltYWdlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoYmFja2dyb3VuZEltZ3MgIT0gbnVsbCAmJiBiYWNrZ3JvdW5kSW1ncyAhPSBcIlwiICYmIGJhY2tncm91bmRJbWdzICE9ICdub25lJyAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pbm5lckhUTUwgIT0gbnVsbCAmJiBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggIT0gMClcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWcsIGRvbTphcmVhLCBkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfQWx0Q29tbW9uTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIG5hbWUgc2VydmVzIGFzIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBiYWRUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInNob3J0IGRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vIEFsdCB0ZXh0IGNoZWNrIGFyZSBlbHNld2hlcmUgKFNlZSA0MSwgMjQwLCA0NTUpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFkVGV4dCA9IHZhbGlkYXRlUGFyYW1zLmJhZFRleHQudmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmFkVGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBhbHRUZXh0LmluZGV4T2YoYmFkVGV4dFtpXSkgPT0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNyYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgobm9kZU5hbWUgPT0gXCJhcmVhXCIpID8gXCJocmVmXCIgOiBcInNyY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgaXQgdG8gcGFzcyBpZiB0aGVyZSdzIG5vIHNyYyAtIGNhbid0IGRldGVybWluZSB0aGVzZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHRoZSBhbHQgbWF0Y2hlcyB0aGUgc3JjIGV4YWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gZmFpbCBpZiB0aGUgYWx0IGhhcyBhIC4gaW4gaXQgYW5kIGVpdGhlciB0aGUgc3JjIGlzIGluIHRoZSBhbHQgb3IgdGhlIGFsdCBpcyBpbiB0aGUgc3JjXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBzcmMudHJpbSgpICE9IGFsdFRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWx0VGV4dC5pbmRleE9mKFwiLlwiKSA9PSAtMSB8fCAoYWx0VGV4dC5pbmRleE9mKHNyYykgPT0gLTEgJiYgc3JjLmluZGV4T2YoYWx0VGV4dCkgPT0gLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X251bGw6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9udWxsXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfVGl0bGVFbXB0eVdoZW5BbHROdWxsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgdGhlICd0aXRsZScgYXR0cmlidXRlIG11c3QgYWxzbyBiZSBlbXB0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGEgdGl0bGUsIGJ1dCBhbHQgaXMgZW1wdHlcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBOb2RlV2Fsa2VyKGFOb2RlKTtcbiAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsay5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBub2RlIGFuZCBub2RlTmFtZVxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gd2Fsay5ub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJhXCIgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IGJlZm9yZSBpbWFnZSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGsgPSBuZXcgTm9kZVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkltYWdlcyBoYXMgcmVxdWlyZWQgJ2FsdCcgYXR0cmlidXRlLCBBUklBIGxhYmVsIG9yIHRpdGxlIGlmIHRoZXkgY29udmV5IG1lYW5pbmcsIG9yICdhbHQ9XFxcIlxcXCIgaWYgZGVjb3JhdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFsdCBhdHR0cmlidXRlIG5vciBhbiBBUklBIGxhYmVsIG9yIHRpdGxlXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiBhbHQgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwgYW5kICd0aXRsZScgYXR0cmlidXRlIHZhbHVlIGNvbnNpc3RzIG9ubHkgb2YgYmxhbmsgc3BhY2UocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgcmVxdWlyZSBhbiAnYWx0JyBhdHRyaWJ1dGUgd2l0aCBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgaWYgdGhleSBjb252ZXkgbWVhbmluZywgb3IgJ2FsdD1cXFwiXFxcIiBpZiBkZWNvcmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjIzYTJhOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIG5vdCB2aXNpYmxlIHRvIHRoZSBzY3JlZW4gcmVhZGVyLCBpZ25vcmVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy9wYXNzIGlmIGltYWdlcyB3aXRoIGEgdmFsaWQgJ2FsdCcgICAgXG4gICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGlmIChhbHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAvLyBhbHQudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFsdC5sZW5ndGggPT09IDAsIHByZXNlbnRhdGlvbmFsIGltYWdlLCB0aXRsZSBpcyBvcHRpb25hbCwgaGFuZGxlZCBieSBvdGhlciBydWxlKHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAgUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGFsdFxuICAgICAgICAgICAgbGV0IGxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVpdGhlciBhbHQgbm9yIGFyaWEgbGFiZWwgb3IgdGl0bGUgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpOyBcbiAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGltZ19pc21hcF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2lzbWFwX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tpc21hcF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfVXNlbWFwVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2lzbWFwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgbXVzdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInVzZW1hcFwiKSkge1xuICAgICAgICAgICAgbGV0IHVzZW1hcCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInVzZW1hcFwiKTtcbiAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCBpZHggPSB1c2VtYXAuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICBpZiAoaWR4ICE9IC0xKVxuICAgICAgICAgICAgICAgIHVzZW1hcCA9IHVzZW1hcC5zdWJzdHIoaWR4ICsgMSk7XG5cbiAgICAgICAgICAgIGlmICh1c2VtYXAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXBzID0gUlBUVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcIm1hcFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgbWFwcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBtYXBzW2ldLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHNbaV0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpID09IHVzZW1hcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBSUFRVdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VtYmVkX25vZW1iZWRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfYXJpYV9kZXNjZW5kYW50c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX2VtcHR5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fbmVzdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2hlYWRlcnNfcmVsYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zY29wZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfYXR0cmlidXRlX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCIsIFwib25lLXRpbWUtY29kZVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX211bHRpbGluZVwiOiBbXCJzdHJlZXQtYWRkcmVzc1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoXCI6IFtcImNjLWV4cFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWNcIjogW1wiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZVwiOiBbXCJiZGF5XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsXCI6IFtcInVybFwiLCBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsXCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbEdyb3VwMlwiOiBbXCJob21lXCIsXG4gICAgICAgICAgICAgICAgXCJ3b3JrXCIsXG4gICAgICAgICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICAgICAgICBcImZheFwiLFxuICAgICAgICAgICAgICAgIFwicGFnZXJcIl0sXG5cbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbFwiOiBbXCJ0ZWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbFwiOiBbXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybFwiOiBbXCJpbXBwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGV4dFwiOiBbXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbFwiOiBbXCJ0ZWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgIFwiaW1wcFwiXVxuICAgICAgICB9XG4gICAgICAgIGxldCB2YWxpZF92YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNhY2hlKVxuICAgICAgICAgICAgdmFsaWRfdmFsdWVzPXZhbGlkX3ZhbHVlcy5jb25jYXQoY2FjaGVba2V5XSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZm91bmRNYW5kYXRvcnlUb2tlbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRSZWNvZ25pemVkVG9rZW4gPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcblxuICAgICAgICBsZXQgYXV0b2NvbXBsZXRlQXR0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgdG9rZW5zID0gYXV0b2NvbXBsZXRlQXR0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCB8fCBhdXRvY29tcGxldGVBdHRyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghdG9rZW5zLmV2ZXJ5KHIgPT4gdmFsaWRfdmFsdWVzLmluY2x1ZGVzKHIpIHx8IHIuc3RhcnRzV2l0aChjYWNoZVsndG9rZW5PcHRpb25hbFNlY3Rpb24nXSkpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCIpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gW107XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgfHwgbm9kZU5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgdGhlIHZhcmlvdXMgJ2lucHV0JyB0eXBlc1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIGNhc2UgXCJoaWRkZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0IGFsbCB0b2tlbnNcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlYXJjaFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dC5jb25jYXQoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3Bhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicGFzc3dvcmRcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3Bhc3N3b3JkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmw7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZWxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpYztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1vbnRoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHR5cGUgZm9yIHRoaXMgcnVsZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZS5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzYWJsZSBjaGVjayBmb3IgaW5wdXQgdHlwZT1oaWRkZW4gZm9yIG5vdyBiYXNlZCBvbiBzY3J1bSBkaXNjdXNzaW9uXG4gICAgICAgIGxldCBhdXRvZmlsbE1hbnRsZSA9IC8qIChub2RlTmFtZT09PVwiaW5wdXRcIiAmJiB0eXBlPT09XCJoaWRkZW5cIikgPyBcImFuY2hvclwiIDogKi8gXCJleHBlY3RhdGlvblwiO1xuXG4gICAgICAgIGlmIChhdXRvZmlsbE1hbnRsZSA9PT0gXCJleHBlY3RhdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBvbnxvZmYgZm9yIGV4cGVjdGF0aW9uIG1hbnRsZS5cbiAgICAgICAgICAgIGlmICh0b2tlbnMuaW5jbHVkZXMoXCJvblwiKSB8fCB0b2tlbnMuaW5jbHVkZXMoXCJvZmZcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBvbnxvZmYgc2hvdWxkIGJlIHRoZSBvbmx5IHRva2VuXG4gICAgICAgICAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbCgyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHBhc3MgaWYgd2UgaGF2ZSBzZWVuIGVpdGhlciBvZiB0aGUgbWFuZGF0b3J5IGdyb3VwcyBhbmQgYWxsIHRva2VucyBoYXZlIGJlZW4gY29uc3VtZWRcbiAgICAgICAgaWYgKGZvdW5kTWFuZGF0b3J5VG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyckluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZm91bmRSZWNvZ25pemVkVG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9SYWRpb0Noa0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX0xvbmVOb2dyb3VwXCI6IFwiUGFzc19Mb25lTm9ncm91cFwiLFxuICAgICAgICAgICAgXCJQYXNzX0dyb3VwZWRcIjogXCJQYXNzX0dyb3VwZWRcIixcbiAgICAgICAgICAgIFwiUGFzc19SYWRpb05vTmFtZVwiOiBcIlBhc3NfUmFkaW9Ob05hbWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9Db250cm9sTmFtZU1pc21hdGNoXCI6IFwiRmFpbF9Db250cm9sTmFtZU1pc21hdGNoXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyR3JvdXBlZFwiOiBcIkZhaWxfTm90R3JvdXBlZE90aGVyR3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIjogXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RTYW1lR3JvdXBcIjogXCJGYWlsX05vdFNhbWVHcm91cFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCI6IFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJSZWxhdGVkIHNldHMgb2YgcmFkaW8gYnV0dG9ucyBvciBjaGVja2JveGVzIHNob3VsZCBiZSBwcm9ncmFtbWF0aWNhbGx5IGdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcInswfSBncm91cGluZyBub3QgcmVxdWlyZWQgZm9yIGEgY29udHJvbCBvZiB0aGlzIHR5cGVcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwiezB9IGlucHV0IGlzIGdyb3VwZWQgd2l0aCBvdGhlciByZWxhdGVkIGNvbnRyb2xzIHdpdGggdGhlIHNhbWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwiUmFkaW8gaW5wdXQgaXMgbm90IGdyb3VwZWQsIGJ1dCBwYXNzZXMgYmVjYXVzZSBpdCBoYXMgbm8gbmFtZSB0byBncm91cCB3aXRoIG90aGVyIHJhZGlvIGlucHV0c1wiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJ7MH0gaW5wdXQgZm91bmQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSwgXFxcInsyfVxcXCIgYXMgYSB7MX0gaW5wdXRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiezB9IGlucHV0IGlzIG5vdCBpbiB0aGUgZ3JvdXAgd2l0aCBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcInswfSBpbnB1dCBhbmQgb3RoZXJzIHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCIgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiezB9IGlucHV0IGlzIGluIGEgZGlmZmVyZW50IGdyb3VwIHRoYW4gYW5vdGhlciB7MH0gd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfTG9uZUNoZWNrYm94XCI6IFwiVmVyaWZ5IHRoYXQgdGhpcyB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfVW5uYW1lZENoZWNrYm94XCI6IFwiVmVyaWZ5IHRoYXQgdGhpcyB1bi1uYW1lZCwgdW5ncm91cGVkIGNoZWNrYm94IGlucHV0IGlzIG5vdCByZWxhdGVkIHRvIG90aGVyIGNoZWNrYm94ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChjb250ZXh0W1wiYXJpYVwiXS5yb2xlID09PSAnbm9uZScgfHwgY29udGV4dFtcImFyaWFcIl0ucm9sZSA9PT0gJ3ByZXNlbnRhdGlvbicpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGdldEdyb3VwID0gKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBSUFRVdGlsLmdldEFuY2VzdG9yKGUsIFwiZmllbGRzZXRcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJyYWRpb2dyb3VwXCIpXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncmlkXCIpXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0VmFsICYmICFSUFRVdGlsLmlzRGF0YVRhYmxlKHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIGFyZSBpbiBzY29wZVxuICAgICAgICBsZXQgY3R4VHlwZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgaWYgKGN0eFR5cGUgIT09IFwiY2hlY2tib3hcIiAmJiBjdHhUeXBlICE9PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGZvcm0gd2UncmUgaW4gKGlmIGFueSkgdG8gZGV0ZXJtaW5lIG91ciBzY29wZVxuICAgICAgICBsZXQgY3R4Rm9ybSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IGdldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94QnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICByYWRpb3NCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIG5hbWVUb0dyb3VwOiB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bUNoZWNrYm94ZXM6IDAsXG4gICAgICAgICAgICAgICAgbnVtUmFkaW9zOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBjaGVja2JveGVzIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gQW5kIGdldCBhIG1hcHBpbmcgb2YgdGhlc2UgY2hlY2tib3hlcyB0b1xuICAgICAgICAgICAgbGV0IGNXYWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGN0eEZvcm0sIGZhbHNlLCBjdHhGb3JtKTtcbiAgICAgICAgICAgIGxldCBjaGVja2JveFEgPSBbXTtcbiAgICAgICAgICAgIGxldCByYWRpb3NRID0gW107XG4gICAgICAgICAgICB3aGlsZSAoY1dhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjV2Fsa2VyLmJFbmRUYWdcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNXYWxrZXIubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoY1dhbGtlci5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94US5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxldCBjaGVja2JveFEgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPWNoZWNrYm94XVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrYm94US5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBjaGVja2JveFFbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShjYiwgXCJmb3JtXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihjYikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGNiLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChjYik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChjYik7XG4gICAgICAgICAgICAgICAgICAgICsrZm9ybUNhY2hlLm51bUNoZWNrYm94ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgcmFkaW9zIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gbGV0IHJhZGlvc1EgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPXJhZGlvXVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHJhZGlvc1EubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSByYWRpb3NRW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmFkQ3R4ID0gKFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIGZvcm1DYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vIENhbGN1bGF0ZWQgZXZlcnl0aGluZywgbm93IGNoZWNrIHRoZSB2YXJpb3VzIGNhc2VzXG5cbiAgICAgICAgY29uc3QgY3R4TmFtZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgIGNvbnN0IGN0eEdyb3VwID0gZ2V0R3JvdXAocnVsZUNvbnRleHQpO1xuICAgICAgICBjdHhUeXBlID0gY3R4VHlwZSA9PT0gXCJyYWRpb1wiID8gXCJSYWRpb1wiIDogXCJDaGVja2JveFwiO1xuXG4gICAgICAgIGlmICghY3R4TmFtZSB8fCBjdHhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwcm9jZXNzIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGlzIG5vdCBuYW1lZFxuICAgICAgICAgICAgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIikge1xuICAgICAgICAgICAgICAgIC8vIFJhZGlvcyB3aXRob3V0IG5hbWVzIGRvbid0IGFjdCBsaWtlIGdyb3Vwcywgc28gZG9uJ3QgZW5mb3JjZSBncm91cGluZ1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JhZGlvTm9OYW1lXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGFuIHVubmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbXCJcIl0gfHwgW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Mb25lTm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYSBuYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgY29uc3QgbnVtUmFkaW9zV2l0aE5hbWUgPSAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gQ2FwaXRhbGl6ZSB0aGUgaW5wdXQgdHlwZSBmb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGlmIChudW1SYWRpb3NXaXRoTmFtZSA+IDAgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuYW1pbmcgbWlzbWF0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgY29udHJvbHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIiwgW2N0eFR5cGUsIGN0eFR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwicmFkaW9cIiA6IFwiY2hlY2tib3hcIiwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIgJiYgKGZvcm1DYWNoZS5udW1SYWRpb3MgPT09IDEgfHwgbnVtUmFkaW9zV2l0aE5hbWUgPT09IDEpXG4gICAgICAgICAgICAgICAgfHwgY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxvbmUgY29udHJvbCAoZWl0aGVyIG9ubHkgY29udHJvbCBvZiB0aGlzIHR5cGUgb24gdGhlIHBhZ2UsIG9yIGEgcmFkaW8gYnV0dG9uIHdpdGhvdXQgYW55IG90aGVycyBieSB0aGF0IG5hbWUpXG4gICAgICAgICAgICAgICAgLy8gV2UgcGFzcyB0aGlzIGNvbnRyb2wgaW4gYWxsIGNhc2VzXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTG9uZU5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA+IDEgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IG9uZSBjaGVja2JveCB3aXRoIHRoaXMgbmFtZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBjaGVja2JveGVzIGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBncm91cGVkLCBhc2sgdGhlbSB0byBleGFtaW5lIGl0XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfR3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2hhcmUgYSBuYW1lIHdpdGggYW5vdGhlciBzaW1pbGFyIGNvbnRyb2wuIEFyZSB3ZSBncm91cGVkIHRvZ2V0aGVyP1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ3JvdXBlZCwgYnV0IHNvbWUgY29udHJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgaW4gYSBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHVzIGFyZSBncm91cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX05vdEdyb3VwZWRPdGhlck5vdEdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IGN0eEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiB0aGUgbWFpbiBncm91cCB3aXRoIHRoZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9Ob3RTYW1lR3JvdXBcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBhbGwgZ3JvdXBlZCB1cCFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19Hcm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9maWVsZHNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9JbkZpZWxkU2V0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlVzZSB0aGUgPGZpZWxkc2V0PiBlbGVtZW50IHRvIGdyb3VwIGxvZ2ljYWxseSByZWxhdGVkIGlucHV0IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIG9mIGxvZ2ljYWxseSByZWxhdGVkIGlucHV0IGVsZW1lbnRzIHNob3VsZCBiZSBjb250YWluZWQgd2l0aGluIGEgPGZpZWxkc2V0PiBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgZm9yIG90aGVyIGlucHV0IHR5cGVzIG9yIGlmIHdlJ3JlIGluIGEgZmllbGRzZXRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZmllbGRzZXRcIikgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICAvLyBObyBmaWVsZHNldCAtIHNlZSBpZiB0aGlzIGlucHV0IGlzIGFsbCBieSBpdHNlbGYgLSBubyBuZWVkIHRvIGdyb3VwIHNpbmdsZSBpbnB1dHNcbiAgICAgICAgbGV0IHBhcmVudCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImZvcm1cIiwgXCJib2R5XCJdKTtcbiAgICAgICAgbGV0IGNoZWNrVHlwZXMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGVja1R5cGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbHMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hlY2tUeXBlc1tpXSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgcGFzc2VkICYmIGogPCBjb250cm9scy5sZW5ndGg7ICsraikge1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGFuZCBpZiB0aGUgbm9kZSBpc1Zpc2libGUgb3JcbiAgICAgICAgICAgICAgICAvLyBub3QuXG4gICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihjb250cm9sc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRleHRhcmVhcyBhbmQgc2VsZWN0cyB3aWxsIGJlIGNhbGxlZCB0eXBlPSd0ZXh0J1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gY29udHJvbHNbal0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IGNvbnRyb2xzW2pdLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZmFpbCBpZiB0aGlzIGlzIGFub3RoZXIgY29udHJvbCBpbiB0aGUgZm9ybSBhbmQgaXRzIHR5cGUgaXMgYW5vdGhlciB0ZXh0LWxpa2UgaW5wdXRcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBjb250cm9sc1tqXSA9PSBydWxlQ29udGV4dCB8fCAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIiAmJiB0eXBlICE9IFwiZmlsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2hhc3BvcHVwX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbbGlzdF1bYXJpYS1oYXNwb3B1cF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImlucHV0X2hhc3BvcHVwX2ludmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCI8aW5wdXQ+IGVsZW1lbnQgd2l0aCAnbGlzdCcgYXR0cmlidXRlIGFsc28gdXNlcyAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlIHdpdGggdHlwZT1cXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgYWxzbyB1c2VzICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgd2l0aCBtaXNzaW5nIG9yIGludmFsaWQgaW5wdXQgdHlwZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxpbnB1dD4gZWxlbWVudCB3aXRoICdsaXN0JyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhbHNvIHVzZSAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vdHJpZ2dlcmluZyBpbnB1dCB0eXBlczogdGV4dCwgc2VhcmNoLCB0ZWwsIHVybCwgZW1haWwsIG9yIG1pc3Npbmcgb3IgaW52YWxpZCBcbiAgICAgICAgbGV0IHllc1R5cGVzID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLFxuICAgICAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIiwgXCJ0aW1lXCIsIFwiY29sb3JcIiwgXCJpbWFnZVwiLFxuICAgICAgICAgICAgXCJtb250aFwiLCBcIndlZWtcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcImhpZGRlblwiLCBcImJ1dHRvblwiXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgIC8vbWlzc2luZyBpbnB1dCB0eXBlXG4gICAgICAgIGlmICghYXR0clZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gaWdub3JlIGZvciBubyB0cmlnZ2VyaW5nIGlucHV0IHR5cGVzIFxuICAgICAgICBpZiAobm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGZhaWx1cmVfMSBpZiBhbnkgdHJpZ2dlcmluZyBpbnB1dCB0eXBlcyAgICBcbiAgICAgICAgaWYgKHllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFthdHRyVmFsdWVdKTtcblxuICAgICAgICAvL2ludmFsaWQgaW5wdXQgdHlwZVxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTm9kZVdhbGtlciwgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF9hZnRlcjogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9hZnRlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxBZnRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uIGlzIG5lc3RlZCBpbiBsYWJlbCwgc28gbGFiZWwgaXMgbm90IGFmdGVyIHRoZSBpbnB1dCBjb250cm9sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxhYmVsIHRleHQgaXMgbG9jYXRlZCBiZWZvcmUgaXRzIGFzc29jaWF0ZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zIG11c3QgaGF2ZSBhIGxhYmVsIGFmdGVyIHRoZSBpbnB1dCBjb250cm9sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdHlwZSA9IFwiXCI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKVxuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHR5cGUgIT0gXCJjaGVja2JveFwiICYmIHR5cGUgIT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBpZiAobGFiZWxFbGVtID09PSBudWxsIHx8ICFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBSUFRVdGlsLmNvbXBhcmVOb2RlT3JkZXIobGFiZWxFbGVtLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gLTIpIHtcbiAgICAgICAgICAgIC8vIGlucHV0IG5lc3RlZCBpbiBsYWJlbFxuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBuZXcgTm9kZVdhbGtlcihsYWJlbEVsZW0pO1xuICAgICAgICAgICAgd2Fsa05vZGUubm9kZSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa05vZGUubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3BhblwiICYmIHdhbGtOb2RlLm5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5wdXQgbmVzdGVkIGluIGxhYmVsIGFuZCB0ZXh0IGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbGFiZWwgaXMgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuXG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT0gbnVsbCB8fCAhUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBSUFRVdGlsLmNvbXBhcmVOb2RlT3JkZXIobGFiZWxFbGVtLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJidXR0b25cIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcImJ1dHRvbmVsZW1cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJpbnB1dFwiICYmIHR5cGUgPT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzSW1hZ2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IFBPRiA9IC0xO1xuICAgICAgICBsZXQgdGV4dFR5cGVzID0gW1xuICAgICAgICAgICAgXCJ0ZXh0XCIsIFwiZmlsZVwiLCBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsIFwicmFkaW9cIixcbiAgICAgICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIiwgLy9IVE1MIDUuIHR5cGUgPSBcImltYWdlXCIgaXMgY2hlY2tlZCBpbiBnMTAuXG4gICAgICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgICAgIF1cbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzID0gW1xuICAgICAgICAgICAgXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiXG4gICAgICAgIF1cbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnQsIGluIHRoZSBjYXNlIHRoYXQgYW4gbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQS1kZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogUlBUVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBSUFRVdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgYSBidXR0b25cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlc1dpdGhEZWZhdWx0cy5pbmRleE9mKHR5cGUpICE9PSAtMSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidmFsdWVcIikgfHwgUlBUVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwiYnV0dG9uZWxlbVwiKSB7XG4gICAgICAgICAgICAvLyBJZiBJIGFtIGFuIGltYWdlIGFuZCBJIGhhdmUgYWx0IHRleHQgLSBhY2Nlc3NpYmlsaXR5LXdlYi1lbmdpbmUjMjY5XG4gICAgICAgICAgICBsZXQgYkFsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJBbHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJwdF9BcmlhX1ZhbGlkSWRSZWYgZGV0ZXJtaW5lcyBpZiB0aGUgYXJpYS1sYWJlbGxlZGJ5IGlkIHBvaW50cyB0byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpID09IFwiZGlqaXRPZmZTY3JlZW5cIiAmJiBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCkuaGFzQXR0cmlidXRlKFwid2lkZ2V0aWRcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBkaWppdCBidXR0b25zXG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSWQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCkuZ2V0QXR0cmlidXRlKFwid2lkZ2V0aWRcIikgKyBcIl9sYWJlbFwiO1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbElkKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgSSBmYWlsZWQgYWJvdmUgYWxzb1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyA0ICsgYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIElzIGEgbm9uLWVtcHR5IHZhbHVlIGF0dHJpYnV0ZSBhbHNvIGVub3VnaCBmb3IgYW4gb3B0aW9uIGVsZW1lbnQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpIHx8IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDM7XG4gICAgICAgIH0gXG4gICAgICAgIC8qKmlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBhcmlhIHJvbGVcbiAgICAgICAgICAgIC8vYW55IG1vcmUgcm9sZXMgZm9yIGlucHV0PyBcbiAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQm90aCA9IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcIm1lbnVpdGVtY2hlY2tib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwibWVudWl0ZW1yYWRpb1wiKVxuICAgICAgICAgICAgICAgIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInJhZGlvXCIpIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNoZWNrYm94XCIpO1xuICAgICAgICAgICAgY29uc3QgbmFtZUZyb21BdXRob3JPbmx5ID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwibGlzdGJveFwiKSB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIikgXG4gICAgICAgICAgICAgICAgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKVxuICAgICAgICAgICAgICAgIHx8ICFSUFRVdGlsLmhhc0FueVJvbGUocnVsZUNvbnRleHQsIHRydWUpOyAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmFtZUZyb21Cb3RoKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSAmJiBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVGcm9tQm90aCB8fCBuYW1lRnJvbUF1dGhvck9ubHkpXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICB9IFxuICAgICAgICB9Ki9cbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGFyaWEgcm9sZSB0byBmaWd1cmUgb3V0IGlmIHRoZSBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGZyb20gY29udGVudCBcbiAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJpbnB1dF9sYWJlbF9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAhKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBSUFRVdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IFJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJ1dHRvblwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IFwiYnV0dG9uZWxlbVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgdHlwZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGV4dFR5cGVzID0gW1widGV4dFwiLCBcImZpbGVcIiwgXCJwYXNzd29yZFwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsXG4gICAgICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIixcbiAgICAgICAgICAgIFwibW9udGhcIiwgXCJ3ZWVrXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIl07XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IFtcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdO1xuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudCwgaW4gdGhlIGNhc2UgdGhhdCBhbiBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChsYWJlbEVsZW0gIT0gbnVsbCAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSBcImZpbGVcIjsgLy8gaW5wdXQgdHlwZT1maWxlIGhhcyBhIHZpc2libGUgZGVmYXVsdC5cbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSB8fCB0eXBlID09IFwiYnV0dG9uZWxlbVwiKSB7XG4gICAgICAgICAgICAvLyBCdXR0b25zIGFyZSBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZpc2libGUgbGFiZWwgcG9pbnRlZCB0byBieSB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbWVudEJ5SWQsIHJ1bGVDb250ZXh0KSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnRCeUlkKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmUgbGFzdCBjaGVjayBmb3Igcm9sZXMgdGhhdCBzdXBwb3J0IG5hbWUgZnJvbSBjb250ZW50XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBsaXN0IGZyb20gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8jbmFtZWZyb21jb250ZW50XG4gICAgICAgICAgICBsZXQgcm9sZXNXaXRoTmFtZUZyb21Db250ZW50ID0gW1wiYnV0dG9uXCIsIFwiY2VsbFwiLCBcImNoZWNrYm94XCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIiwgXCJoZWFkaW5nXCIsIFwibGlua1wiLFxuICAgICAgICAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwicm93XCIsXG4gICAgICAgICAgICAgICAgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRvb2x0aXBcIiwvKlwidHJlZVwiLCovXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgICAgIC8vZ2V0IGF0dHJpYnV0ZSByb2xlcyBhcyB3ZWxsIGFzIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzV2l0aE5hbWVGcm9tQ29udGVudC5pbmRleE9mKHJvbGVzW2ldKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCB0aGUgbGFiZWwgYmVsb25ncyB0byB0aGUgY29tYm9ib3hcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgaW5wdXRfb25jaGFuZ2VfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X29uY2hhbmdlX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9IYXNPbmNoYW5nZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBhbnkgY2hhbmdlcyBvZiBjb250ZXh0IGFyZSBleHBsYWluZWQgaW4gYWR2YW5jZSB0byB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZlcmlmeSB0aGF0IGFueSBjaGFuZ2VzIG9mIGNvbnRleHQgYXJlIGV4cGxhaW5lZCBpbiBhZHZhbmNlIHRvIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIgJiYgdHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtwbGFjZWhvbGRlcl0sIGRvbTp0ZXh0YXJlYVtwbGFjZWhvbGRlcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW5wdXRfUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJIVE1MNSBwbGFjZWhvbGRlciBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiQWRkaXRpb25hbCB2aXNpYmxlIGxhYmVsIHJlZmVyZW5jZWQgYnkgJ2FyaWEtbGFiZWxsZWRieScgaXMgbm90IHZhbGlkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSFRNTDUgJ3BsYWNlaG9sZGVyJyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCBhcyBhIHZpc2libGUgbGFiZWwgcmVwbGFjZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgICAgbGV0IGhpZGRlbiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGlmIChoaWRkZW4gPT0gXCJcIiB8fCBoaWRkZW4udG9Mb3dlckNhc2UoKSA9PSBcImhpZGRlblwiKSB7IC8vIHdoZW4gaGlkZGVuIGlzIGVtcHR5IGluIHRoZSBlbGVtZW50LCBcIlwiIGlzIHJldHVybmVkLCBzYW1lIGFzIGl0IGhhcyBhIHZhbHVlIG9mIFwiXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcmVmSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pOyAvLyBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgd2hpdGUgc3BhY2VzXG4gICAgICAgICAgICBpZiAoIXJlZklkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGxhYmVsX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfTGFiZWxfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIlBhc3NfUmVndWxhclwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIlBhc3NfQXJpYUxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIlBhc3NfTGFiZWxsZWRCeVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHdpdGggaW5uZXIgY29udGVudFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbCdcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8bGFiZWw+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgZXhwZWN0ZWQgaW5wdXRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxsYWJlbD4gZWxlbWVudCBtdXN0IGhhdmUgbm9uLWVtcHR5IGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBwdXJwb3NlIG9mIHRoZSBpbnRlcmFjdGl2ZSBjb21wb25lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfUmVndWxhclwiKTtcblxuICAgICAgICB9IGVsc2UgaWYgKChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0FyaWFMYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICBpZiAobGFiZWxFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpICYmIFJQVFV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0xhYmVsbGVkQnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGlzTWF0ZXJpYWxJY29uRm9udCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBsZXQgbGFiZWxfbmFtZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX25hbWVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmdyaWRjZWxsLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpvcHRpb24sYXJpYTpyYWRpbyxhcmlhOnN3aXRjaCxhcmlhOnRhYixhcmlhOnRyZWVpdGVtLGRvbTppbnB1dCxkb206dGV4dGFyZWEsZG9tOnNlbGVjdCxkb206b3V0cHV0LGRvbTptZXRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0xhYmVsX0FjY2Vzc2libGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtYXRjaGVzIG9yIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQWNjZXNzaWJsZSBuYW1lIGRvZXMgbm90IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtdXN0IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNS4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJldmlldyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vaXNzdWVzLzE2MThcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMS9UZWNobmlxdWVzL2FyaWEvQVJJQTI0XG4gICAgYWN0OiBcIjJlZThiOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhc3MgaWYgdGhlIHZpc2libGUgdGV4dCB1c2VzIE1hdGVyaWFsIEljb24gZm9udFxuICAgICAgICBpZiAoaXNNYXRlcmlhbEljb25Gb250KHJ1bGVDb250ZXh0KSkgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgaXNJbnB1dEJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgYnV0dG9uVHlwZXMgPSBbXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiLyosIFwiaW1hZ2VcIiovXTtcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGlucHV0VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlcy5pbmRleE9mKGlucHV0VHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNJbnB1dEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhlTGFiZWxCeSA9IFJQVFV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIVJQVFV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsQnkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGVMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGUgYWx0IGNoZWNrIGluIGltYWdlcyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZT09PVwiaW1hZ2VcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpe1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ2FsdCcgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIFxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAndmFsdWUnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGUgPT09IFwic3VibWl0XCIvKnx8aW5wdXRUeXBlPT09XCJpbWFnZVwiKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0VHlwZSA9PT0gXCJyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJyZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgPGxhYmVsPiBlbGVtZW50XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiIC8qJiYgUlBUVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgcnVsZUNvbnRleHQpKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEVsZW0gPSBSUFRVdGlsLnJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGxhYmVsRWxlbSA/IGxhYmVsRWxlbSA6IHJ1bGVDb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrID0gW1wibWV0ZXJcIiwgXCJvdXRwdXRcIiwgXCJwcm9ncmVzc1wiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtICYmIGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrLmluZGV4T2Yobm9kZU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJcIjsgLy8gc2tpcCBjb250ZW50IGNoZWNrIGZvciBzb21lIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhpcyBhbHQgY2hlY2sgaW4gaW1hZ2VzIGZvciBub3cgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBhbHQgYXR0cmlidXRlIG9mIGFuIGltYWdlIHdoaWNoIGlzIGNvbnNpZGVyZWQgdmlzaWJsZSB0ZXh0LlxuICAgICAgICAgICAgICAgIGxldCBoYXNJbWdBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG53ID0gUlBUVXRpbC5uZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNJbWdBbHQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNJbWdBbHQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW1nXCIgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW1nQWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgPyB0ZXh0ICsgbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbm9uYWxwaGFudW1lcmljID0gL1teYS16QS1aMC05XS9nO1xuXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZFRleHQgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGV4dCkudG9Mb3dlckNhc2UoKTsgLy8gTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgZGlmZmVyZW5jZSBpbiBjYXNlIHNlbnNpdGl2aXR5IHNob3VsZCBiZSBpZ25vcmVkLlxuXG4gICAgICAgICAgICB0aGVMYWJlbCA9IHRoZUxhYmVsLnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGhlTGFiZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVGV4dC5sZW5ndGggPiAxKSB7IC8vIHNraXAgbm9uLXRleHQgY29udGVudC4gZS5nLiA8YnV0dG9uIGFyaWEtbGFiZWw9XCJjbG9zZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBub3JtYWxpemVkTGFiZWwuaW5kZXhPZihub3JtYWxpemVkVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBtYXRjaGluZyBwYXJ0aWFsIHdvcmRzLmUuZy4gdGV4dCBcIm5hbWVcIiBzaG91bGQgbm90IG1hdGNoICdzdXJuYW1lJyBvciAnbmFtZXMnXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID49IDAgJiYgbm9ybWFsaXplZExhYmVsLmxlbmd0aCA+IG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV0dGVycyA9IC9eWzAtOWEtekEtWl0rJC87XG4gICAgICAgICAgICAgICAgICAgIGlmICgobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpIDwgbm9ybWFsaXplZExhYmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkICYmIGxvY2F0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYmVnaW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAtMSkgeyAvLyBjaGVjayB0aGF0IHZpc2libGUgdGV4dCBjb250ZW50IG9mIHRoZSB0YXJnZXQgaXMgY29udGFpbmVkIHdpdGhpbiBpdHMgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBsYWJlbF9yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfcmVmX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxbZm9yXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0xhYmVsX1JlZlZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlICdmb3InIGF0dHJpYnV0ZSBpcyBub3QgdGhlICdpZCcgb2YgYSB2YWxpZCA8aW5wdXQ+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5LCB1bmlxdWUgJ2lkJyBhdHRyaWJ1dGUgb2YgYW4gPGlucHV0PiBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRhcmdldCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBib3RoIGxhYmVsIGFuZCBjb250cm9sIGFyZSBpbnZpc2libGVcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBoYW5kbGVzIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgd2UncmUgcG9pbnRpbmcgYXQgc29tZXRoaW5nIHRoYXQgaXMgbGFiZWxsZWQgYnkgYW5vdGhlciBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT0gXCJzZWxlY3RcIiB8fCBub2RlTmFtZSA9PSBcInRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIiB8fCBub2RlTmFtZSA9PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiIHx8IG5vZGVOYW1lID09IFwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJrZXlnZW5cIiB8fCBub2RlTmFtZSA9PSBcIm91dHB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwicHJvZ3Jlc3NcIiB8fCBub2RlTmFtZSA9PSBcIm1ldGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJmaWVsZHNldFwiIHx8IG5vZGVOYW1lID09IFwibGVnZW5kXCI7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT0gXCJ0ZXh0XCIgfHwgdHlwZSA9PSBcInBhc3N3b3JkXCIgfHwgdHlwZSA9PSBcImZpbGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImNoZWNrYm94XCIgfHwgdHlwZSA9PSBcInJhZGlvXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwic2VhcmNoXCIgfHwgdHlwZSA9PSBcInRlbFwiIHx8IHR5cGUgPT0gXCJ1cmxcIiB8fCB0eXBlID09IFwiZW1haWxcIiB8fCAgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRlXCIgfHwgdHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJyYW5nZVwiIHx8IHR5cGUgPT0gXCJpbWFnZVwiIHx8IC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwidGltZVwiIHx8IHR5cGUgPT0gXCJjb2xvclwiIHx8ICAvLyBIVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRldGltZVwiIHx8IHR5cGUgPT0gXCJtb250aFwiIHx8IHR5cGUgPT0gXCJ3ZWVrXCI7IC8vSFRNTDUuMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG9uZSBtb3JlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgTk9UIGhpZGRlbiwgaW4gdGhlIGNhc2UgdGhlIHRhcmdldCBpcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIGZsYWcgYSB2aW9sYXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGlzLlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW46IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IGxpc3RfY2hpbGRyZW5fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGlzdF9jaGlsZHJlbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncm91cFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19MaXN0X0dyb3VwX0xpc3RJdGVtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBoYXMgY2hpbGRyZW4gdGhhdCBhcmUgbm90IDxsaXN0aXRlbT4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBtdXN0IGxpbWl0IGNoaWxkcmVuIHRvIDxsaXN0aXRlbT4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocGFyZW50LCBcImxpc3RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwibGlzdGl0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbGlzdF9tYXJrdXBfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfbWFya3VwX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X1VzZU1hcmt1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgd2hldGhlciB0aGlzIGlzIGEgbGlzdCB0aGF0IHNob3VsZCB1c2UgSFRNTCBsaXN0IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIHByb3BlciBIVE1MIGxpc3QgZWxlbWVudHMgdG8gY3JlYXRlIGxpc3RzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBmYWlsdXJlID0gL15bIFxcdFxcclxcbl0qWyggXSpbMS05XSpbXFwqXFwtKS5dWyBcXHRdW0EtWixhLXpdKy8udGVzdCh0eHRWYWwpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFmYWlsdXJlO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3Mgc29tZSBzb3J0IG9mIGJsb2NrIGxldmVsIGVsZW1lbnQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZHVlIHRvIHRoaW5ncyBsaWtlIDxpPlNvbWUgc2VudGVuY2U8L2k+LiBOZXcgc2VudGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJsb2NrcXVvdGVcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJkaXZcIiwgXCJmb3JtXCIsIFwiaDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIiwgXCJoclwiLCBcImJyXCIsIFwibWVudVwiLCBcInBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInByZVwiXS5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHh0ID0gbncubm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHh0Lmxlbmd0aCA+IDAgJiYgIVtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIl0uaW5jbHVkZXModHh0LmNoYXJBdCh0eHQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCIsIFwic2NyaXB0XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBsaXN0X3N0cnVjdHVyZV9wcm9wZXI6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCIsXG4gICAgY29udGV4dDogXCJkb206ZGwsIGRvbTp1bCwgZG9tOm9sLCBkb206ZGlyLCBkb206bWVudSwgZG9tOmxpLCBkb206ZGQsIGRvbTpkdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0xpc3RfTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkxpc3QgZWxlbWVudCBpcyBtaXNzaW5nIG9yIGltcHJvcGVybHkgc3RydWN0dXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpc3QgZWxlbWVudHMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgbGlzdHMgb2YgcmVsYXRlZCBpdGVtc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBydWxlQ29udGV4dFxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZHJlblxuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImRsXCIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IFwiXCI7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbnMgc2V0IGFzIHBhc3NlZCwgc2luY2UgZGwgZWxlbWVudHMgY2FuIGhhdmVcbiAgICAgICAgICAgIC8vIHplcm8gb3IgbW9yZSBvZjogb25lIG9yIG1vcmUgZHQgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRkIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0LmNoaWxkcmVuIHx8IHJ1bGVDb250ZXh0LmNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIHVuZGVyIGRsLCBpZiB3ZSBmaW5kIGEgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIG1vdmUgdG8gdGhlIG5leHQgZWxlbWVudCBhcyBwcmVzZW50YXRpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0IG5vZGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gcGFzcyBpZiB3ZSBmaW5kIGRkIG9yIGR0IGVsZW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGNhdGNoIGl0IGhlcmUuIGkuZS4gaW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJkZFwiIHx8IG5vZGVOYW1lID09IFwiZHRcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGRlcGVuZGluZyBvbiB3aGljaCBpcyBmb3VuZCBmaXJzdCBhbmQgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IFwiXCIpIGZpcnN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgZm91bmQgZHQgYW5kIGRkIGVsZW1lbnRzIHVuZGVyIGRsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGR0IG9yIGRkIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzUHJlc2VudGF0aW9uYWxFbGVtZW50KHdhbGtDaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGlmIHRoZSBub2RlIHR5cGUgaXMgYW55dGhpbmcgYnV0IDEsIG9yIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBsaSBlbGVtZW50LiBGb3IgYW55IG90aGVyIG5vZGUgXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmUgY2F1Z2h0IGhlcmUgdGhhdCBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIHVuZGVyIGxpc3Qgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRnVydGhlcm1vcmUgaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBhIHRlbXBsYXRlIGVsZW1lbnQgd2l0aCB0aGUgcGFyZW50IGJlaW5nIHVsL29sIGRvbid0IGZsYWcgYSB2aW9sYXRpb25cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd2Fsa0NoaWxkcmVuLm5vZGVUeXBlICE9IDEgfHwgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiIHx8ICh3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRlbXBsYXRlXCIgJiYgKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgbGkgZm91bmQgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IChub2RlVHlwZT0xKSBpcyBhbiBsaSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGxpRm91bmQgPSBsaUZvdW5kIHx8ICh3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgPT0gMSAmJiB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaXQgaGFzIHBhc3NlZCBhbmQgYWxzbyBsaSBlbGVtZW50IGlzIGZvdW5kIHVuZGVyIGxpc3Qgbm9kZSwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gbGkgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyBpbWcgd2Ugd2lsbCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IChwYXNzZWQgJiYgbGlGb3VuZCkgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtYXJxdWVlX2VsZW1fYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWFycXVlZV9lbGVtX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206bWFycXVlZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01hcnF1ZWVfVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NlZF8wXCI6IFwiUGFzc2VkXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzZWRfMFwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc2VkXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYWx0X2JyaWVmOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9icmllZlwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdLCBkb206YXBwbGV0W2FsdF0sIGRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdLCBkb206aW5wdXRbdHlwZV1bYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0FsdEJyaWVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRleHQgYWx0ZXJuYXRpdmUgaXMgbW9yZSB0aGFuIDE1MCBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWx0ZXJuYXRpdmUgdGV4dCBpbiAnYWx0JyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGJyaWVmICg8MTUwIGNoYXJhY3RlcnMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbWF4QWx0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDE1MCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGFsdExlbmd0aCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoO1xuICAgICAgICBsZXQgcGFzc2VkID0gYWx0TGVuZ3RoIDw9IHZhbGlkYXRlUGFyYW1zLm1heEFsdC52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXJlYVthbHRdLCBkb206ZW1iZWRbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVmlkZW9BbHRGaWxlbmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJGaWxlbmFtZSB1c2VkIGFzIGxhYmVsIGZvciBlbWJlZGRlZCBhdWRpbyBvciB2aWRlb1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIG9yIHZpZGVvIG9uIHRoZSBwYWdlIG11c3QgaGF2ZSBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlIG1lZGlhIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHVyaSA9IFwiXCI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYXJlYVwiKSB7XG4gICAgICAgICAgICB1cmkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAodXJpID09IG51bGwpIHVyaSA9IFwiXCI7XG4gICAgICAgIGxldCBleHQgPSBSUFRVdGlsLmdldEZpbGVFeHQodXJpKTtcbiAgICAgICAgbGV0IGlzQXVkVmlkID0gZXh0Lmxlbmd0aCAhPSAwICYmIChSUFRVdGlsLmlzQXVkaW9FeHQoZXh0KSB8fCBSUFRVdGlsLmlzVmlkZW9FeHQoZXh0KSk7XG4gICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIWlzQXVkVmlkIHx8IChhbHRUZXh0Lmxlbmd0aCA+IDAgJiYgYWx0VGV4dC5pbmRleE9mKGV4dCkgPT0gLTEpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ymdzb3VuZCwgZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiUHJvdmlkZSB0cmFuc2NyaXB0cyBmb3IgYXVkaW8gZmlsZXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBpbmZvcm1hdGlvbiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGV4dCBmb3JtXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgdGhpc05vZGUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpc05vZGUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNBdWRpb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7IC8vIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206cGFyYW1bbmFtZT1hdXRvcGxheV0sIGRvbTpwYXJhbVtuYW1lPWF1dG9zdGFydF0sIGRvbTplbWJlZFtmbGFzaHZhcnNdLCBkb206ZW1iZWRbc3JjXSwgZG9tOipbYXV0b3N0YXJ0PXRydWVdLCBkb206KlthdXRvc3RhcnQ9MV0sIGRvbTpiZ3NvdW5kXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfQXV0b1N0YXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIG1lY2hhbmlzbSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWNoYW5pc20gbXVzdCBiZSBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpXG4gICAgICAgICAgICAgICAgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjb250ZW50LmluZGV4T2YoXCIwO1wiKSA9PSAwIHx8XG4gICAgICAgICAgICAgICAgIShjb250ZW50LmluZGV4T2YoXCJ0cnVlXCIpICE9IC0xIHx8IGNvbnRlbnQuaW5kZXhPZihcIjFcIikgIT0gLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHZhbCAhPSAndHJ1ZScgJiYgdmFsICE9ICcxJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphdWRpbywgZG9tOnZpZGVvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0F1ZGlvX1ZpZGVvX1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IG1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgaGF2ZSBrZXlib2FyZCBhY2Nlc3NpYmxlIGNvbnRyb2xzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTWVkaWEgdXNpbmcgPGF1ZGlvPiBhbmQvb3IgPHZpZGVvPiBlbGVtZW50cyBtdXN0IGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYXVkaW9cIiB8fCBub2RlTmFtZSA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtZWRpYV9saXZlX2NhcHRpb25lZDogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9saXZlX2NhcHRpb25lZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9PYmplY3RUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBjYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGxpdmUgbWVkaWEgKHN0cmVhbWluZyB2aWRlbyB3aXRoIGF1ZGlvKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpdmUgbWVkaWEgKHN0cmVhbWluZyB2aWRlbyB3aXRoIGF1ZGlvKSBzaG91bGQgaGF2ZSBjYXB0aW9ucyBmb3IgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuaXNWaWRlb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG1lZGlhX3RyYWNrX2F2YWlsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV90cmFja19hdmFpbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmFwcGxldCwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9SZWZlcmVuY2VUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhdmFpbGFiaWxpdHkgb2YgYSB1c2VyLXNlbGVjdGFibGUgYXVkaW8gdHJhY2sgd2l0aCBkZXNjcmlwdGlvbiBvZiB2aXN1YWwgY29udGVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlByZS1yZWNvcmRlZCBtZWRpYSBzaG91bGQgaGF2ZSBhbiBhdWRpbyB0cmFjayB0aGF0IGRlc2NyaWJlcyB2aXN1YWwgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4zXCIsIFwiMS4yLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYXBwbGV0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNWaWRlb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogWyBcImJpc3o1OFwiLCBcbiAgICAgICAgeyBcbiAgICAgICAgICAgIFwiYmM2NTlhXCIgOiB7XG4gICAgICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJwYXNzXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gSW52YWxpZCBjb250ZW50IGZpZWxkXG4gICAgICAgIGlmICghY29udGVudC5tYXRjaCgvXlxcZCskLykgJiYgIWNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBmaXJzdCBvbmUgc2luY2UgaXQgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgaWYgKFJQVFV0aWwudHJpZ2dlck9uY2UoRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpLCBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIiwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZU1hdGNoID0gY29udGVudC5tYXRjaCgvXihcXGQrKTsgK1teIF0vKTtcbiAgICAgICAgaWYgKCF0aW1lTWF0Y2ggfHwgcGFyc2VJbnQodGltZU1hdGNoWzFdKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0aW1lID0gcGFyc2VJbnQodGltZU1hdGNoWzFdKTtcbiAgICAgICAgICAgIGlmICh0aW1lIDwgNzIwMDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xvbmdyZWZyZXNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbIFwiYmlzejU4XCIsIFwiYmM2NTlhXCIgXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gSW52YWxpZCBjb250ZW50IGZpZWxkXG4gICAgICAgIGlmICghY29udGVudC5tYXRjaCgvXlxcZCskLykgJiYgIWNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmFpbCA9ICFjb250ZW50Lm1hdGNoKC9eXFxkKzsgK1teIF0vKTtcbiAgICAgICAgcmV0dXJuICFmYWlsID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiVGhlICdtZXRhW25hbWU9dmlld3BvcnRdJyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEwXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSAhPT0gJ3ZpZXdwb3J0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBuZWl0aGVyIG1heGltdW0tc2NhbGUgbm9yIHVzZXItc2NhbGFibGUgKGRlZmF1bHQgeWVzKVxuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkgPT09ICcnIHx8ICghY29udGVudC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpICYmICFjb250ZW50LmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJfbXNnID0gbnVsbDtcbiAgICAgICAgbGV0IG1heF9tc2cgPSBudWxsO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGNvbnRlbnQuc3BsaXQoXCIsXCIpO1xuICAgICAgICBsZXQgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZV92YWx1ZSA9ICcyLjAnO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpZWNlcyA9IHByb3AudHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgICBpZiAocGllY2VzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkge1xuICAgICAgICAgICAgICAgIHVzZXJfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCB1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHVzZXJfc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIHVzZXJfc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wLmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykpIHtcbiAgICAgICAgICAgICAgICBtYXhfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IG1heGltdW1fc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIG1heGltdW1fc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IE51bWJlcih1c2VyX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxIHx8IHZhbHVlIDw9IC0xKSB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIobWF4aW11bV9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZSA9PT0gJ3llcycpIG1heGltdW1fc2NhbGUgPSAxLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSAwLjE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzIG5vdCBzZXQgdG8gJ3llcycsIGlnbm9yZSBtYXhpbXVtX3NjYWxlXG4gICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlICE9PSAneWVzJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdXNlcl9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzICd5ZXMnLCBidXQgbWF4aW11bV9zY2FsZSBpcyB0b28gc21hbGxcbiAgICAgICAgaWYgKG1heGltdW1fc2NhbGUgPCAyLjApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIiwgW21heF9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBub2VtYmVkX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpub2VtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX05vZW1iZWRfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQWRkIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIDxub2VtYmVkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG5vZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IG9iamVjdF90ZXh0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJvYmplY3RfdGV4dF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9PYmplY3RfSGFzVGV4dFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG9iamVjdD4gZWxlbWVudCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIGZvciB0aGUgY29udGVudCByZW5kZXJlZCBieSB0aGUgb2JqZWN0XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCI8b2JqZWN0PiBlbGVtZW50IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiQW4gPG9iamVjdD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI4ZmMzYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhpcyBvYmplY3QgaXMgb2YgdHlwZSB0ZXh0LCBieSBjaGVja2luZyB0aGUgb2JqZWN0IHR5cGUgaW4gdGhlIGNhc2UgaXQgaXMgdGV4dCB0aGVuIGRvIG5vdCB0cmlnZ2VyIHRoaXMgcnVsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkuaW5kZXhPZihcInRleHRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkOiBpbmNsdWRpbmcgJ3ByZXNlbnRhdGlvbicsICdub25lJywgJ2FwcGxpY2F0aW9uJywgJ2RvY3VtZW50JyBvciAnaW1nJ1xuICAgICAgICAvLyB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIG90aGVyIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyIEFDVCwgaWdub3JlIGVtYmVkZGVkIEhUTUwgZmlsZXNcbiAgICAgICAgbGV0IGRhdGEgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkYXRhXCIpO1xuICAgICAgICBsZXQgZXh0ID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gdHlwZW9mIFwiXCIgPyBkYXRhLnN1YnN0cmluZyhkYXRhLmxhc3RJbmRleE9mKFwiLlwiKSkgOiBcIlwiO1xuICAgICAgICBpZiAoZXh0ID09PSBcIi5odG1sXCIgfHwgZXh0ID09PSBcIi5odG1cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcblxuZXhwb3J0IGxldCBwYWdlX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Eb2NfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBwYWdlIHNob3VsZCBoYXZlIGEgdGl0bGUgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNaXNzaW5nIDxoZWFkPiBlbGVtZW50IHNvIHRoZXJlIGNhbiBiZSBubyA8dGl0bGU+IGVsZW1lbnQgcHJlc2VudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJNaXNzaW5nIDx0aXRsZT4gZWxlbWVudCBpbiA8aGVhZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgPHRpdGxlPiBlbGVtZW50IGlzIGVtcHR5IChubyBpbm5lckhUTUwpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjI3NzlhNVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNGcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBOb2RlO1xuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgaGVhZCBlbGVtZW50XG4gICAgICAgIGxldCBmaW5kSGVhZCA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IGZpbmRUaXRsZSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChmaW5kSGVhZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZmluZEhlYWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImhlYWRcIilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGZpbmRIZWFkID0gZmluZEhlYWQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3NpYmxlVGl0bGVzID0gKHJ1bGVDb250ZXh0IGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aXRsZVwiKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcG9zc2libGVUaXRsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKCFSUFRVdGlsLmdldEFuY2VzdG9yKHBvc3NpYmxlVGl0bGVzW2lkeF0sIFtcInN2Z1wiXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGl0bGUgPSBwb3NzaWJsZVRpdGxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFmaW5kVGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluZFRpdGxlID09PSBudWxsKSB7IC8vIGRvbid0IGhhdmUgdGl0bGUgc2Vjb25kIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSA8aGVhZD4gYW5kIDx0aXRsZT5cblxuICAgICAgICBpZiAoZmluZFRpdGxlICE9IG51bGwgJiYgUlBUVXRpbC5nZXRJbm5lclRleHQoZmluZFRpdGxlKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgeyAvLyA8dGl0bGU+IGhhcyBubyBpbm5lckhUTUwgdGhpcmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHBhZ2VfdGl0bGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmhlYWQgZG9tOnRpdGxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGl0bGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiUGFnZSA8dGl0bGU+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiVmVyaWZ5IHRoYXQgdXNpbmcgdGhlIGZpbGVuYW1lIGFzIHRoZSBwYWdlIDx0aXRsZT4gdmFsdWUgaXMgZGVzY3JpcHRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIDx0aXRsZT4gc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgdGl0bGUsIHJhdGhlciB0aGFuIGEgZmlsZW5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHRpdGxlU3RyID0gUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKTtcblxuICAgICAgICAvLyBhbGxvdyAuY29tLCAubmV0IGFuZCAub3JnXG4gICAgICAgIGxldCB0aXRsZVN0ckxvd2VyY2FzZSA9IHRpdGxlU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5jb21cIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIubmV0XCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm9yZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBjb3ZlcmVkIGJ5IHBhZ2VfdGl0bGVfZXhpc3RzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsvL1J1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9ICEvXlxcUypcXC5bYS16QS1aXXsxLDR9KD8hLil8Xmh0dHBzPzpcXC9cXC9cXFMqL2kudGVzdCh0aXRsZVN0cik7XG5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmZvY3VzXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NjcmlwdF9Gb2N1c0JsdXJzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBzY3JpcHQgZG9lcyBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0aW5nIG11c3Qgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjdcIiwgXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25mb2N1c1wiKS5pbmRleE9mKFwiLmJsdXIoXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfb25jbGlja19hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0ICdvbmNsaWNrJyBldmVudHMgYXJlIG5vdCB1c2VkIGluIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgdGhpcyBmb3IgU1ZHIGVsZW1lbnQgZm9yIG5vdyB1bnRpbCBhIGRldGVybWluYXRpb24gaXMgbWFkZSAoYnkgUmljaClcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBTVkcgYXQgYSBwb2ludCB3aGVuIHRoZSBTVkcgYTExeSBzcGVjIGlzIHJlYWR5LlxuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJhcmVhXCIgfHwgbm9kZU5hbWUgPT0gXCJpbnB1dFwiO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBzY3JpcHRfb25jbGlja19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG9zc2libGUgdXNlIG9mIGEgc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBmYWlsU3Vic3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5zaHRtbFwiLCBcIi5waHBcIiwgXCIucGxcIiwgXCIucHlcIiwgXCIuc2h0bVwiLCBcIi5zaHRtbFwiLCBcIi54aHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxvY2F0aW9uLmhyZWZcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGEgb3IgYXJlYSwgZG9uJ3QgdHJpZ2dlciBpZiB0aGVyZSdzIGFuIGhyZWYuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiKSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikpO1xuXG4gICAgICAgIC8vIElmIHRoZSBndWFyZHMgZmFpbGVkLCBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBsb29raW5nIGF0IGxpbmtzXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgZmFpbFN1YnN0cmluZyA9IHZhbGlkYXRlUGFyYW1zLmZhaWxTdWJzdHJpbmcudmFsdWU7O1xuICAgICAgICAgICAgbGV0IG9uY2xpY2sgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZmFpbFN1YnN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG9uY2xpY2suaW5kZXhPZihmYWlsU3Vic3RyaW5nW2ldKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHNjcmlwdF9zZWxlY3RfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X05vQ2hhbmdlQWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IG5vIGNoYW5nZSBvZiBjb250ZXh0IG9yIGFjdGlvbiBvY2N1cnMgd2hlbiBzZWxlY3Rpb24gb3B0aW9ucyBpbiB0aGlzIGNvbXBvbmVudCByZWNlaXZlIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gY2hhbmdlcyBvZiBjb250ZXh0IHNob3VsZCBvY2N1ciB3aGVuIGEgc2VsZWN0aW9uIHZhbHVlIHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHNlbGVjdF9vcHRpb25zX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9IYXNPcHRHcm91cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJHcm91cCBvZiByZWxhdGVkIG9wdGlvbnMgbWF5IG5lZWQgPG9wdGdyb3VwPlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiByZWxhdGVkIG9wdGlvbnMgd2l0aGluIGEgc2VsZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIGdyb3VwZWQgd2l0aCA8b3B0Z3JvdXA+XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbU51bU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIG9wdGdyb3VwIGlzIGhpZGRlbiwgd2hpY2ggc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb25zXG4gICAgICAgIC8vIGJ1dCBpbiB0aGUgY2FzZSB0aGF0IENoZWNrIGhpZGRlbiBvcHRpb24gaXMgc2V0IHRoZW4gc2hvdWxkIG5vdCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGdyb3VwXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBSUFRVdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0aW9uXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPD1cbiAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1zLnBhcmFtTnVtT3B0aW9ucy52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBza2lwX21haW5fZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJza2lwX21haW5fZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBQ29udGFpbnNTa2lwVGV4dF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaWYgdGhpcyBoeXBlcmxpbmsgc2tpcHMgY29udGVudCwgdGhlIGRlc2NyaXB0aW9uIGNvbW11bmljYXRlcyB3aGVyZSBpdCBsaW5rcyB0b1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZXNjcmlwdGlvbiBvZiBhIGh5cGVybGluayB1c2VkIHRvIHNraXAgY29udGVudCBtdXN0IGNvbW11bmljYXRlIHdoZXJlIGl0IGxpbmtzIHRvXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1Ta2lwVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJza2lwXCIsIFwianVtcFwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGxpbmtzID0gZG9jLmxpbmtzO1xuICAgICAgICAgICAgLy8gU2tpcCBsaW5rIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGUgKGkuZS4sIGxpbmtzWzBdKVxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZmlyc3QgbGluayBpcyBoaWRkZW4gdGhlbiB3ZSBzaG91bGQgYWxzbyB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxpbmtzWzBdKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VGV4dCA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KGRvYy5saW5rc1swXSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgdmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0ZXN0VGV4dC5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWVbaV0pICE9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBza2lwX21haW5fZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFTa2lwc19OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBtYWluIGNvbnRlbnQgKEFSSUEgXFxcIm1haW5cXFwiIGxhbmRtYXJrIG9yIGEgc2tpcCBsaW5rKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIG11c3QgcHJvdmlkZSBhIHdheSB0byBza2lwIGRpcmVjdGx5IHRvIHRoZSBtYWluIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbmNob3Igc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IHRlc3RBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoYW5jaG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdEFuY2hvciA9IGFuY2hvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHRhcmdldCBpZFxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXN0QW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHJlZlN0ciA9IHRlc3RBbmNob3IuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaHJlZlN0ci5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkID0gaHJlZlN0ci5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaWQgb3IgbmFtZWQgYW5jaG9yIG9uIHRoZSBwYWdlIHdpdGggdGhpc1xuICAgICAgICAgICAgLy8gdGFyZ2V0IGlkLlxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9CYWNrZ3JvdW5kSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSBDU1MgYmFja2dyb3VuZCBpbWFnZSBkb2VzIG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIGluY2x1ZGVkIGJ5IHVzaW5nIENTUyBhbG9uZSBtdXN0IG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikge1xuICAgICAgICAgICAgLy8gRXh0ZXJuYWwgc3R5bGVzaGVldCAtIHRyaWdnZXJcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwudHJpZ2dlck9uY2UocnVsZUNvbnRleHQsIFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZVRleHQ7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgICAgICBsZXQgYmdNYXRjaGVzID0gc3R5bGVUZXh0Lm1hdGNoKC9iYWNrZ3JvdW5kOlteO10qL2cpO1xuICAgICAgICAgICAgaWYgKGJnTWF0Y2hlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJnTWF0Y2hlcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYmdNYXRjaGVzW2ldLmluZGV4T2YoXCJ1cmwoXCIpID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIlxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZ2V0Q1NTU3R5bGUgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbi8qKlxuICogRGVzY3JpcHRpb246IFRyaWdnZXIgaWYgOmJlZm9yZSBhbmQgOmFmdGVyIGFyZSB1c2VkIGluIENTUyAoSW50ZXJuYWwgYW5kIEV4dGVybmFsKSB3aXRoIGNvbnRlbnRcbiAqIE9yaWdpbjogV0NBRyAyLjAgRjg3XG4gKi9cbmV4cG9ydCBsZXQgc3R5bGVfYmVmb3JlX2FmdGVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU3R5bGVfQmVmb3JlQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgQ1NTICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgdG8gaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgZG8gbm90IGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjMuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy9jaGVjayBJbnRlcm5hbCBzdHlsZXMgICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gZ2V0Q1NTU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY3NzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBiYWQgQ1NTXG4gICAgICAgICAgICAgICAgaWYgKGNzc1tpXS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YmVmb3JlXCIpID09PSAtMSAmJiBjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjphZnRlclwiKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKFwiY29udGVudFwiIGluIGNzc1tpXS52YWx1ZXMpIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcXCJcXFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXCdcXCdcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwibm9uZVwiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHkpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzcGVjaWFsIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0c1xuICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBwYXNzZWQgJiYgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrICdpZiAoc3R5bGVSdWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlKScgZG9lc24ndCB3b3JrIHdoZW4gcnVuIGluIEthcm1hKGJ1dCB3b3JrcyBpbiBEQVApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgYWNjZXNzIHRoZSB0eXBlIGRpcmVjdGx5IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVNZWRpYVJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gc3R5bGVNZWRpYVJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1tySW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAoaW1wb3J0ZWRSdWxlIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBleHRlcm5hbCBzdHlsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlRnJvbUxpbmsgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlRnJvbUxpbmsudHlwZSAmJiBydWxlRnJvbUxpbmsudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKHJ1bGVGcm9tTGluayBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBwYXNzZWQgJiYgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlU2VsVHh0ID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVNlbFR4dC5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZVNlbFR4dC5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfY29sb3JfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2NvbG9yX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbTpmb250W2NvbG9yXSwgZG9tOmxpbmtcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9Db2xvclNlbWFudGljczFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBjb252ZXkgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgY29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS40LjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAvLyBjaGVjayBpbXBvcnRcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChzdHlsZUltcG9ydFJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IGltcG9ydFJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpUnVsZSA9IGltcG9ydFJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gaVJ1bGUuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiAvL2NoZWNrIGV4dGVybmFsIHN0eWxlc1xuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gcnVsZXNbckluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gRGVmZWN0IDEwMjI6IEZpbmQgdXNlcyBvZiAnY29sb3InIGFuZCAnKmJhY2tncm91bmQqJyBvbmx5XG4gICAgICAgIGxldCBpc0JnVXNlZCA9IHN0eWxlVGV4dC5tYXRjaCgvXFxiYmFja2dyb3VuZFxcYi9pKTtcblxuICAgICAgICBsZXQgdGhlQ29sb3JTdHlsZVRvQ2hlY2sgPSBzdHlsZVRleHQucmVwbGFjZSgvLWNvbG9yL2csIFwiXCIpO1xuICAgICAgICBsZXQgaXNDb2xvclVzZWQgPSB0aGVDb2xvclN0eWxlVG9DaGVjay5tYXRjaCgvXFxiY29sb3JcXGIvaSk7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvbG9yXCIpIHx8IGlzQ29sb3JVc2VkIHx8IGlzQmdVc2VkKSB7XG4gICAgICAgICAgICBsZXQgZ29vZFRhZ05hbWVzID0ge1xuICAgICAgICAgICAgICAgIFwiZW1cIjogXCJcIiwgXCJzdHJvbmdcIjogXCJcIiwgXCJjaXRlXCI6IFwiXCIsIFwiZGZuXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IFwiXCIsIFwic2FtcFwiOiBcIlwiLCBcImtiZFwiOiBcIlwiLCBcInZhclwiOiBcIlwiLCBcImFiYnJcIjogXCJcIiwgXCJhY3JvbnltXCI6IFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbG9yIHVzZWQg77+9IGFyZSB0aGVyZSBzZW1hbnRpY3MgaW52b2x2ZWQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSBpbiBnb29kVGFnTmFtZXMgfHxcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBnb29kVGFnTmFtZXMpICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCBmYWxzZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBtdXN0IGJlIGhpZ2hseSB2aXNpYmxlIHdoZW4gZGVmYXVsdCBib3JkZXIgb3Igb3V0bGluZSBpcyBtb2RpZmllZCBieSBDU1NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIGhpZ2hseSB2aXNpYmxlIHdoZW4gdXNpbmcgQ1NTIGRlY2xhcmF0aW9uIGZvciAnYm9yZGVyJyBvciAnb3V0bGluZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItY29sb3JcIiwgXCJib3JkZXItc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvdXRsaW5lXCIsIFwib3V0bGluZS13aWR0aFwiLCBcIm91dGxpbmUtY29sb3JcIiwgXCJvdXRsaW5lLXN0eWxlXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkgfHwgdmFsaWRhdGVQYXJhbXMuc2tpcE5vZGVzLnZhbHVlLmluY2x1ZGVzKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJyU3R5bGVzID0gW11cbiAgICAgICAgYXJyU3R5bGVzLnB1c2goZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCkpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1c1wiKSk7XG4gICAgICAgIGFyclN0eWxlcy5wdXNoKGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFwiOmZvY3VzLXZpc2libGVcIikpO1xuICAgICAgICBhcnJTdHlsZXMucHVzaChnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy13aXRoaW5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGFyclN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiB2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbiBzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwxKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMikgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDMpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgbGV0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIxLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gcnVsZSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChydWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlID0gcnVsZSBhcyBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogaW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gMSAvKiBDU1NSdWxlLlNUWUxFX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gcnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlUGF0dGVybiA9IC9mb250LXNpemU6XFxzKlxcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzdHlsZVZhbHVlLm1hdGNoKHN0eWxlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGlzVGFibGVEZXNjZW5kYW50IH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2FyaWFfZGVzY2VuZGFudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0YWJsZSBkb206dHJbcm9sZV0sIGFyaWE6dGFibGUgZG9tOnRoW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0ZFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0cltyb2xlXSwgYXJpYTpncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0ZFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dHJbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRoW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0ZFtyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJ0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQgJ3JvbGUnIHdpdGhpbiB0YWJsZSBjb250YWluZXJzXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJBbiBleHBsaWNpdCBBUklBICdyb2xlJyBpcyBub3QgdmFsaWQgZm9yIDx7MH0+IGVsZW1lbnQgd2l0aGluIGEgQVJJQSByb2xlICd7MX0nIHBlciB0aGUgQVJJQSBpbiBIVE1MIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7IFxuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IG51bGwgfHwgcGFyZW50Um9sZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZXhwbGljaXRfcm9sZVwiLCBbY29udGV4dFtcImRvbVwiXS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudFJvbGVbMF0ucm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRhYmxlX2NhcHRpb25fbmVzdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0luVGFibGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxjYXB0aW9uPiBlbGVtZW50IGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGEgPHRhYmxlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYXB0aW9uPiBlbGVtZW50IG11c3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYXNzb2NpYXRlZCA8dGFibGU+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfaGVhZGVyc19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0RhdGFIZWFkaW5nc0FyaWFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRhYmxlIGhhcyBubyBoZWFkZXJzIGlkZW50aWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEYXRhIHRhYmxlIG11c3QgaWRlbnRpZnkgaGVhZGVyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzRGF0YVRhYmxlKHJ1bGVDb250ZXh0KSB8fCByb3dzID09PSBudWxsIHx8IHJvd3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvbGVzLmluY2x1ZGVzKCdjb2x1bW5oZWFkZXInKSAmJiAhcm9sZXMuaW5jbHVkZXMoJ3Jvd2hlYWRlcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgaWYgKGludmFsaWRIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ludmFsaWRIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVOb2RlSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtzYW1lTm9kZUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoc2FtZVRhYmxlSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8zXCIsIFtzYW1lVGFibGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF80XCIsIFtpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuXG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9oZWFkZXJzX3JlbGF0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGQsIGRvbTp0aFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9UYWJsZV9EYXRhQ2VsbFJlbGF0aW9uc2hpcHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbXBsZXggdGFibGUgZG9lcyBub3QgaGF2ZSBoZWFkZXJzIGZvciBlYWNoIGNlbGwgcHJvcGVybHkgZGVmaW5lZCB3aXRoICdoZWFkZXInIG9yICdzY29wZSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3IgYSBjb21wbGV4IGRhdGEgdGFibGUsIGFsbCA8dGg+IGFuZCA8dGQ+IGVsZW1lbnRzIG11c3QgYmUgcmVsYXRlZCB2aWEgJ2hlYWRlcicgb3IgJ3Njb3BlJyBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50VGFibGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhUlBUVXRpbC5pc0NvbXBsZXhEYXRhVGFibGUocGFyZW50VGFibGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSWYgdGhpcyB0YWJsZSBoYXNuJ3QgYmVlbiBwcmVwcm9jZXNzZWQsIHByb2Nlc3MgaXQuXG4gICAgICAgIGlmIChnZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgZ3JpZCB0aGF0J3MgYWN0dWFsbHkgdXNhYmxlIChyb3dzcGFuIGFuZCBjb2xzcGFuIGVsZW1lbnRzIGFyZSBkdXBsaWNhdGVkKVxuICAgICAgICAgICAgLy8gVGhpcyBidWlsZHMgYSByZWFsIDJkIHRhYmxlIGFycmF5LlxuICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VGFibGUucm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBwYXJlbnRUYWJsZS5yb3dzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpXSkgZ3JpZFtpXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2pdO1xuICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwiY29sXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRDb2xzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBSUFRVdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbZ2V0Q2FjaGUoaGVhZEVsZW0sIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1Njb3BlZCB8fCBzY29wZWRDb2xzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGdyaWRDZWxsLCBcImhlYWRlcnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGRycyA9IGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRycy5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaGRyc1trXS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZEVsZW0gJiYgUlBUVXRpbC5nZXRBbmNlc3RvcihoZWFkRWxlbSwgXCJ0YWJsZVwiKSA9PSBwYXJlbnRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW2dldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIGxvb2t1cCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmNJbmZvID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBnZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSByY0luZm8gIT09IG51bGwgJiYgdEluZm8gIT09IG51bGwgJiYgcmNJbmZvIGluIHRJbmZvO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJjSW5mbyA9PT0gXCIwOjBcIiAmJlxuICAgICAgICAgICAgUlBUVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdGVzdCBpZiBpdCdzIHRoZSB1cHBlci1sZWZ0IGNlbGwgYW5kIGl0J3MgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmxlIGhhcyBubyB0aCdzLCBpdCBtYXkganVzdCBiZSB0aGF0IHRoaXMgd2FzIHN1cHBvc2VkIHRvIGJlIGEgbGF5b3V0XG4gICAgICAgIC8vIHRhYmxlLCB3aGljaCBpbnRyb2R1Y2VzIGEgbG90IG9mIG5vaXNlLiAgSW4gdGhhdCBjYXNlLCBvbmx5IHRyaWdnZXIgdGhpcyBlcnJvclxuICAgICAgICAvLyBvbmNlIHBlciB0YWJsZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcGFyZW50VGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgaWYgKGdldENhY2hlKHBhcmVudFRhYmxlLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZF9UcmlnT25jZVwiLCBmYWxzZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuaXNMYXlvdXRUYWJsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfc2NvcGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc2NvcGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtzY29wZV0sIGRvbTp0aFtzY29wZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9TY29wZV9WYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVmFsdWUgcHJvdmlkZWQgaXMgaW52YWxpZCBmb3IgdGhlICdzY29wZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnc2NvcGUnIGF0dHJpYnV0ZSBzaG91bGQgb25seSBiZSB1c2VkIG9uIGEgPHRoPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVmFsdWUgZm9yICdzY29wZScgYXR0cmlidXRlIG11c3QgYmUgXFxcInJvd1xcXCIsIFxcXCJjb2xcXFwiLCBcXFwicm93Z3JvdXBcXFwiLCBvciBcXFwiY29sZ3JvdXBcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RkJylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcblxuICAgICAgICAvL29ubHkgY29udGludWUgZm9yICd0aCdcbiAgICAgICAgbGV0IHNjb3BlVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSAvXihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSQvLnRlc3Qoc2NvcGVWYWwpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChSUFRVdGlsLmlzRGF0YVRhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX0NhcFN1bW1SZWR1bmRhbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IGR1cGxpY2F0ZXMgdGhlIGNhcHRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFibGUgc3VtbWFyeSBtdXN0IG5vdCBkdXBsaWNhdGUgdGhlIGNhcHRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBvZklkO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHN1bVN0cjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN1bW1hcnlcIikpIHtcbiAgICAgICAgICAgIHBvZklkID0gMDtcbiAgICAgICAgICAgIHN1bVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN1bW1hcnlcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAxO1xuICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVDb25jYXQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdW1tYXJ5Tm9kZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUlkID0gc3VtbWFyeU5vZGVJZHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlOb2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHN1bW1hcnlOb2RlSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUoc3VtbWFyeU5vZGUscnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5Tm9kZUNvbmNhdCArPSBcIiBcIiArIFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHN1bW1hcnlOb2RlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1bVN0ciA9IHN1bW1hcnlOb2RlQ29uY2F0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3VtU3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjYXBFbGVtcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FwdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChjYXBFbGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FwU3RyID0gUlBUVXRpbC5nZXRJbm5lclRleHQoY2FwRWxlbXNbMF0pLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtU3RyLmluY2x1ZGVzKGNhcFN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IHRleHRfYmxvY2tfaGVhZGluZzogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTpwLCBkb206ZGl2LCBkb206YnJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja19TaG91bGRCZUhlYWRpbmdcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgaWYgdGhpcyB0ZXh0IHNob3VsZCBiZSBtYXJrZWQgdXAgYXMgYSBoZWFkaW5nOiB7MH1cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgbXVzdCB1c2UgYSBoZWFkaW5nIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbnVtV29yZHM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBudW1Xb3JkcyA9IHZhbGlkYXRlUGFyYW1zLm51bVdvcmRzLnZhbHVlO1xuICAgICAgICBsZXQgd29yZHNTZWVuID0gMDtcbiAgICAgICAgbGV0IHdvcmRTdHI6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbXBoYXNpemVkVGV4dCA9IGZhbHNlO1xuICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiZcbiAgICAgICAgICAgIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0ICYmXG4gICAgICAgICAgICBudy5ub2RlICE9PSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkgJiZcbiAgICAgICAgICAgICFbXCJiclwiLCBcImRpdlwiLCBcInBcIl0uaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgLy8gRG9uJ3QgcmVwb3J0IHR3aWNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBud05hbWUgPSBudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoKG53TmFtZSA9PSBcImJcIiB8fCBud05hbWUgPT0gXCJlbVwiIHx8IG53TmFtZSA9PSBcImlcIiB8fFxuICAgICAgICAgICAgICAgIG53TmFtZSA9PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PSBcInVcIiB8fCBud05hbWUgPT0gXCJmb250XCIpICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgIGxldCB3YyA9IFJQVFV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgIGlmICh3YyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd29yZFN0ci5wdXNoKG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRzU2VlbiArPSB3YztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIG5vZGUgYmVjYXVzZSBpdCdzIGVtcGhhc2l6ZWRcbiAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobndOYW1lID09IFwiYXBwbGV0XCIgfHwgbndOYW1lID09IFwiZW1iZWRcIiB8fCBud05hbWUgPT0gXCJpbWdcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChud05hbWUgPT09IFwiaW5wdXRcIiAmJiBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PSBcImltYWdlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfHwgKG53TmFtZSA9PT0gXCIjdGV4dFwiICYmIG53Lm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIHRoZW0gdGhlIGJlbmVmaXQgb2YgdGhlIGRvdWJ0IGlmIHRoZXJlJ3MgYSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIHx8IChud05hbWUgPT09IFwiYVwiICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJocmVmXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod29yZHNTZWVuID09IDApIHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb2xvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbi8vaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGdldFdlaWdodE51bWJlciwgZ2V0Rm9udEluUGl4ZWxzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgbGV0IHRleHRfY29udHJhc3Rfc3VmZmljaWVudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIlxuICAgICAgICB9LFxuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQV9QVlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRleHQgd2l0aCBpdHMgYmFja2dyb3VuZCBtdXN0IG1lZXQgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgY29udHJhc3Qgb2YgezB9IHdpdGggaXRzIGJhY2tncm91bmQgaXMgbGVzcyB0aGFuIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3NhbWVfY29sb3JcIjogXCJUaGUgZm9yZWdyb3VuZCB0ZXh0IGFuZCBpdHMgYmFja2dyb3VuZCBjb2xvciBhcmUgYm90aCBkZXRlY3RlZCBhcyB7M30uIFZlcmlmeSB0aGUgdGV4dCBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgMi4xIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX3RleHRfc2hhZG93XCI6IFwiVmVyaWZ5IHRoZSBjb250cmFzdCByYXRpbyBvZiB0aGUgdGV4dCB3aXRoIHNoYWRvdyBtZWV0cyB0aGUgV0NBRyAyLjEgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS40LjNcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFsnYWZ3NGY3J10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgZWxlbWVudHMgdGhhdCBhcmUgbm90IHZpc2libGVcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9UT0RPID8gc2hvdWxkIG9ubHkgY29uc2lkZXIgbmF0aXZlIGRpc2FibGVkLCBpZ25vcmUgYXJpYS1kaXNhYmxlZFxuICAgICAgICAvL3NraXAgZGlzYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChSUFRVdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIFJQVFV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCByZWdleCA9IC9bXihhLXpBLVpcXGRcXHMpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNoaWxkU3RyLnRyaW0oKS5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW0gPSBydWxlQ29udGV4dDtcbiAgICAgICAgLy8gdGhlIGNoaWxkIGVsZW1lbnRzIChyYXRoZXIgdGhhbiBzaGFkb3cgcm9vdCkgb2YgYSBzaGFkb3cgaG9zdCBpcyBlaXRoZXIgcmUtYXNzaWduZWQgdG8gdGhlIHNoYWRvdyBzbG90IGlmIHRoZSBzbG90IGV4aXN0cyBcbiAgICAgICAgLy8gb3Igbm90IGRpc3BsYXllZCwgc28gc2hvdWxkbid0IGJlIGNoZWNrZWQgZnJvbSB0aGUgbGlnaHQgRE9NLCByYXRoZXIgaXQgc2hvdWxkIGJlIGNoZWNrZWQgYXMgcmVhc3NnaW5nZWQgc2xvdCBlbGVtZW50KHMpIGluIHRoZSBzaGFkb3cgRE9NLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gaWYgaXQncyBkaXJlY3QgdGV4dCBvZiBhIHNoYWRvdyBob3N0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGU9cnVsZUNvbnRleHQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZT1ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlPT0zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG11bHRpcGxlIHRleHRzIGV4aXN0LCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IChub2RlIGFzIFRleHQpLmFzc2lnbmVkU2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIFxuICAgICAgICAvLyBKQ0ggY2xpcCBJTkZPOlxuICAgICAgICAvLyAgICAgIFRoZSBjbGlwIHByb3BlcnR5IGxldHMgeW91IHNwZWNpZnkgYSByZWN0YW5nbGUgdG8gY2xpcCBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudC4gXG4gICAgICAgIC8vICAgICAgVGhlIHJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgZm91ciBjb29yZGluYXRlcywgYWxsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlwcGVkLlxuICAgICAgICAvLyAgICAgIFByb3BlcnR5IHZhbHVlczpcbiAgICAgICAgLy8gICAgICAgICAgbm9uZSAgICAgICAgVGhpcyBpcyBkZWZhdWx0LiBObyBjbGlwcGluZyBpcyBkb25lXG4gICAgICAgIC8vICAgICAgICAgIGF1dG8gICAgICAgIE5vIGNsaXBwaW5nIHdpbGwgYmUgZG9uZVxuICAgICAgICAvLyAgICAgICAgICBzaGFwZSAgICAgICBUaGUgb25seSB2YWxpZCB2YWx1ZSBpczogcmVjdCAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBjbGlwOiByZWN0KDEwcHgsIDIwcHgsIDMwcHgsIDQwcHgpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgZm91ciB2YWx1ZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIG1hcmdpbi9wYWRkaW5nXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWN0IHZhbHVlcyBhcmUgcG9zaXRpdmUgcGl4ZWwgdmFsdWVzLCBlLmcuLCAxMHB4LCBldGMuXG4gICAgICAgIC8vICAgICAgICAgIG1hcmdpbi1ib3ggIFVzZXMgdGhlIG1hcmdpbiBib3ggYXMgdGhlIHJlZmVyZW5jZSBib3hcbiAgICAgICAgLy8gICAgICAgICAgYm9yZGVyLWJveCAgVXNlcyB0aGUgYm9yZGVyIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBwYWRkaW5nLWJveCBVc2VzIHRoZSBwYWRkaW5nIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBjb250ZW50LWJveFxuICAgICAgICAvLyAgICAgICAgICBmaWxsLWJveFxuICAgICAgICAvLyAgICAgICAgICBzdHJva2UtYm94XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIENTUyBjbGlwIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWRcbiAgICAgICAgLy8gICAgICBBbHNvOiBjbGlwIG9ubHkgd29ya3MgaWYgdGhlIGVsZW1lbnQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFuZCBjYW4gb25seSBkbyByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICBsZXQgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmIChzdHlsZS53aWR0aCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgIT09IFwiMFwiICYmXG4gICAgICAgICAgICBzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG4gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIC8vIGxlZnQgYW5kIHJpZ2h0IHdvcmsgd2l0aCBhbGwgYWJzb2x1dGUgdW5pdHNcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUubGVmdC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpICYmXG4gICAgICAgICAgICAoc3R5bGUubGVmdCA9PT0gXCJhdXRvXCIgfHwgKHN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnICYmIHBhcnNlSW50KHN0eWxlLnRvcC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpKSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBJUyB2aXNpYmxlXCIpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDSEVDSyBDT0xPUiBDT05UUkFTVCB1bmxlc3MgdG8gc21hbGxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsZW1lbnQgTk9UIHZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgY2xpcEhlaWdodCA9IC0xO1xuICAgICAgICBpZiAoc3R5bGUuY2xpcCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGxldCBjbGlwU3RyaW5nID0gc3R5bGUuY2xpcC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJyZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0T2ZUZXh0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3VuZEFycltcIixpLFwiXSA9IFwiLGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsaXN0T2ZUZXh0ID0gXCIsbGlzdE9mVGV4dCk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gcGFyc2VJbnQobGlzdE9mVGV4dFswXS5yZXBsYWNlKC9weC9nLCAnJykpIC0gcGFyc2VJbnQobGlzdE9mVGV4dFsyXS5yZXBsYWNlKC9weC9nLCAnJykpO1xuICAgICAgICAgICAgY2xpcEhlaWdodCA9IE1hdGguYWJzKGNsaXBIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSkNIIGNsaXAtcGF0aCBJTkZPOlxuICAgICAgICAvLyAgICAgIEV4Y2VsbGVudCBhcnRpY2xlIG9uIGNsaXAtcGF0aDogaHR0cHM6Ly9pc2hhZGVlZC5jb20vYXJ0aWNsZS9jbGlwLXBhdGgvXG4gICAgICAgIC8vICAgICAgY2xpcC1wYXRoIGlzIGEgdG90YWxseSBkaWZmZXJlbnQgYW5pbWFsIHdpdGggbWFueSwgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9uc1xuICAgICAgICAvLyAgICAgIFRoZSBnb2FsIHdhcyBmb3IgaXQgdG8gbm90IGJlIGFzIGxpbWl0ZWQgYXMgY2xpcFxuICAgICAgICAvLyAgICAgIFRoZSBzeW50YXggaXMgbW9yZSBjb21wbGljYXRlZCAoYXMgaXQgZG9lcyBtb3JlKSBhbmQgaXQgaXMgZGlmZmVyZW50IGZyb20gY2xpcCxcbiAgICAgICAgLy8gICAgICBlLmcuLCB0aGUgYWJvdmUgY2xpcCByZWN0YW5nbGUgd291bGQgYmUgY2xpcC1wYXRoOiBpbnNldCgxMHB4IDIwcHggMzBweCA0MHB4KTtcbiAgICAgICAgLy8gICAgICBOb3RlOiB0aGVyZSBhcmUgbm8gY29tbWFzXG4gICAgICAgIC8vICAgICAgQWxzbywgaXQgY2FuIHRha2Ugc2luZ2xlIHZhbHVlcyB0byBtYWtlIGFsbCBzaWRlcyB0aGUgc2FtZSwgb3IgMiB2YWx1ZXMgKHZlcnQvaG9yaSkuXG4gICAgICAgIC8vICAgICAgb3IgMyB2YWx1ZXMgKHRvcC9ob3JpL2JvdHRvbSlcbiAgICAgICAgLy8gICAgICBBbmQgcGVyY2VudGFnZXMgY2FuIHdvcmtzIGFzIHdlbGwgYXMgcHhcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBBbHRob3VnaCB0aGVyZSBhcmUgZml2ZSBkaWZmZXJlbnQgc2hhcGVzOiBpbnNldCAodGVybSB1c2VkIGZvciByZWN0YW5nbGUpLCBjaXJjbGUsXG4gICAgICAgIC8vICAgICAgICAgIGVsbGlwc2UsIHBvbHlnb24sIHBhdGggLSB3ZSB3aWxsIG9ubHkgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpbnNldFxuICAgICAgICAvLyAgICAgIFRoZXJlIGFyZSA3IGJveCB2YWx1ZXM6IG1hcmdpbi1ib3gsIGJvcmRlci1ib3gsIHBhZGRpbmctYm94LCBjb250ZW50LWJveCwgZmlsbC1ib3gsIHN0cm9rZS1ib3gsIHZpZXctYm94XG4gICAgICAgIC8vICAgICAgQm94IGFuZCBzaGFwZSB2YWx1ZXMgbWF5IGJlIGNvbWJpbmVkOiBjbGlwLXBhdGg6IHBhZGRpbmctYm94IGNpcmNsZSg1MHB4IGF0IDAgMTAwcHgpO1xuICAgICAgICAvLyAgICAgIE5PVEU6IHRoZSBib3ggdmFsdWVzIGFyZSBOT1QgaW50dWl0aXZlLCBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2hhcGVzL0Zyb21fYm94X3ZhbHVlcyNtYXJnaW4tYm94XG4gICAgICAgIC8vICAgICAgXG4gICAgICAgIC8vICAgICAgU28gdGhlIGtleSBxdWVzdGlvbiBpcyB3aGF0IGFtb3VudCBvZiBlZmZvcnQgZG8gd2Ugd2FudCB0byBpbnZlc3QgaW50byBjbGlwLXBhdGhcbiAgICAgICAgLy8gXG5cbiAgICAgICAgLy8gSkNIIGRvbid0IGRvIGNsaXAtcGF0aCBub3cgXG4gICAgICAgIGxldCBjbGlwUGF0aEhlaWdodCA9IC0xO1xuICAgICAgICAvLyBpZiAoc3R5bGUuY2xpcFBhdGggIT09IFwiYXV0b1wiKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoID0gXCIsc3R5bGUuY2xpcFBhdGgpO1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJzdHlsZS5jbGlwUGF0aC50b1N0cmluZyA9IFwiLHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAvLyAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwUGF0aC50b1N0cmluZygpO1xuICAgICAgICAvLyAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJpbnNldFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciByZUJyYWNrZXRzID0gL1xcKCguKilcXCkvZztcbiAgICAgICAgLy8gICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgLy8gICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmRBcnIgPSBmb3VuZFsxXS5zcGxpdCgnICcpO1xuICAgICAgICAvLyAgICAgICBmb3IgKGxldCBpPTA7IGk8Zm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAvLyAgICAgICAgIGxpc3RPZlRleHQucHVzaChmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgIH07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgIC8vIGNsaXBQYXRoSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlwUGF0aEhlaWdodCA9IFwiLCBjbGlwUGF0aEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgc3R5bGUuY2xpcCA9PT0gXCJyZWN0KDBweCwgMHB4LCAwcHgsIDBweClcIiAmJiBzdHlsZS5vdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgLy8gSkNIIGFyYml0cmFyaWx5IHVzZSBsZXNzIHRoYXQgN3B4IGZvciBjbGlwSGVpZ2h0XG4gICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIGNsaXBIZWlnaHQgPCA3ICYmIGNsaXBIZWlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVCBiZWNhdXNlIHRvbyBzbWFsbFwiKTtcbiAgICAgICAgICAgIC8vIENvcm5lciBjYXNlIHdoZXJlIGl0ZW0gaXMgaGlkZGVuIChhY2Nlc3NpYmlsaXR5IGhpZGluZyB0ZWNobmlxdWUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRmlyc3QgZGV0ZXJtaW5lIHRoZSBjb2xvciBjb250cmFzdCByYXRpb1xuICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKGVsZW0pO1xuICAgICAgICBpZiAoY29sb3JDb21ibyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy9zb21lIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3Igbm90IGFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBlbGVtZW50OiBcIiArIGVsZW0ubm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmZyA9IGNvbG9yQ29tYm8uZmc7XG4gICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgIGxldCByYXRpbyA9IGZnLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICBsZXQgd2VpZ2h0ID0gZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlLmZvbnRXZWlnaHQpO1xuICAgICAgICBsZXQgc2l6ZSA9IGdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmF0aW8gPj0gNC41IHx8IChyYXRpbyA+PSAzICYmIGlzTGFyZ2VTY2FsZSk7XG4gICAgICAgIGxldCBoYXNCYWNrZ3JvdW5kID0gY29sb3JDb21iby5oYXNCR0ltYWdlIHx8IGNvbG9yQ29tYm8uaGFzR3JhZGllbnQ7XG4gICAgICAgIGxldCB0ZXh0U2hhZG93ID0gY29sb3JDb21iby50ZXh0U2hhZG93O1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQoZWxlbSk7XG4gICAgICAgIGlmICghaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBSUFRVdGlsLmdldENvbnRyb2xPZkxhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gUlBUVXRpbC5pc05vZGVEaXNhYmxlZChjb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIG5vZGVOYW1lID09PSAnbGFiZWwnICYmIFJQVFV0aWwuaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW0pKSB7XG4gICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaXNhYmxlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBSUFRVdGlsLmlzRGlzYWJsZWRCeVJlZmVycmluZ0VsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiRVhUX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIiwge1xuICAgICAgICAgICAgXCJyYXRpb1wiOiByYXRpbyxcbiAgICAgICAgICAgIFwiaXNMYXJnZVNjYWxlXCI6IGlzTGFyZ2VTY2FsZSxcbiAgICAgICAgICAgIFwid2VpZ2h0XCI6IHdlaWdodCxcbiAgICAgICAgICAgIFwic2l6ZVwiOiBzaXplLFxuICAgICAgICAgICAgXCJoYXNCYWNrZ3JvdW5kXCI6IGhhc0JhY2tncm91bmQsXG4gICAgICAgICAgICBcImlzRGlzYWJsZWRcIjogaXNEaXNhYmxlZFxuICAgICAgICB9KTsqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgZWxlbWVudCBvciBwYXJlbnQgaXMgZGlzYWJsZWQsIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSAoYnV0IG1heSBiZSAzOjEgaW4gZnV0dXJlKVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCBvbiBhbiBpbWFnZSBvciBncmFkaWVudCBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgdGV4dCBsb2NhdGlvbiBvbiB0aGUgZ3JhZGllbnQgb3IgaW1hZ2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dFNoYWRvdykge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCB3aXRoIHNoYWRvdyBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgc2hhZG93IGVmZmZlY3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfdGV4dF9zaGFkb3dcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZnLnRvSGV4KCkgPT09IGJnLnRvSGV4KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfc2FtZV9jb2xvclwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zZW5zb3J5X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keSwgZG9tOmJvZHkgZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UZXh0X1NlbnNvcnlSZWZlcmVuY2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSWYgdGhlIHdvcmQocykgJ3swfScgaXMgcGFydCBvZiBpbnN0cnVjdGlvbnMgZm9yIHVzaW5nIHBhZ2UgY29udGVudCwgY2hlY2sgaXQgaXMgc3RpbGwgdW5kZXJzdGFuZGFibGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIG9yIHNoYXBlIGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW5zdHJ1Y3Rpb25zIG11c3QgYmUgbWVhbmluZ2Z1bCB3aXRob3V0IHNoYXBlIG9yIGxvY2F0aW9uIHdvcmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNlbnNvcnlUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyb3VuZFwiLCBcInNxdWFyZVwiLCBcInNoYXBlXCIsIFwicmVjdGFuZ2xlXCIsIFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJhYm92ZVwiLCBcImJlbG93XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidXBwZXJcIiwgXCJsb3dlclwiLCBcImNvcm5lclwiLCBcImJlc2lkZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBub2RlTmFtZSBvZiB0aGUgY29udGV4dCBub2RlXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBpcyBhIHN0eWxlIG9yIGxpbmsgZWxlbWVudCwgc2tpcCB0cmlnZ2VyaW5nIHJ1bGUgYXMgd2UgZG8gbm90IHdhbnQgdG8gc2NhblxuICAgICAgICAvLyBDU1MgZm9yIHNlbnNvcnkgd29yZHMsIGFzIHRoZXJlIGNhbiBiZSBDU1Mga2V5cyB3aGljaCBjb250YWluIHRoZXNlcyBzZW5zb3J5IHRleHQgdGhhdCBpcyBtYXRjaGluZy5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgbm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0QXJyYXkgPSBudWxsO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgbGV0IHNlbnNvcnlSZWdleCA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBudWxsKTtcbiAgICAgICAgaWYgKHNlbnNvcnlSZWdleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgIGxldCByZWdleFN0ciA9IFwiKFwiICsgc2Vuc29yeVRleHRbMF07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKVxuICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9IFwifFwiICsgc2Vuc29yeVRleHRbal07XG4gICAgICAgICAgICByZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLCBzZW5zb3J5UmVnZXgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0QXJyYXkgPSB0eHRWYWwubWF0Y2goc2Vuc29yeVJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGVkdGV4dEFycmF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge30sIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4ZW1wdFdvcmRzID0gW1wicmlnaHQtY2xpY2tcIiwgXCJsZWZ0LWNsaWNrXCIsIFwicmlnaHQtY2xpY2tpbmdcIiwgXCJyaWdodC1jbGlja3NcIiwgXCJsZWZ0LWNsaWNraW5nXCIsIFwibGVmdC1jbGlja3NcIl07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHNwbGl0KC9bXFxuXFxyIF0rLykgd2lsbCBzcHJlYWQgdGhlIHN0cmluZyBpbnRvIGdyb3VwIG9mIHdvcmRzIHVzaW5nIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmlhZ2UgcmV0dXJuIG9yIGxpbmVmZWVkIGFzIHNlcGFyYXRvcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRzID0gdHh0VmFsLnNwbGl0KC9bXFxuXFxyIF0rLykucmVkdWNlKGZ1bmN0aW9uIChtYXAsIHdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVRleHRBcnIgPSB2YWxpZGF0ZVBhcmFtcy5zZW5zb3J5VGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZFdvVHJhaWxpbmdQdW5jID0gd29yZC5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXSskLywgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgc2Vuc29yeVRleHRBcnIubGVuZ3RoOyBjb3VudGVyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBsY1dvcmRXb1B1bmMuaW5kZXhPZihzZW5zb3J5VGV4dEFycltjb3VudGVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiID0gZXhlbXB0V29yZHMuaW5kZXhPZihsY1dvcmRXb1B1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vuc29yeVdvcmRMZW4gPSBzZW5zb3J5VGV4dEFycltjb3VudGVyXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyRm9sbG93U2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KHNlbnNvcnlXb3JkTGVuICsgYSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2NlZWQgdG8gdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gZm9yIG5leHQgc2Vuc29yeVRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhIDwgMCkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1B1bmNmb2xsb3dpbmcgPSAoKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXD8nKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcKScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCcnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFxcXCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXScpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNQdW5jUHJlY2VkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KGEgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHVuY1ByZWNlZGluZyA9ICgoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw/JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOicpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXDsnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwnJykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnLlxcYCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChsY1dvcmRXb1B1bmMubGVuZ3RoID09IHNlbnNvcnlXb3JkTGVuKSB8fCAoaXNQdW5jZm9sbG93aW5nID09IHRydWUpIHx8IChpc1B1bmNQcmVjZWRpbmcgPT0gdHJ1ZSkpICYmIChiIDwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHdvcmRXb1RyYWlsaW5nUHVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHdvcmRXb1RyYWlsaW5nUHVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRlZHRleHQgPSByZXN1bHQuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICAgICAgbGV0IGNoZWNrQW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCIsIFwic2NyaXB0XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IChjaGVja0FuY2VzdG9yID09IG51bGwgfHwgY2hlY2tBbmNlc3Rvci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwiYm9keVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdmlvbGF0ZWR0ZXh0XSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIGdldENvbXB1dGVkU3R5bGUsIGNvbnZlcnRWYWx1ZTJQaXhlbHMgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgdGV4dF9zcGFjaW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfc3BhY2luZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkNTUyAhaW1wb3J0YW50IGlzIG5vdCB1c2VkIGluIGlubGluZSBzdHlsZSB0byBjb250cm9sIGxldHRlciBvciB3b3JkIHNwYWNpbmcgb3IgbGluZSBoZWlnaHRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJhsZXR0ZXItc3BhY2luZ+KAmSBzdHlsZVwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYd29yZC1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxpbmUtaGVpZ2h04oCZIHN0eWxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgIFwibnVtXCI6IFtcIjEuNC4xMlwiXSxcbiAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDpbJzllNDVlYycsICcyNGFmYzInLCAnNzhmZDMyJ10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBib3VuZHMgPSBjb250ZXh0W1wiZG9tXCJdLmJvdW5kcztcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgbm8taHRtbCBlbGVtZW50XG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgY2hpbGRyZW4gd2l0aCBhY3R1YWwgdGV4dC5cbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFN0ciArPSBjaGlsZE5vZGVzW2ldLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRTdHIudHJpbSgpLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9mb250IHNpemUgYWx3YXlzIHJlc29sdmVkIHRvICdweCcgICAgXG4gICAgICAgIGNvbnN0IGZvbnRfc2l6ZV9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpO1xuICAgICAgICBsZXQgZm9udF9zaXplID0gcGFyc2VGbG9hdChmb250X3NpemVfc3R5bGUpOyBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVzKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vbm90ZSB0aGF0IENTUyB1bml0IGlzIHJlcXVpcmVkIGZvciBub24temVybyB2YWx1ZXMsIG90aGVyd2lzZSBpdCdzIGlnbm9yZWRcbiAgICAgICAgbGV0IHJldCA9IFtdOyBcbiAgICAgICAgLy8gbWF0Y2hlZCBzdHJpbmc6IG9yaWdpbmFsIHN0eWxlLCB0aGUgc3R5bGUgdmFsdWUgYW5kIHVuaXRcbiAgICAgICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgICAgICBsZXQgd29yZF9zdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkX3N0eWxlKSB7XG4gICAgICAgICAgICBpZiAod29yZF9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgd29yZF9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wid29yZC1zcGFjaW5nXCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSBnZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnd29yZC1zcGFjaW5nJ107ICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmRfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JkX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KFwid29yZC1zcGFjaW5nXCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSB3b3JkX3N0eWxlLnN1YnN0cmluZygwLCB3b3JkX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmICh3b3JkX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgd29yZF9zdHlsZSA9PT0gJ25vcm1hbCcpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkU3BhY2luZyA9IHBhcnNlRmxvYXQod29yZF9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4od29yZFNwYWNpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gd29yZF9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSAhPT0gJycgJiYgcGFyc2VkWzFdICE9PSAwKSB7IC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXhlbHMgPSBjb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyAhPT0gbnVsbCAmJiBwaXhlbHMvZm9udF9zaXplIDwgMC4xNilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7ICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7ICBcbiAgICAgICAgfSBcblxuICAgICAgICBsZXQgbGV0dGVyX3N0eWxlID0gc3R5bGVzWydsZXR0ZXItc3BhY2luZyddOyBcbiAgICAgICAgaWYgKGxldHRlcl9zdHlsZSkge1xuICAgICAgICAgICAgaWYgKGxldHRlcl9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgbGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjbG9zZXQgYW5jZXN0b3IncyB3b3JkLXNwYWNpbmdcbiAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50LCB7XCJsZXR0ZXItc3BhY2luZ1wiOiBbXCIqXCJdfSwgWydpbmhlcml0JywgJ3Vuc2V0J10pO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBnZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnbGV0dGVyLXNwYWNpbmcnXTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJsZXR0ZXItc3BhY2luZ1wiKSA9PT0gJ2ltcG9ydGFudCcpIHtcbiAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBsZXR0ZXJfc3R5bGUuc3Vic3RyaW5nKDAsIGxldHRlcl9zdHlsZS5sZW5ndGggLSBcIiFpbXBvcnRhbnRcIi5sZW5ndGggLTEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIHNwYWNlIGlzIDAgZm9yICdub3JtYWwnIG9yICdpbml0aWFsJy5cbiAgICAgICAgICAgICAgICBpZiAobGV0dGVyX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgbGV0dGVyX3N0eWxlID09PSAnbm9ybWFsJylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclNwYWNpbmcgPSBwYXJzZUZsb2F0KGxldHRlcl9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obGV0dGVyU3BhY2luZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBsZXR0ZXJfc3R5bGUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRbMl0gIT09ICcnICYmIHBhcnNlZFsxXSAhPT0gMCkgeyAvL25vIHplcm8gdmFsdWUgd2l0aG91dCB1bml0IHdoaWNoIGlzIGNvbnNpZGVyZWQgYXMgZXJyb3IsIHNvIGltcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzID0gY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDAuMTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sZXR0ZXJfc3BhY2luZ19zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IGxpbmVfc3R5bGUgPSBzdHlsZXNbJ2xpbmUtaGVpZ2h0J107XG4gICAgICAgIGxldCBvdmVyZmxvdyA9IHtcIm92ZXJmbG93XCI6WydhdXRvJywgJ3Njcm9sbCddLCBcIm92ZXJmbG93LXhcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteVwiOlsnYXV0bycsICdzY3JvbGwnXX07XG4gICAgICAgIGlmIChsaW5lX3N0eWxlICYmIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKHJ1bGVDb250ZXh0LCBvdmVyZmxvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ2luaGVyaXQnKSB8fCBsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjbG9zZXQgYW5jZXN0b3IncyB3b3JkLXNwYWNpbmdcbiAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50LCB7XCJsaW5lLWhlaWdodFwiOiBbXCIqXCJdfSwgWydpbmhlcml0JywgJ3Vuc2V0J10pO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvcilbJ2xpbmUtaGVpZ2h0J107ICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShcImxpbmUtaGVpZ2h0XCIpID09PSAnaW1wb3J0YW50Jykge1xuICAgICAgICAgICAgICAgIGxpbmVfc3R5bGUgPSBsaW5lX3N0eWxlLnN1YnN0cmluZygwLCBsaW5lX3N0eWxlLmxlbmd0aCAtIFwiIWltcG9ydGFudFwiLmxlbmd0aCAtMSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgc3BhY2UgaXMgMCBmb3IgJ25vcm1hbCcgb3IgJ2luaXRpYWwnLlxuICAgICAgICAgICAgICAgIGlmIChsaW5lX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgbGluZV9zdHlsZSA9PT0gJ25vcm1hbCcpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgZWxzZSB7ICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHBhcnNlRmxvYXQobGluZV9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obGluZUhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBsaW5lX3N0eWxlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkWzJdID09PSAnJykgeyAvL2xpbmUtaGVpZ2h0IGFyZSBhbGxvd2VkIHVuaXRsZXNzIHdoZW4gdGhlIHZhbGllIGlzIG11bHRpcGxlIChvciBmcmFjdGlvbikgb2YgdGhlIGZvbnQgc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRbMV0gPCAxLjUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzID0gY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgXG4gICAgICAgIH0gXG4gICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgXG4gICAgICAgIHJldHVybiBudWxsOyAgLy9pbXBsaWNhYmxlIG9yIGlnbm9yZVxuICAgICAgICBcbiAgICB9ICAgIFxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyLCBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOnNwaW5idXR0b24sYXJpYTp0YWJsaXN0LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudSxhcmlhOnJhZGlvZ3JvdXAsYXJpYTp0cmVlLGFyaWE6Y2hlY2tib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOnNjcm9sbGJhcixhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfVGFiYmFibGVcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiZmFpbF9ub190YWJiYWJsZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vIHNraXAgdGhlIGNvdW50IGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKGNvdW50IDwgMSAmJiAhUlBUVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICB3aGlsZSAoY291bnQgPCAxICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09IDEgJiYgIW53LmJFbmRUYWcgJiYgUlBUVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSBjb3VudCA+PSAxO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbm9fdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCB3aWRnZXRfdGFiYmFibGVfc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRhYmxpc3QsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51LGFyaWE6cmFkaW9ncm91cCxhcmlhOnRyZWUsYXJpYTpjaGVja2JveCxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRleHRib3gsYXJpYTpjb2x1bW5oZWFkZXIsYXJpYTpyb3doZWFkZXIsYXJpYTpzbGlkZXIsYXJpYTp0YWJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfTXVsdGlUYWJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIndpZGdldF90YWJiYWJsZV9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcIkNvbXBvbmVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNlcnRhaW4gY29tcG9uZW50cyBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy9za2lwIHRoZSBjb3VudCBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChjb3VudCA8IDIgJiYgIVJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgJiYgcnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMiAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIFJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gY291bnQgPCAyO1xuICAgICAgICBpZiAoIXBhc3NlZClcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIiwgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBUaGlzIGZpbGUgY29tZXMgZnJvbSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9tYWluL3NyYy9kYXRhL3NjLXVybHMuanNvblxuaW1wb3J0ICogYXMgU0NVUkxzIGZyb20gXCIuL3NjLXVybHMuanNvblwiXG5pbXBvcnQgeyBHdWlkZWxpbmUsIGVHdWlkZWxpbmVDYXRlZ29yeSwgZUd1aWRlbGluZVR5cGUgfSBmcm9tIFwiLi9hcGkvSUd1aWRlbGluZVwiO1xuY29uc3QgU0NzID0gW107XG5mb3IgKGNvbnN0IGtleSBpbiBTQ1VSTHMpIHtcbiAgICBTQ3MucHVzaChTQ1VSTHNba2V5XSk7XG59XG5cbmNvbnN0IHN1bW1hcmllcyA9IHtcbiAgICBcIjEuMS4xXCI6IFwiQWxsIG5vbi10ZXh0IGNvbnRlbnQgdGhhdCBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IHNlcnZlcyB0aGUgZXF1aXZhbGVudCBwdXJwb3NlLlwiLFxuICAgIFwiMS4yLjFcIjogXCJGb3IgcHJlcmVjb3JkZWQgYXVkaW8tb25seSBvciB2aWRlby1vbmx5IG1lZGlhLCBhbiBhbHRlcm5hdGl2ZSBwcm92aWRlcyBlcXVpdmFsZW50IGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMS4yLjJcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBwcmVyZWNvcmRlZCBhdWRpbyBjb250ZW50IGluIHN5bmNocm9uaXplZCBtZWRpYS5cIixcbiAgICBcIjEuMi4zXCI6IFwiQW4gYWx0ZXJuYXRpdmUgZm9yIHRpbWUtYmFzZWQgbWVkaWEgb3IgYXVkaW8gZGVzY3JpcHRpb24gb2YgdGhlIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaXMgcHJvdmlkZWQgZm9yIHN5bmNocm9uaXplZCBtZWRpYS5cIixcbiAgICBcIjEuMi40XCI6IFwiQ2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBhbGwgbGl2ZSBhdWRpbyBjb250ZW50IGluIHN5bmNocm9uaXplZCBtZWRpYS5cIixcbiAgICBcIjEuMi41XCI6IFwiQXVkaW8gZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgZm9yIGFsbCBwcmVyZWNvcmRlZCB2aWRlbyBjb250ZW50IGluIHN5bmNocm9uaXplZCBtZWRpYS5cIixcbiAgICBcIjEuMy4xXCI6IFwiSW5mb3JtYXRpb24sIHN0cnVjdHVyZSwgYW5kIHJlbGF0aW9uc2hpcHMgY29udmV5ZWQgdGhyb3VnaCBwcmVzZW50YXRpb24gY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCBvciBhcmUgYXZhaWxhYmxlIGluIHRleHQuXCIsXG4gICAgXCIxLjMuMlwiOiBcIldoZW4gdGhlIHNlcXVlbmNlIGluIHdoaWNoIGNvbnRlbnQgaXMgcHJlc2VudGVkIGFmZmVjdHMgaXRzIG1lYW5pbmcsIGEgY29ycmVjdCByZWFkaW5nIHNlcXVlbmNlIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQuXCIsXG4gICAgXCIxLjMuM1wiOiBcIkluc3RydWN0aW9ucyBwcm92aWRlZCBmb3IgdW5kZXJzdGFuZGluZyBhbmQgb3BlcmF0aW5nIGNvbnRlbnQgZG8gbm90IHJlbHkgc29sZWx5IG9uIHNlbnNvcnkgY2hhcmFjdGVyaXN0aWNzIG9mIGNvbXBvbmVudHMgc3VjaCBhcyBzaGFwZSwgc2l6ZSwgdmlzdWFsIGxvY2F0aW9uLCBvcmllbnRhdGlvbiwgb3Igc291bmQuXCIsXG4gICAgXCIxLjMuNFwiOiBcIkNvbnRlbnQgZG9lcyBub3QgcmVzdHJpY3QgaXRzIHZpZXcgYW5kIG9wZXJhdGlvbiB0byBhIHNpbmdsZSBkaXNwbGF5IG9yaWVudGF0aW9uLCBzdWNoIGFzIHBvcnRyYWl0IG9yIGxhbmRzY2FwZS5cIixcbiAgICBcIjEuMy41XCI6IFwiVGhlIHB1cnBvc2Ugb2YgZWFjaCBpbnB1dCBmaWVsZCB0aGF0IGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgd2hlbiB0aGUgZmllbGQgc2VydmVzIGEgY29tbW9uIHB1cnBvc2UuXCIsXG4gICAgXCIxLjQuMVwiOiBcIkNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyBvZiBjb252ZXlpbmcgaW5mb3JtYXRpb24sIGluZGljYXRpbmcgYW4gYWN0aW9uLCBwcm9tcHRpbmcgYSByZXNwb25zZSwgb3IgZGlzdGluZ3Vpc2hpbmcgYSB2aXN1YWwgZWxlbWVudC5cIixcbiAgICBcIjEuNC4yXCI6IFwiSWYgYW55IGF1ZGlvIHBsYXlzIGF1dG9tYXRpY2FsbHkgZm9yIG1vcmUgdGhhbiAzIHNlY29uZHMsIGVpdGhlciBhIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCB0aGUgYXVkaW8sIG9yIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBjb250cm9sIGF1ZGlvIHZvbHVtZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIG92ZXJhbGwgc3lzdGVtIHZvbHVtZSBsZXZlbC5cIixcbiAgICBcIjEuNC4zXCI6IFwiVGhlIHZpc3VhbCBwcmVzZW50YXRpb24gb2YgdGV4dCBhbmQgaW1hZ2VzIG9mIHRleHQgaGFzIGEgY29udHJhc3QgcmF0aW8gb2YgYXQgbGVhc3QgNC41OjEsIHdpdGggYSAzOjEgcmF0aW8gZm9yIGxhcmdlLXNjYWxlIHRleHQuXCIsXG4gICAgXCIxLjQuNFwiOiBcIlRleHQgY2FuIGJlIHJlc2l6ZWQgd2l0aG91dCBhc3Npc3RpdmUgdGVjaG5vbG9neSB1cCB0byAyMDAgcGVyY2VudCB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5LlwiLFxuICAgIFwiMS40LjVcIjogXCJJZiB0aGUgdGVjaG5vbG9naWVzIGJlaW5nIHVzZWQgY2FuIGFjaGlldmUgdGhlIHZpc3VhbCBwcmVzZW50YXRpb24sIHRleHQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiBpbWFnZXMgb2YgdGV4dC5cIixcbiAgICBcIjEuNC4xMFwiOiBcIkNvbnRlbnQgY2FuIHJlZmxvdyB3aXRob3V0IGxvc3Mgb2YgaW5mb3JtYXRpb24gb3IgZnVuY3Rpb25hbGl0eSwgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHNjcm9sbGluZyBpbiB0d28gZGltZW5zaW9ucy5cIixcbiAgICBcIjEuNC4xMVwiOiBcIlRoZSBwYXJ0cyBvZiBncmFwaGljYWwgb2JqZWN0cyByZXF1aXJlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZW50LCBhbmQgdGhlIHZpc3VhbCBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpZGVudGlmeSBVSSBjb21wb25lbnRzIGFuZCBzdGF0ZXMsIGhhdmUgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCAzOjEgYWdhaW5zdCBhZGphY2VudCBjb2xvcnMuXCIsXG4gICAgXCIxLjQuMTJcIjogXCJObyBsb3NzIG9mIGNvbnRlbnQgb3IgZnVuY3Rpb25hbGl0eSBvY2N1cnMgd2hlbiB1c2VycyBjaGFuZ2UgbGV0dGVyLCB3b3JkIGFuZCBwYXJhZ3JhcGggc3BhY2luZywgYXMgd2VsbCBhcyBsaW5lIGhlaWdodC5cIixcbiAgICBcIjEuNC4xM1wiOiBcIldoZXJlIGhvdmVyIG9yIGZvY3VzIGFjdGlvbnMgY2F1c2UgYWRkaXRpb25hbCBjb250ZW50IHRvIGJlY29tZSB2aXNpYmxlIGFuZCBoaWRkZW4sIHRoZSBhZGRpdGlvbmFsIGNvbnRlbnQgaXMgZGlzbWlzc2FibGUsIGhvdmVyYWJsZSBhbmQgcGVyc2lzdGVudC5cIixcbiAgICBcIjIuMS4xXCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNvbnRlbnQgaXMgb3BlcmFibGUgdGhyb3VnaCBhIGtleWJvYXJkIGludGVyZmFjZSB3aXRob3V0IHJlcXVpcmluZyBzcGVjaWZpYyB0aW1pbmdzIGZvciBpbmRpdmlkdWFsIGtleXN0cm9rZXMuXCIsXG4gICAgXCIyLjEuMlwiOiBcIklmIGtleWJvYXJkIGZvY3VzIGNhbiBiZSBtb3ZlZCB0byBhIGNvbXBvbmVudCB1c2luZyBhIGtleWJvYXJkIGludGVyZmFjZSwgdGhlbiBmb2N1cyBjYW4gYmUgbW92ZWQgYXdheSBmcm9tIHRoYXQgY29tcG9uZW50IHVzaW5nIG9ubHkgYSBrZXlib2FyZCBpbnRlcmZhY2UsIGFuZCwgaWYgaXQgcmVxdWlyZXMgbW9yZSB0aGFuIHVubW9kaWZpZWQgYXJyb3cgb3IgdGFiIGtleXMgb3Igb3RoZXIgc3RhbmRhcmQgZXhpdCBtZXRob2RzLCB0aGUgdXNlciBpcyBhZHZpc2VkIG9mIHRoZSBtZXRob2QgZm9yIG1vdmluZyBmb2N1cyBhd2F5LlwiLFxuICAgIFwiMi4xLjRcIjogXCJJZiBhIGtleWJvYXJkIHNob3J0Y3V0IGlzIGltcGxlbWVudGVkIHVzaW5nIG9ubHkgbGV0dGVyLCBwdW5jdHVhdGlvbiwgbnVtYmVyIG9yIHN5bWJvbCBjaGFyYWN0ZXJzLCB0aGVuIHRoZSBzaG9ydGN1dCBjYW4gYmUgdHVybmVkIG9mZiwgcmVtYXBwZWQgb3IgYWN0aXZhdGVkIG9ubHkgb24gZm9jdXMuXCIsXG4gICAgXCIyLjIuMVwiOiBcIkZvciBlYWNoIHRpbWUgbGltaXQgdGhhdCBpcyBzZXQgYnkgdGhlIGNvbnRlbnQsIHRoZSB1c2VyIGNhbiB0dXJuIG9mZiwgYWRqdXN0LCBvciBleHRlbmQgdGhlIGxpbWl0LlwiLFxuICAgIFwiMi4yLjJcIjogXCJGb3IgbW92aW5nLCBibGlua2luZywgc2Nyb2xsaW5nLCBvciBhdXRvLXVwZGF0aW5nIGluZm9ybWF0aW9uLCB0aGUgdXNlciBjYW4gcGF1c2UsIHN0b3AsIGhpZGUgb3IgYWRqdXN0IHRoZSBpbmZvcm1hdGlvbi5cIixcbiAgICBcIjIuMy4xXCI6IFwiQ29udGVudCBkb2VzIG5vdCBjb250YWluIGFueXRoaW5nIHRoYXQgZmxhc2hlcyBtb3JlIHRoYW4gdGhyZWUgdGltZXMgaW4gYW55IG9uZSBzZWNvbmQgcGVyaW9kLCBvciB0aGUgZmxhc2ggaXMgYmVsb3cgdGhlIGdlbmVyYWwgZmxhc2ggYW5kIHJlZCBmbGFzaCB0aHJlc2hvbGRzLlwiLFxuICAgIFwiMi40LjFcIjogXCJBIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgdG8gYnlwYXNzIGJsb2NrcyBvZiBjb250ZW50IHRoYXQgYXJlIHJlcGVhdGVkIG9uIG11bHRpcGxlIFdlYiBwYWdlcy5cIixcbiAgICBcIjIuNC4yXCI6IFwiV2ViIHBhZ2VzLCBub24td2ViIGRvY3VtZW50cywgYW5kIHNvZnR3YXJlIGhhdmUgdGl0bGVzIHRoYXQgZGVzY3JpYmUgdG9waWMgb3IgcHVycG9zZS5cIixcbiAgICBcIjIuNC4zXCI6IFwiSWYgY29udGVudCBjYW4gYmUgbmF2aWdhdGVkIHNlcXVlbnRpYWxseSBhbmQgdGhlIG5hdmlnYXRpb24gc2VxdWVuY2VzIGFmZmVjdCBtZWFuaW5nIG9yIG9wZXJhdGlvbiwgZm9jdXNhYmxlIGNvbXBvbmVudHMgcmVjZWl2ZSBmb2N1cyBpbiBhbiBvcmRlciB0aGF0IHByZXNlcnZlcyBtZWFuaW5nIGFuZCBvcGVyYWJpbGl0eS5cIixcbiAgICBcIjIuNC40XCI6IFwiVGhlIHB1cnBvc2Ugb2YgZWFjaCBsaW5rIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGxpbmsgdGV4dCBhbG9uZSBvciBmcm9tIHRoZSBsaW5rIHRleHQgdG9nZXRoZXIgd2l0aCBpdHMgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIGxpbmsgY29udGVudC5cIixcbiAgICBcIjIuNC41XCI6IFwiTW9yZSB0aGFuIG9uZSB3YXkgaXMgYXZhaWxhYmxlIHRvIGxvY2F0ZSBhIFdlYiBwYWdlIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMsIGV4Y2VwdCB3aGVyZSB0aGUgV2ViIFBhZ2UgaXMgdGhlIHJlc3VsdCBvZiwgb3IgYSBzdGVwIGluLCBhIHByb2Nlc3MuXCIsXG4gICAgXCIyLjQuNlwiOiBcIkhlYWRpbmdzIGFuZCBsYWJlbHMgZGVzY3JpYmUgdG9waWMgb3IgcHVycG9zZS5cIixcbiAgICBcIjIuNC43XCI6IFwiQW55IGtleWJvYXJkIG9wZXJhYmxlIHVzZXIgaW50ZXJmYWNlIGhhcyBhIG1vZGUgb2Ygb3BlcmF0aW9uIHdoZXJlIHRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZS5cIixcbiAgICBcIjIuNS4xXCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIG11bHRpcG9pbnQgb3IgcGF0aC1iYXNlZCBnZXN0dXJlcyBmb3Igb3BlcmF0aW9uIGNhbiBiZSBvcGVyYXRlZCB3aXRoIGEgc2luZ2xlIHBvaW50ZXIgd2l0aG91dCBhIHBhdGgtYmFzZWQgZ2VzdHVyZS5cIixcbiAgICBcIjIuNS4yXCI6IFwiRm9yIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgb3BlcmF0ZWQgdXNpbmcgYSBzaW5nbGUgcG9pbnRlciwgY29tcGxldGlvbiBvZiB0aGUgZnVuY3Rpb24gaXMgb24gdGhlIHVwLWV2ZW50IHdpdGggYW4gYWJpbGl0eSB0byBhYm9ydCwgdW5kbyBvciByZXZlcnNlIHRoZSBvdXRjb21lLlwiLFxuICAgIFwiMi41LjNcIjogXCJGb3IgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyB3aXRoIGxhYmVscyB0aGF0IGluY2x1ZGUgdGV4dCBvciBpbWFnZXMgb2YgdGV4dCwgdGhlIGFjY2Vzc2libGUgbmFtZSBjb250YWlucyB0aGUgdGV4dCB0aGF0IGlzIHByZXNlbnRlZCB2aXN1YWxseS5cIixcbiAgICBcIjIuNS40XCI6IFwiRnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCBieSBtb3Rpb24gY2FuIGFsc28gYmUgb3BlcmF0ZWQgYnkgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cywgYW5kIHRoZSBtb3Rpb24gdHJpZ2dlciBjYW4gYmUgZGlzYWJsZWQuXCIsXG4gICAgXCIzLjEuMVwiOiBcIlRoZSBkZWZhdWx0IGh1bWFuIGxhbmd1YWdlIG9mIFdlYiBwYWdlcywgbm9uLVdlYiBkb2N1bWVudHMsIG9yIHNvZnR3YXJlIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQuXCIsXG4gICAgXCIzLjEuMlwiOiBcIlRoZSBodW1hbiBsYW5ndWFnZSBvZiBlYWNoIHBhc3NhZ2Ugb3IgcGhyYXNlIGluIHRoZSBjb250ZW50IGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQuXCIsXG4gICAgXCIzLjIuMVwiOiBcIldoZW4gYW55IGNvbXBvbmVudCByZWNlaXZlcyBmb2N1cywgaXQgZG9lcyBub3QgaW5pdGlhdGUgYSBjaGFuZ2Ugb2YgY29udGV4dC5cIixcbiAgICBcIjMuMi4yXCI6IFwiQ2hhbmdpbmcgdGhlIHNldHRpbmcgb2YgYW55IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNhdXNlIGEgY2hhbmdlIG9mIGNvbnRleHQgdW5sZXNzIHRoZSB1c2VyIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIGJlaGF2aW9yIGJlZm9yZSB1c2luZyB0aGUgY29tcG9uZW50LlwiLFxuICAgIFwiMy4yLjNcIjogXCJOYXZpZ2F0aW9uYWwgbWVjaGFuaXNtcyB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXMgd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcyBvY2N1ciBpbiB0aGUgc2FtZSByZWxhdGl2ZSBvcmRlciBlYWNoIHRpbWUgdGhleSBhcmUgcmVwZWF0ZWQsIHVubGVzcyBhIGNoYW5nZSBpcyBpbml0aWF0ZWQgYnkgdGhlIHVzZXIuXCIsXG4gICAgXCIzLjIuNFwiOiBcIkNvbXBvbmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcyBhcmUgaWRlbnRpZmllZCBjb25zaXN0ZW50bHkuXCIsXG4gICAgXCIzLjMuMVwiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQsIHRoZSBpdGVtIHRoYXQgaXMgaW4gZXJyb3IgaXMgaWRlbnRpZmllZCBhbmQgdGhlIGVycm9yIGlzIGRlc2NyaWJlZCB0byB0aGUgdXNlciBpbiB0ZXh0LlwiLFxuICAgIFwiMy4zLjJcIjogXCJMYWJlbHMgb3IgaW5zdHJ1Y3Rpb25zIGFyZSBwcm92aWRlZCB3aGVuIGNvbnRlbnQgcmVxdWlyZXMgdXNlciBpbnB1dC5cIixcbiAgICBcIjMuMy4zXCI6IFwiSWYgYW4gaW5wdXQgZXJyb3IgaXMgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhbmQgc3VnZ2VzdGlvbnMgZm9yIGNvcnJlY3Rpb24gYXJlIGtub3duLCB0aGVuIHRoZSBzdWdnZXN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gdGhlIHVzZXIsIHVubGVzcyBpdCB3b3VsZCBqZW9wYXJkaXplIHRoZSBzZWN1cml0eSBvciBwdXJwb3NlIG9mIHRoZSBjb250ZW50LlwiLFxuICAgIFwiMy4zLjRcIjogXCJGb3IgY29udGVudCB0aGF0IGNhdXNlIGxlZ2FsIGNvbW1pdG1lbnRzIG9yIGZpbmFuY2lhbCB0cmFuc2FjdGlvbnMgZm9yIHRoZSB1c2VyIHRvIG9jY3VyLCB0aGF0IG1vZGlmeSBvciBkZWxldGUgdXNlci1jb250cm9sbGFibGUgZGF0YSBpbiBkYXRhIHN0b3JhZ2Ugc3lzdGVtcywgb3IgdGhhdCBzdWJtaXQgdXNlciB0ZXN0IHJlc3BvbnNlcywgdGhlIHVzZXIgY2FuIHJldmVyc2UsIGNvcnJlY3QsIG9yIGNvbmZpcm0gdGhlIGFjdGlvbi5cIixcbiAgICBcIjQuMS4yXCI6IFwiRm9yIGFsbCB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZm9ybSBlbGVtZW50cywgbGlua3MgYW5kIGNvbXBvbmVudHMgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMpLCB0aGUgbmFtZSBhbmQgcm9sZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkOyBzdGF0ZXMsIHByb3BlcnRpZXMsIGFuZCB2YWx1ZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IHNldDsgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvIHRoZXNlIGl0ZW1zIGlzIGF2YWlsYWJsZSB0byB1c2VyIGFnZW50cywgaW5jbHVkaW5nIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuXCIsXG4gICAgXCI0LjEuM1wiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgc3RhdHVzIG1lc3NhZ2VzIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgdGhyb3VnaCByb2xlIG9yIHByb3BlcnRpZXMgc3VjaCB0aGF0IHRoZXkgY2FuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHdpdGhvdXQgcmVjZWl2aW5nIGZvY3VzLlwiLFxuICAgIFwiSFRNTFwiOiBcIlRoZSBIVE1MIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgcmVwb3J0ZWQuXCIsXG4gICAgXCJBUklBXCI6IFwiVGhlIEFSSUEgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgdGhhdCBjYXVzZSBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBtYXkgYmUgY292ZXJlZCBieSBvdGhlciBydWxlcyBhbmQgd2lsbCBiZSByZXBvcnRlZCB1bmRlciB0aG9zZSBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50cy4gSG93ZXZlciwgc29tZSBub24tY29uZm9ybWluZyBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIGFyZSByZXBvcnRlZC5cIixcbn0gICAgIFxuXG5leHBvcnQgbGV0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjJcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQUEgcGx1cyBhZGRpdGlvbmFsIElCTSBjaGVja2xpc3Qgc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIldDQUdfMl8xXCIsXG4gICAgICAgIG5hbWU6IFwiV0NBRyAyLjEgKEEsIEFBKVwiLFxuICAgICAgICBjYXRlZ29yeTogZUd1aWRlbGluZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBXQ0FHIDIuMSBBQS4gVGhpcyBpcyB0aGUgY3VycmVudCBXM0MgcmVjb21tZW5kYXRpb24uIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMSBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4wLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMFwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4wIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAgQUEuIFJlZmVyZW5jZWQgYnkgVVMgU2VjdGlvbiA1MDgsIGJ1dCBub3QgdGhlIGxhdGVzdCBXM0MgcmVjb21tZW5kYXRpb24uXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH1cbl1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi9DYWNoZVV0aWxcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9IFwiOmhvdmVyXCIgfCBcIjphY3RpdmVcIiB8IFwiOmZvY3VzXCIgfCBcIjpmb2N1cy12aXNpYmxlXCIgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoc2VsZWN0b3IudHJpbSgpID09PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5tYXRjaGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5tYXRjaGVzU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOYXRpdmUgZnVuY3Rpb25zIG5vdCB0aGVyZSwgZmFsbGJhY2tcbiAgICAgICAgbGV0IG1hdGNoZXMgPSAoZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50Lm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBtYXRjaGVzLmxlbmd0aCAmJiBtYXRjaGVzW2ldICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgICArK2k7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaSA8IG1hdGNoZXMubGVuZ3RoO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBCYWQgc2VsZWN0b3I/IERvZXNuJ3QgbWF0Y2ggdGhlbi4uLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAqIEBwYXJhbSBlbGVtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICBjb25zdCBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3Qgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0eWxlIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudFxuICogXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgY29tcHV0ZWQgc3R5bGUgaW4gdGhhdCB0aGUgY29tcHV0ZWQgc3R5bGUgd2lsbCByZXR1cm5cbiAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gKiBhcHBsaWNhdGlvblxuICogaWYgcm90YXRpb24gdHJhbnNmb3JtIGlzIHVzZWQsIHRoZSBjb21wdXRlZCBzdHlsZSByZXR1cm5zIHRoZSByZXNvbHZlZCBtYXRyaXhcbiAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKSBcbiAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKScgXG4gKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJyAgXG4gKiBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAqIHRoYW4gd2hlbiB0aGUgcHNldWRvQ2xhc3MgZG9lcyBub3QgbWF0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZpbmVkU3R5bGVzKGVsZW06IEhUTUxFbGVtZW50LCBwc2V1ZG9DbGFzcz86IFBzZXVkb0NsYXNzKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJGdW5jdGlvbjogZ2V0RGVmaW5lZFN0eWxlc1wiKTtcbiAgICBsZXQgZGVmaW5lZFN0eWxlcyA9IHt9O1xuICAgIGxldCBkZWZpbmVkU3R5bGVQc2V1ZG8gPSB7fTtcbiAgICBcbiAgICBmdW5jdGlvbiBmaWxsU3R5bGUobWFwcywgc3R5bGUpIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4PTA7IHNJbmRleCA8IHN0eWxlLmxlbmd0aDsgKytzSW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChzdHlsZVtzSW5kZXhdID09PSBcImFsbFwiICYmIHN0eWxlW3N0eWxlW3NJbmRleF1dKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVbc0luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSBpbiBtYXAgJiYgbWFwW2tleV0uZW5kc1dpdGgoXCIhaW1wb3J0YW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09PSAnaW1wb3J0YW50JyAmJiAhbWFwW2tleV0uc3RhcnRzV2l0aChcImluaGVyaXRcIikgJiYgIW1hcFtrZXldLnN0YXJ0c1dpdGgoXCJ1bnNldFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL292ZXJyaWRlICFpbXBvcnRhbnQgb25seSBpZiBpdCBpcyBhbHNvICFpbXBvcnRhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlICFpbXBvcnRhbnQgaWYgaXQgaXMgbm90ICFpbXBvcnRhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NyZWF0ZS9vdmVyaWRlIGFueXdheVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSBzdHlsZVtrZXldICsgKHByaW9yaXR5ID09PSAnaW1wb3J0YW50JyA/IFwiICFpbXBvcnRhbnRcIiA6IFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gXG5cbiAgICBsZXQgc3RvcmVkU3R5bGVzID0gZ2V0Q2FjaGUoZWxlbSwgXCJSUFRVdGlsX0RlZmluZWRTdHlsZXNcIiwgbnVsbCk7XG4gICAgaWYgKCFwc2V1ZG9DbGFzcyAmJiBzdG9yZWRTdHlsZXMgIT09IG51bGwpICB7XG4gICAgICAgIGRlZmluZWRTdHlsZXMgPSBzdG9yZWRTdHlsZXNbXCJkZWZpbmVkU3R5bGVzXCJdO1xuICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG8gPSBzdG9yZWRTdHlsZXNbXCJkZWZpbmVkU3R5bGVQc2V1ZG9cIl07XG4gICAgfSBlbHNlIHsgIFxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBhbmQgcnVsZXNcbiAgICAgICAgZm9yIChsZXQgc3NJbmRleCA9IDA7IHNzSW5kZXggPCBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdvdCBzaGVldFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgc2hlZXQuY3NzUnVsZXMubGVuZ3RoOyArK3JJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJHb3QgcnVsZTogXCIsIHNoZWV0LmNzc1J1bGVzW3JJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVsbFJ1bGVTZWxlY3RvciA9IHJ1bGUuc2VsZWN0b3JUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxSdWxlU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXRjaCA9IGZ1bGxSdWxlU2VsZWN0b3IubWF0Y2goL14oLiopKDpbYS16QS1aLV0qKSQvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNQc2V1ZG9DbGFzcyA9ICEhcHNldWRvTWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYW1lUHNldWRvQ2xhc3MgPSBzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9DbGFzcyAmJiBwc2V1ZG9DbGFzcyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGZvY3VzLCByZW1vdmUgZm9jdXMtd2l0aGluIGZyb20gcGFyZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxNYWluID0gc2VsTWFpbi5yZXBsYWNlKC8oWyA+XVteK34gPl0rKTpmb2N1cy13aXRoaW4vZywgXCIkMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgc3R5bGVzIG9mIG5vbi1wc2V1ZG8gc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQc2V1ZG9DbGFzcyAmJiBzZWxlY3Rvck1hdGNoZXNFbGVtKGVsZW0sIHNlbE1haW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZShbZGVmaW5lZFN0eWxlcywgZGVmaW5lZFN0eWxlUHNldWRvXSwgcnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhbWVQc2V1ZG9DbGFzcyAmJiBzZWxlY3Rvck1hdGNoZXNFbGVtKGVsZW0sIHNlbE1haW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZShbZGVmaW5lZFN0eWxlUHNldWRvXSwgcnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICghZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9cblxuICAgICAgICAvLyBIYW5kbGVkIHRoZSBzdHlsZXNoZWV0cywgbm93IGhhbmRsZSB0aGUgZWxlbWVudCBkZWZpbmVkIHN0eWxlc1xuICAgICAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb10sIGVsZW0uc3R5bGUpO1xuICAgICAgICBzZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCB7ZGVmaW5lZFN0eWxlcywgZGVmaW5lZFN0eWxlUHNldWRvfSk7XG4gICAgfSAgICBcbiAgICAvKipcbiAgICAgKiAnaW5pdGlhbCcgc2V0cyB0aGUgc3R5bGUgYmFjayB0byBkZWZhdWx0XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlcykge1xuICAgICAgICBpZiAoZGVmaW5lZFN0eWxlc1trZXldID09PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZXNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZpbmVkU3R5bGVQc2V1ZG8pIHtcbiAgICAgICAgaWYgKGRlZmluZWRTdHlsZVBzZXVkb1trZXldID09PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZVBzZXVkb1trZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgICovXG4gICAgICAgIFxuICAgIGlmICghcHNldWRvQ2xhc3MpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbREVCVUc6IENTU1V0aWw6OmdldERlZmluZWRTdHlsZXNdXCIsIGVsZW0ubm9kZU5hbWUsIHBzZXVkb0NsYXNzLCBKU09OLnN0cmluZ2lmeShkZWZpbmVkU3R5bGVzLCBudWxsLCAyKSk7XG4gICAgICAgIHJldHVybiBkZWZpbmVkU3R5bGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmluZWRTdHlsZVBzZXVkbykge1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVBzZXVkb1trZXldID09PSBkZWZpbmVkU3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGVmaW5lZFN0eWxlUHNldWRvW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbREVCVUc6IENTU1V0aWw6OmdldERlZmluZWRTdHlsZXNdXCIsIGVsZW0ubm9kZU5hbWUsIHBzZXVkb0NsYXNzLCBKU09OLnN0cmluZ2lmeShkZWZpbmVkU3R5bGVQc2V1ZG8sIG51bGwsIDIpKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZWRTdHlsZVBzZXVkbztcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVkaWEgcXVlcnkgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50XG4gKiBcbiAqIFxuICogQHBhcmFtIHtEb2N1bWVudH0gZG9jIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2M6IERvY3VtZW50KSB7XG4gICAgbGV0IG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IHt9XG4gICAgXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgZm9yIChsZXQgc3NJbmRleCA9IDA7IHNzSW5kZXggPCBkb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hlZXRSdWxlID0gc2hlZXQuY3NzUnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovID09PSBzaGVldFJ1bGUuTUVESUFfUlVMRSkgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldFJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhTGlzdCA9IHJ1bGUubWVkaWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWRpYUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1fdHJhbnNmb3JtcyA9IG9yaWVudGF0aW9uVHJhbnNmb3Jtc1ttZWRpYUxpc3QuaXRlbShpKS50b0xvY2FsZUxvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtX3RyYW5zZm9ybXMpIGVsZW1fdHJhbnNmb3JtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovID09PSBzdHlsZVJ1bGVzW2ldLlNUWUxFX1JVTEUpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tpXSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzdHlsZVJ1bGUuc2VsZWN0b3JUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJhbnNmb3JtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBzdHlsZVJ1bGUuc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHN0eWxlcy5sZW5ndGg7ICsrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJhbGxcIiAmJiBzdHlsZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHJhbnNmb3Jtc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1zW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3Jtc1ttZWRpYUxpc3QuaXRlbShpKS50b0xvY2FsZUxvd2VyQ2FzZSgpXSA9IGVsZW1fdHJhbnNmb3JtczsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJiAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JpZW50YXRpb25UcmFuc2Zvcm1zO1xufVxuXG4vKipcbiAqIGNvbnZlcnQgZ2l2ZW4gcm90YXRpb24gdHJhbnNmb3JtIGZ1bmN0aW9ucyB0byB0aGUgZGVncmVlIHRyYW5zZm9ybWVkLiBcbiAqIElmIG11bHRpcGxlIGZ1bmN0aW9ucyBhcmUgZ2l2ZW4sIHRoZW4gdGhlIGZ1bmN0aW9ucyBhcmUgYXBwbGllZCBsaW5lYXJseSBpbiB0aGUgb3JkZXIuIFxuICogICByb3RhdGlvbl90cmFuc2Zvcm0gZnVuY3Rpb24gZXhhbXBsZTogIHJvdGF0ZSg0NWRlZyksIHJvdGF0ZSgydHVybiksIHJvdGF0ZSgycmFkKSwgcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpLFxuICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAqIEBwYXJhbSByb3RhdGlvbl90cmFuc2Zvcm0gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICBsZXQgZGVncmVlID0gMDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgLy8gbm9ybWFsaXplIHRoZSByb3RhdGlvbl90cmFuc2Zvcm1cbiAgICAgICAgcm90YXRpb25fdHJhbnNmb3JtID0gcm90YXRpb25fdHJhbnNmb3JtLnJlcGxhY2VBbGwoXCIsIFwiLCBcIixcIik7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0wOyBpIDwgdHJhbnNmb3JtX2Z1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uID09PSAnJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGUzZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcobGVmdCsxLCByaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdGF0aW9uID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKDAsIHJvdGF0aW9uLmxlbmd0aCAtIDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDM2MDsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAxODAvTWF0aC5QSTsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwiZGVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgKz0gbnVtOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlXCIpIHx8IHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlWlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcobGVmdCsxLCByaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwidHVyblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwOyBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInJhZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMTgwL01hdGguUEk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwiZGVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKDAsIHJvdGF0aW9uLmxlbmd0aCAtIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgKz0gbnVtOyBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXgzZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgel9hbmdsZSA9IE1hdGguYXRhbjIodmFsdWVzWzRdLCB2YWx1ZXNbNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoTWF0aC5yb3VuZCh6X2FuZ2xlICogMTgwL01hdGguUEkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcIm1hdHJpeFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgel9hbmdsZSA9IE1hdGguYXRhbjIodmFsdWVzWzFdLCB2YWx1ZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoTWF0aC5yb3VuZCh6X2FuZ2xlICogMTgwL01hdGguUEkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChkZWdyZWUgPj0gMzYwKSBkZWdyZWUgLT0gMzYwO1xuICAgICAgICBcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDYW5ub3QgcmV0cmlldmUgcm90YXRpb24gZGVncmVlOiBcIiArIGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9IFxuICAgIHJldHVybiBkZWdyZWU7IFxufVxuXG4vKipcbiAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBzdHlsZSB2YWx1ZSBpbiBzdHJpbmcsIHN1Y2ggYXMgM3JlbSwgMjMwcHggZXRjLlxuICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICogQHJldHVybiB2YWx1ZSBpbiBwaXhlbHNcbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0gKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgIGxldCBwYXJzZWQgPSB2YWx1ZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgIGlmIChwYXJzZWRbMl0gPT09ICcnIHx8IHBhcnNlZFsxXSA9PT0gMCkgXG4gICAgICAgLy9ubyB6ZXJvIHZhbHVlIHdpdGhvdXQgdW5pdCB3aGljaCBpcyBjb25zaWRlcmVkIGFzIGVycm9yLCBzbyBpbXBsaWNhYmxlXG4gICAgICAgcmV0dXJuIDA7XG4gICAgXG4gICAgY29uc3QgcGl4ZWxzID0gY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgZWxlbSk7XG4gICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAqXG4gKiBAcGFyYW0gdW5pdFZhbHVlIGluIHN0cmluZ1xuICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICogQHJldHVybiB2YWx1ZSBpbiBwaXhlbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdW5pdFZhbHVlLCBlbGVtICkge1xuICAgIGlmICh1bml0VmFsdWUgPT0gMCkgcmV0dXJuIDA7XG4gICAgY29uc3Qgc3VwcG9ydGVkVW5pdHMgPSB7XG4gICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgJ3B4JzogdmFsdWUgPT4gdmFsdWUsXG4gICAgICAgICdjbSc6IHZhbHVlID0+IHZhbHVlICogMzcuOCxcbiAgICAgICAgJ21tJzogdmFsdWUgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAncSc6IHZhbHVlID0+IHZhbHVlICogMC45NSxcbiAgICAgICAgJ2luJzogdmFsdWUgPT4gdmFsdWUgKiA5NixcbiAgICAgICAgJ3BjJzogdmFsdWUgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgJ3B0JzogdmFsdWUgPT4gdmFsdWUgKiAxLjMzLFxuICAgICAgICBcbiAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAncmVtJzogdmFsdWUgPT4gdmFsdWUgKiBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpICksXG4gICAgICAgICdlbSc6IHZhbHVlID0+IHZhbHVlICogcGFyc2VGbG9hdCggZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSksXG4gICAgICAgICd2dyc6IHZhbHVlID0+IHZhbHVlIC8gMTAwICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICd2aCc6IHZhbHVlID0+IHZhbHVlIC8gMTAwICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVySGVpZ2h0LFxuICAgICAgICAnJSc6ICB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpXG4gICAgfTtcblxuICAgIGlmICggdW5pdCBpbiBzdXBwb3J0ZWRVbml0cyApXG4gICAgICAgIHJldHVybiBzdXBwb3J0ZWRVbml0c1sgdW5pdCBdKCB1bml0VmFsdWUgKTtcbiAgICBcbiAgICByZXR1cm4gbnVsbDtcbn1cbiAvKlxuICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAqICBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gXG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gaXNNYXRlcmlhbEljb25Gb250KGVsZW06IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gVE9ETzogY2hlY2sgdGhlIGV4aXN0ZW5jZSBtYXRlcmlhbCBpY29ucyB1c2luZyBmZXRjaCBpbiBub2RlIDE4K1xuICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAvL2xpc3Qgb2Yga25vd24gbWF0ZXJpYWwgaWNvbnMgYW5kIHN0eWxlc2hlZXQgbGlua1xuICAgIGNvbnN0IGtub3duX2ljb25zID0ge1xuICAgICAgICAnTWF0ZXJpYWwgSWNvbnMnIDogXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCJcbiAgICB9O1xuICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAnbWF0ZXJpYWwtaWNvbnMnIDogXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCJcbiAgICB9O1xuXG4gICAgLy8gbWF0ZXJpYWwgaWNvbiBmb250IGNhbiBiZSBkZWZpbmVkIGVpdGhlciBieSBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJyBvciBieSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCJcbiAgICBsZXQgc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhlbGVtKTtcbiAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1snZm9udC1mYW1pbHknXTtcbiAgICBcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzIFxuICAgIGlmIChmb250RmFtaWx5ICYmIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCAnJykudHJpbSgpIGluIGtub3duX2ljb25zKVxuICAgICAgICBmb3VuZCA9IHRydWU7XG5cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgbGV0IGxpc3QgPSAgZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgZm9yIChsZXQgY3NzX2NsYXNzIGluIGtub3duX2Nzc19jbGFzc2VzKSB7XG4gICAgICAgICAgIGlmIChsaXN0LmNvbnRhaW5zKGNzc19jbGFzcykpIHtcbiAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICB9IFxuICAgICAgIH1cbiAgICB9ICAgIFxuICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgLy8gY2hlY2sgaWYgdGhlIHN0eWxlc2hlZXQgZm9yIHRoZSAnTWF0ZXJpYWwgSWNvbnMnIGV4aXN0cyBzdGF0aWNhbGx5XG4gICAgbGV0IHNoZWV0cyA9IGVsZW0ub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cztcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICBpZiAoc2hlZXRzICYmIHNoZWV0cy5sZW5ndGggPiAwICYmIE9iamVjdC52YWx1ZXMoa25vd25faWNvbnMpLmluZGV4T2Yoc2hlZXRzW3NdLmhyZWYpID4gLTEpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBcbiAgICB9ICAgICAgIFxuICAgIHJldHVybiBwYXNzZWQ7XG4gfVxuXG4gZXhwb3J0IGZ1bmN0aW9uIGdldFdlaWdodE51bWJlcihzdHlsZVZhbCkge1xuICAgIGxldCBtYXAgPSB7XG4gICAgICAgIFwibGlnaHRcIjogMTAwLFxuICAgICAgICBcImJvbGRcIjogNzAwXG4gICAgfTtcbiAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgIGlmIChyZXRWYWwpIHJldHVybiByZXRWYWw7XG4gICAgaWYgKHN0eWxlVmFsIGluIG1hcClcbiAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgcmV0dXJuIDQwMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgIGxldCBtYXAgPSB7XG4gICAgICAgIFwieHgtc21hbGxcIjogMTYsXG4gICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgXCJzbWFsbFwiOiAxMyxcbiAgICAgICAgXCJtZWRpdW1cIjogMTYsXG4gICAgICAgIFwibGFyZ2VcIjogMTgsXG4gICAgICAgIFwieC1sYXJnZVwiOiAyNCxcbiAgICAgICAgXCJ4eC1sYXJnZVwiOiAzMlxuICAgIH07XG4gICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChzdHlsZVZhbCk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICB9XG4gICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgLyoqXG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJcIiB8fCB1bml0cyA9PT0gXCJweFwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJlbVwiKSByZXR1cm4gdmFsdWUgKiAxNjtcbiAgICAgICAgaWYgKHVuaXRzID09PSBcIiVcIikgcmV0dXJuIHZhbHVlIC8gMTAwICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJwdFwiKSByZXR1cm4gdmFsdWUgKiA0IC8gMztcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICAgICovXG4gICAgcmV0dXJuIGNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdHMsIHZhbHVlLCBlbGVtICk7XG4gICBcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTU3R5bGUoZWxlbWVudCkge1xuICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgaWYgKGVsZW1lbnQuSUJNX0NTU19USEIpIHJldHVybiBlbGVtZW50LklCTV9DU1NfVEhCO1xuICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmlubmVyVGV4dDtcbiAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIH0gZWxzZSByZXR1cm4gW107XG4gICAgaWYgKHN0eWxlVGV4dCA9PT0gbnVsbCB8fCBzdHlsZVRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgbGV0IHJlID0gLyhcXC9cXCorKD86KD86KD86W15cXCpdKSspfCg/OltcXCpdKyg/IVxcLykpKVsqXStcXC8pfFxcL1xcLy4qL2c7XG4gICAgbGV0IHN1YnN0ID0gJyAnO1xuICAgIHN0eWxlVGV4dCA9IHN0eWxlVGV4dC5yZXBsYWNlKHJlLCBzdWJzdCk7XG4gICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgbGV0IHJLZXlWYWxzID0gL1xccyooW146XFxzXSspXFxzKjpcXHMqKFteOyR9XSspXFxzKig7fCQpL2c7XG4gICAgLy8gRmluZCBhbGwgXCJzZWxlY3RvciB7IGNzc2tleXZhbHMgfSB3aXRoIHZhcmlvdXMgd2hpdGVzcGFjZSBpbmJldHdlZW5cbiAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgIGlmIChzdHlsZVRleHQuaW5kZXhPZihcIntcIikgPT09IC0xKSB7XG5cbiAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIHdoaWxlICgobSA9IHJLZXlWYWxzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFZhbCA9IFt7XG4gICAgICAgICAgICBzZWxlY3RvcjogbnVsbCxcbiAgICAgICAgICAgIHZhbHVlczoga2V5VmFsc1xuICAgICAgICB9XTtcbiAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmV0VmFsID0gW107XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgbTI7XG4gICAgICAgIHdoaWxlICgobSA9IHJTZWxlY3RvcnMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9XG4gICAgICAgICAgICBsZXQgc2VsS2V5ID0gbVsxXTtcbiAgICAgICAgICAgIGxldCBzZWxWYWwgPSBtWzJdO1xuXG4gICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttMlsxXV0gPSBtMlsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsS2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFsc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZURvY3VtZW50IGV4dGVuZHMgRG9jdW1lbnQge1xuICAgIGFjZUNhY2hlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICAgIGFjZUNhY2hlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9XG59XG5cbi8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGdpdmVuIGdsb2JhbCB2YXJpYWJsZVxuICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWNoZShjYWNoZVNwb3Q6IEVsZW1lbnQgfCBEb2N1bWVudCB8IERvY3VtZW50RnJhZ21lbnQsIGtleU5hbWUsIGluaXRWYWx1ZSkge1xuICAgIGxldCBjYWNoZU9iaiA9IChjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovIHx8IGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSA/IGNhY2hlU3BvdCBhcyBDYWNoZURvY3VtZW50IDogY2FjaGVTcG90IGFzIENhY2hlRWxlbWVudDtcbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgfVxuICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENhY2hlKGNhY2hlU3BvdDogRG9jdW1lbnQgfCBFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB8IFNoYWRvd1Jvb3QsIGdsb2JhbE5hbWUsIHZhbHVlKSA6IGFueSB7XG4gICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlID0ge31cbiAgICB9XG4gICAgY2FjaGVPYmouYWNlQ2FjaGVbZ2xvYmFsTmFtZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ2FjaGVzKGNhY2hlUm9vdCA6IE5vZGUpIDogdm9pZCB7XG4gICAgZGVsZXRlIChjYWNoZVJvb3Qub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGNhY2hlUm9vdCk7XG4gICAgZG8ge1xuICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgbncubm9kZS5vd25lckRvY3VtZW50ICYmIGRlbGV0ZSAobncubm9kZS5vd25lckRvY3VtZW50IGFzIENhY2hlRG9jdW1lbnQpLmFjZUNhY2hlO1xuICAgIH0gd2hpbGUgKG53Lm5leHROb2RlKCkpO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG4vKiBcbiAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAqIHJldHVybjogbnVsbCBpZiBubyBleHBsaWNpdCByb2xlIGlzIGRlZmluZWQsIFxuICogICAgICAgICB0cnVlIGlmIHRoZSByb2xlKHMpIGFyZSBkZWZpbmVkIGluIEFSSUFcbiAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09MCkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykgXG4gICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpIFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qIFxuICogY2hlY2sgaWYgYW55IGV4cGxpY2l0IHJvbGUgc3BlY2lmaWVkIGZvciB0aGUgZWxlbWVudCBpcyBhIHZhbGlkIEFSSUEgcm9sZVxuICogcmV0dXJuOiBudWxsIGlmIG5vIGV4cGxpY2l0IHJvbGUgaXMgZGVmaW5lZCwgXG4gKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICogICAgICAgICBmYWxzZSBpZiBhbnkgcm9sZSBpcyBub3QgZGVmaW5lZCBpbiBBUklBXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludmFsaWRSb2xlcyhydWxlQ29udGV4dDogRWxlbWVudCkge1xuICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgIFxuICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICByZXR1cm4gW1wiZ2VuZXJpY1wiXTtcbiAgICBcbiAgICAvLyBGYWlsaW5nIHJvbGVzXG4gICAgbGV0IGZhaWxSb2xlVG9rZW5zID0gW107XG4gICAgLy8gUGFzc2luZyByb2xlc1xuICAgIGxldCBwYXNzUm9sZVRva2VucyA9IFtdO1xuXG4gICAgbGV0IHRhZ1Byb3BlcnR5ID0gUlBUVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICBsZXQgYWxsb3dlZFJvbGVzID0gUlBUVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKHJ1bGVDb250ZXh0LCB0YWdQcm9wZXJ0eSk7XG4gICAgaWYgKCFhbGxvd2VkUm9sZXMgJiYgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGRvbVJvbGVzO1xuICAgIFxuICAgIGxldCBpbnZhbGlkUm9sZXMgPSBbXTtcblxuICAgIGlmIChhbGxvd2VkUm9sZXMgJiYgYWxsb3dlZFJvbGVzLmluY2x1ZGVzKCdhbnknKSlcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgIGludmFsaWRSb2xlcy5wdXNoKGRvbVJvbGVzW2ldKTtcblxuICAgIHJldHVybiBpbnZhbGlkUm9sZXM7ICAgICAgICBcbn1cblxuLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAqIHJldHVybjogbGlzdCBvZiBzcGVjaWZpZWQgcm9sZXMgbm90IGRlZmluZWQgaW4gQVJJQVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhlbGVtZW50LCBmYWxzZSk7XG4gICAgbGV0IHVuZGVmaW5lZFJvbGVzID0gW107XG4gICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICB1bmRlZmluZWRSb2xlcy5wdXNoKHJvbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gICAgXG4gICAgcmV0dXJuIHVuZGVmaW5lZFJvbGVzOyAgICAgICAgXG59XG5cbi8qIFxuICogdGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIGV4cGxpY2l0IHJvbGVzLCBpZiBubyBleHBsaWNpdCByb2xlLCBpdCB3aWxsIGNoZWNrIHRoZSBpbXBsaWNpdCByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gKiAgICAgICAgIGEgbGlzdCBvZiBpbnZhbGlkIGF0dHJpYnV0ZXNcbiAqICAgICAgICAgZW1wdHkgbGlzdCBpZiBhbGwgYXR0cmlidXRlcyBhcmUgdmFsaWQsIG9yIG5vIGFyaWEgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICBcbiAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAvLyBmb3IgbXV0aXBsZSByb2xlcywgc2tpcCBpZiBhbnkgcm9sZSBpcyBpbnZhbGlkXG4gICAgbGV0IGRlZmluZWQgPSBhcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgIGlmIChkZWZpbmVkICE9PW51bGwgJiYgIWRlZmluZWQpIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBcbiAgICBsZXQgYXR0cnMgPSBbXTtcbiAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICByb2xlcyA9ICBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgXG4gICAgbGV0IGFyaWFfYXR0cnM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTsgIFxuICAgIFxuICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgLy8gQXR0cmlidXRlcyBhbGxvd2VkIG9uIHRoaXMgbm9kZVxuICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgdGFnUHJvcGVydHkpO1xuICAgIFxuICAgIGlmIChhcmlhX2F0dHJzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYV9hdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuLyogXG4gKiBnZXQgY29uZmxpY3QgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGVzXG4gKiByZXR1cm46IGEgbGlzdCBvZiBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZSBwYWlycyB0aGF0IGFyZSBjb25mbGljdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhlbGVtOiBFbGVtZW50KSB7XG4gICAgXG4gICAgbGV0IGFyaWFBdHRycyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgbGV0IGh0bWxBdHRycyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgXG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFJQVFV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaCh7J2FyaWFBdHRyJzogYXJpYUF0dHJzW2ldWyduYW1lJ10sICdodG1sQXR0cic6IGl0ZW1bJ2F0dHInXX0pO1xuICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5leHBvcnQgZnVuY3Rpb24gaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIHtcbiAgICBpZiAoIWNvbnRleHRIaWVyYXJjaGllcykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgcmV0dXJuIGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGhpZXIgPT4gW1widGFibGVcIiwgXCJncmlkXCIsIFwidHJlZWdyaWRcIl0uaW5jbHVkZXMoaGllci5yb2xlKSk7XG59XG5cbi8qIFxuICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgZGVwcmVjYXRlZCBBcmlhIHJvbGVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcHJlY2F0ZWRBcmlhUm9sZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkUm9sZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsRGVwcmVjYXRlZFJvbGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICByZXQucHVzaChyb2xlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLyogXG4gKiBnZXQgZGVwcmVjYXRlZCBBcmlhIHJvbGUtYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgZGVwcmVjYXRlZCBBcmlhIHJvbGUtYXR0cmlidXRlcyBwYXJpc1xuICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7IFxuICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PTApIHJldHVybiBbXTtcblxuICAgIGxldCByZXQgPSBbXTtcbiAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZEF0dHJpYnV0ZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2ldKSlcbiAgICAgICAgICAgIHJldC5wdXNoKHtcInJvbGVcIjpcImFueVwiLCBcImF0dHJpYnV0ZVwiOmFyaWFBdHRyc1tpXX0pO1xuICAgIH1cbiAgICBjb25zdCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgaWYgKHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlOYW1lcyAmJiBkZXByZWNhdGVkQXR0cmlOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXJpYUF0dHJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaCh7IFwicm9sZVwiOnJvbGVzW2ldLCAgXCJhdHRyaWJ1dGVcIjogYXJpYUF0dHJzW2pdfSApO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0OyBcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmV4cG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi92Mi9jb21tb24vQ29udGV4dFwiXG4vLyBpbXBvcnQgeyBTaW11bGF0b3IgfSBmcm9tIFwiLi92Mi9zaW11bGF0b3JcIlxuaW1wb3J0IHsgQ2hlY2tlciB9IGZyb20gXCIuL3Y0L2NoZWNrZXIvQ2hlY2tlclwiXG5leHBvcnQgeyBDaGVja2VyIH1cbmV4cG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmV4cG9ydCB7IENvbmZpZyB9IGZyb20gXCIuL3YyL2NvbmZpZy9Db25maWdcIjtcbmV4cG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoID0gU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgPT09IDA7XG59XG5TdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzID0gU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyB8fCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzdHIpICE9PSAtMTtcbn1cbkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyA9IEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyB8fCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzdHIpICE9PSAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/rule-server/src/static/archives/2023.10.12/js/ace-node-debug.js b/rule-server/src/static/archives/2023.10.12/js/ace-node-debug.js
new file mode 100644
index 000000000..28fac9171
--- /dev/null
+++ b/rule-server/src/static/archives/2023.10.12/js/ace-node-debug.js
@@ -0,0 +1,28727 @@
+/*!
+ * Copyright:: 2016,2017,2019,2020- IBM, Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ({
+
+/***/ 8235:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIADefinitions = void 0;
+var ARIADefinitions = /** @class */ (function () {
+ function ARIADefinitions() {
+ }
+ ARIADefinitions.nameFromContent = function (role) {
+ return (role in ARIADefinitions.designPatterns)
+ && ARIADefinitions.designPatterns[role].nameFrom
+ && ARIADefinitions.designPatterns[role].nameFrom.includes("contents");
+ };
+ /*
+ * array of WAI-ARIA global states and properties
+ * @see https://www.w3.org/TR/wai-aria-1.2/#global_states
+ */
+ ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby",
+ "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts",
+ "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription"
+ // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role
+ ,
+ 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'
+ ];
+ //properties contains id(s) that refer to other element(s)
+ ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"];
+ // deprecated roles
+ ARIADefinitions.globalDeprecatedRoles = [
+ 'directory', 'doc-biblioentry', 'doc-endnote'
+ ];
+ // the following are deprecated in ARIA 1.1 for all the roles
+ ARIADefinitions.globalDeprecatedProperties = [
+ 'aria-grabbed', 'aria-dropeffect'
+ ];
+ /*
+ * XSD data types for all WAI-ARIA properties
+ * along with valid values when the data type is NMTOKEN
+ * WAI-ARIA properties data types explaned:
+ * type: Used to identify the type of values allowed for the WAI-ARIA property
+ * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken
+ * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID
+ * true: refers to WAI-ARIA property supports hidden ID references
+ * false: refers to WAI-ARIA property does not support hidden ID references
+ * Default value will be set to false, if not specified.
+ */
+ ARIADefinitions.propertyDataTypes = {
+ "aria-activedescendant": {
+ type: "http://www.w3.org/2001/XMLSchema#idref",
+ hiddenIDRefSupported: true
+ },
+ "aria-atomic": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-autocomplete": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty
+ },
+ "aria-busy": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-checked": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "mixed", "undefined"]
+ },
+ "aria-colcount": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-colindex": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-colspan": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-controls": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-current": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value
+ },
+ "aria-describedby": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-details": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs"
+ },
+ "aria-disabled": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-dropeffect": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtokens",
+ values: ["copy", "move", "link", "execute", "popup", "none"]
+ },
+ "aria-errormessage": {
+ type: "http://www.w3.org/2001/XMLSchema#idref",
+ hiddenIDRefSupported: true
+ },
+ "aria-expanded": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-flowto": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: false
+ },
+ "aria-grabbed": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-haspopup": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"]
+ },
+ "aria-hidden": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-invalid": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value
+ },
+ "aria-keyshortcuts": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-label": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-labelledby": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-level": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-live": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["off", "polite", "assertive"]
+ },
+ "aria-modal": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-multiline": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-multiselectable": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-orientation": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["horizontal", "vertical", "undefined"]
+ },
+ "aria-owns": {
+ type: "http://www.w3.org/2001/XMLSchema#idrefs",
+ hiddenIDRefSupported: true
+ },
+ "aria-placeholder": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-posinset": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-pressed": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "mixed", "undefined"]
+ },
+ "aria-readonly": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-relevant": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtokens",
+ values: ["additions", "removals", "text", "all"]
+ },
+ "aria-required": {
+ type: "http://www.w3.org/2001/XMLSchema#boolean"
+ },
+ "aria-roledescription": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ },
+ "aria-rowcount": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-rowindex": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-rowspan": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-selected": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["true", "false", "undefined"]
+ },
+ "aria-setsize": {
+ type: "http://www.w3.org/2001/XMLSchema#int"
+ },
+ "aria-sort": {
+ type: "http://www.w3.org/2001/XMLSchema#nmtoken",
+ values: ["ascending", "descending", "other", "none"]
+ },
+ "aria-valuemax": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuemin": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuenow": {
+ type: "http://www.w3.org/2001/XMLSchema#decimal"
+ },
+ "aria-valuetext": {
+ type: "http://www.w3.org/2001/XMLSchema#string"
+ }
+ };
+ /*
+ * design patterns for concrete WAI-ARIA roles
+ * legitimate keys for each role include:
+ *
+ * - container: appropriate container(s) for that role
+ * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above)
+ * - reqProps: required states or properties for this role
+ * - reqChildren: required children for this role
+ * - htmlEquiv: HTML equivalent for this role
+ * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization)
+ * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.)
+ * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.)
+ * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s)
+ */
+ ARIADefinitions.designPatterns = {
+ "alert": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "alertdialog": {
+ container: null,
+ props: ["aria-modal"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "window",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "application": {
+ container: null,
+ props: ["aria-activedescendant", "aria-expanded"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "article": {
+ container: null,
+ props: ["aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "banner": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "blockquote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "button": {
+ container: null,
+ props: ["aria-expanded", "aria-pressed"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "button | input[@type='button']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "caption": {
+ container: ["figure", "grid", "table", "treegrid"],
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "cell": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "td",
+ roleType: "structure",
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "checkbox": {
+ container: null,
+ props: ["aria-expanded", "aria-readonly", "aria-required"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: "input[@type='checkbox']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-haspopup']
+ },
+ "code": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "columnheader": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "th[@scope='col']",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "combobox": {
+ container: null,
+ props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"],
+ reqProps: ["aria-expanded"],
+ reqChildren: [],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "complementary": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "comment": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "contentinfo": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "definition": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "deletion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "dialog": {
+ container: null,
+ props: ["aria-modal"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "window",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "directory": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecated: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "doc-abstract": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-acknowledgments": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-afterword": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-appendix": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-backlink": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-biblioentry": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-bibliography": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-biblioref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-chapter": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-colophon": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-conclusion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-cover": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "img",
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "doc-credit": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-credits": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-dedication": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-endnote": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-endnotes": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "doc-epigraph": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-epilogue": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-errata": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-example": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-footnote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-foreword": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-glossary": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-glossref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-index": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-introduction": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-noteref": {
+ container: null,
+ props: ["aria-disabled", "aria-expanded", "aria-haspopup"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-notice": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-pagebreak": {
+ container: null,
+ props: ["aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true
+ },
+ "doc-pagelist": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-pagefooter": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ },
+ "doc-pageheader": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ },
+ "doc-part": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-preface": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-prologue": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-pullquote": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-qna": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-subtitle": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author", "contents"]
+ },
+ "doc-tip": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "doc-toc": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "document": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "emphasis": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "feed": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: ["article"],
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "figure": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "form": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "form",
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "generic": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "div | span",
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "graphics-document": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "graphics-object": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: false,
+ nameFrom: ["author"]
+ },
+ "graphics-symbol": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "grid": {
+ container: null,
+ props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup"],
+ htmlEquiv: "table",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "gridcell": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "td",
+ roleType: "widget",
+ nameFrom: ["author", "contents"]
+ },
+ "group": {
+ container: null,
+ props: ["aria-activedescendant"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "heading": {
+ container: null,
+ props: null,
+ reqProps: ["aria-level"],
+ reqChildren: null,
+ htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "img": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "img",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "insertion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "link": {
+ container: null,
+ props: ["aria-expanded"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "a | link",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "list": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: ["listitem"],
+ htmlEquiv: "ol | ul",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "listbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: ["group", "option"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "listitem": {
+ container: ["list"],
+ props: ["aria-level", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "li",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "log": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "main": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "mark": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "mark",
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "marquee": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "math": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: false,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menu": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menubar": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "menuitem": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "menuitemcheckbox": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "menuitemradio": {
+ container: ["group", "menu", "menubar"],
+ props: ["aria-expanded", "aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "meter": {
+ container: null,
+ props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "navigation": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "none": {
+ container: null,
+ props: [],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "note": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "option": {
+ container: ["group", "listbox"],
+ props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "option",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "paragraph": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "presentation": {
+ container: null,
+ props: [],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "progressbar": {
+ container: null,
+ props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "radio": {
+ container: null,
+ props: ["aria-posinset", "aria-setsize"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: "input[@type='radio']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "radiogroup": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: ["radio"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "region": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "row": {
+ container: ["grid", "rowgroup", "table", "treegrid"],
+ props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: ["cell", "columnheader", "gridcell", "rowheader"],
+ htmlEquiv: "tr",
+ roleType: "structure",
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "rowgroup": {
+ container: ["grid", "table", "treegrid"],
+ props: [],
+ reqProps: null,
+ reqChildren: ["row"],
+ htmlEquiv: "tbody | tfoot | thead",
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "rowheader": {
+ container: ["row"],
+ props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "th[@scope='row']",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author", "contents"]
+ },
+ "scrollbar": {
+ container: null,
+ props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-controls", "aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "search": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "landmark",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "searchbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "input[@type='search']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "separator": {
+ container: null,
+ props: ["aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "slider": {
+ container: null,
+ props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"],
+ reqProps: ["aria-valuenow"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ presentationalChildren: true
+ },
+ "spinbutton": {
+ container: null,
+ props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "status": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "strong": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "subscript": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "suggestion": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "superscript": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "switch": {
+ container: null,
+ props: ["aria-expanded", "aria-readonly", "aria-required"],
+ reqProps: ["aria-checked"],
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-haspopup']
+ },
+ "tab": {
+ container: ["tablist"],
+ props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ presentationalChildren: true,
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ "table": {
+ container: null,
+ props: ["aria-colcount", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup", "caption"],
+ htmlEquiv: "table",
+ roleType: "structure",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tablist": {
+ container: null,
+ props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"],
+ reqProps: null,
+ reqChildren: ["tab"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: false,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tabpanel": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "term": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "dfn",
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "textbox": {
+ container: null,
+ props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: "input[@type='text']",
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"]
+ },
+ "time": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["prohibited"],
+ prohibitedProps: ["aria-label", "aria-labelledby"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "timer": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "liveRegion",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "toolbar": {
+ container: null,
+ props: ["aria-activedescendant", "aria-orientation"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tooltip": {
+ container: null,
+ props: null,
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "structure",
+ nameRequired: false,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid']
+ },
+ "tree": {
+ container: null,
+ props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"],
+ reqProps: null,
+ reqChildren: ["group", "treeitem"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "treegrid": {
+ container: null,
+ props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"],
+ reqProps: null,
+ reqChildren: ["row", "rowgroup"],
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author"],
+ deprecatedProps: ['aria-haspopup']
+ },
+ "treeitem": {
+ container: ["group", "tree"],
+ props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"],
+ reqProps: null,
+ reqChildren: null,
+ htmlEquiv: null,
+ roleType: "widget",
+ nameRequired: true,
+ nameFrom: ["author", "contents"],
+ deprecatedProps: ['aria-errormessage', 'aria-invalid']
+ },
+ }; // end designPatterns
+ // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements
+ // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary
+ ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element
+ ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types
+ ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types
+ /* https://www.w3.org/TR/html-aria/#docconformance
+ * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value
+ * documentConformanceRequirementSpecialTags contains those tags that require special considerations
+ */
+ ARIADefinitions.documentConformanceRequirement = {
+ "abbr": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "address": {
+ implicitRole: ["group"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "article": {
+ implicitRole: ["article"],
+ validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"],
+ globalAriaAttributesValid: true
+ },
+ "aside": {
+ implicitRole: ["complementary"],
+ validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"],
+ globalAriaAttributesValid: true
+ },
+ "audio": {
+ implicitRole: null,
+ validRoles: ["application"],
+ globalAriaAttributesValid: true
+ },
+ "b": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "base": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "bdi": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "bdo": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "blockquote": {
+ implicitRole: ["blockquote"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "body": {
+ implicitRole: ["generic"],
+ validRoles: null,
+ otherDisallowedAriaAttributes: ['aria-hidden'],
+ globalAriaAttributesValid: true
+ },
+ "br": {
+ implicitRole: null,
+ validRoles: ["none", "presentation"],
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ },
+ "button": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "canvas": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "caption": {
+ implicitRole: ['caption'],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ allowAttributesFromImplicitRole: false
+ },
+ "cite": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "code": {
+ implicitRole: ["code"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "col": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "colgroup": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "data": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "datalist": {
+ implicitRole: ["listbox"],
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ allowAttributesFromImplicitRole: false
+ },
+ "dd": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "del": {
+ implicitRole: ["deletion"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "details": {
+ implicitRole: ["group"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "dfn": {
+ implicitRole: ["term"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "dialog": {
+ implicitRole: ["dialog"],
+ validRoles: ["alertdialog"],
+ globalAriaAttributesValid: true
+ },
+ "dl": {
+ implicitRole: null,
+ validRoles: ["group", "list", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "dt": {
+ implicitRole: ["term"],
+ validRoles: ["listitem"],
+ globalAriaAttributesValid: true
+ },
+ "em": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "embed": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "fieldset": {
+ implicitRole: ["group"],
+ validRoles: ["none", "presentation", "radiogroup"],
+ globalAriaAttributesValid: true
+ },
+ "figcaption": {
+ implicitRole: null,
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "form": {
+ implicitRole: ["form"],
+ validRoles: ["none", "presentation", "search"],
+ globalAriaAttributesValid: true
+ },
+ "head": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "hgroup": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "h1": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h2": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h3": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h4": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h5": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "h6": {
+ implicitRole: ["heading"],
+ validRoles: ["doc-subtitle", "none", "presentation", "tab"],
+ globalAriaAttributesValid: true
+ },
+ "hr": {
+ implicitRole: ["separator"],
+ validRoles: ["doc-pagebreak", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "html": {
+ implicitRole: ["document"],
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ allowAttributesFromImplicitRole: false
+ },
+ "i": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "iframe": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "ins": {
+ implicitRole: ["insertion"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "kbd": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "label": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "legend": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "link": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "main": {
+ implicitRole: ["main"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "map": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "mark": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "math": {
+ implicitRole: ["math"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "menu": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "meta": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "meter": {
+ implicitRole: ["meter"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'],
+ allowAttributesFromImplicitRole: false
+ },
+ "nav": {
+ implicitRole: ["navigation"],
+ validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "noscript": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "object": {
+ implicitRole: null,
+ validRoles: ["application", "document", "img"],
+ globalAriaAttributesValid: true
+ },
+ "ol": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "optgroup": {
+ implicitRole: ["group"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "option": {
+ implicitRole: ["option"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-selected"]
+ },
+ "output": {
+ implicitRole: ["status"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "p": {
+ implicitRole: ["paragraph"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "param": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "picture": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ },
+ "pre": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "progress": {
+ implicitRole: ["progressbar"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-valuemax"]
+ },
+ "q": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "rp": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "rt": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "ruby": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "s": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "samp": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "script": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "search": {
+ implicitRole: ['search'],
+ validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'],
+ globalAriaAttributesValid: true
+ },
+ "slot": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "small": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "source": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "span": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "strong": {
+ implicitRole: ["strong"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "style": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "sub": {
+ implicitRole: ["subscript"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "sup": {
+ implicitRole: ["superscript"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "svg": {
+ implicitRole: ["graphics-document"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "table": {
+ implicitRole: ["table"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "template": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "textarea": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "tfoot": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "thead": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "time": {
+ implicitRole: ["time"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "title": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "track": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "u": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "ul": {
+ implicitRole: ["list"],
+ validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"],
+ globalAriaAttributesValid: true
+ },
+ "var": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true,
+ prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"]
+ },
+ "video": {
+ implicitRole: null,
+ validRoles: ["application"],
+ globalAriaAttributesValid: true
+ },
+ "wbr": {
+ implicitRole: null,
+ validRoles: ["none", "presentation"],
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden"]
+ }
+ }; // end documentConformanceRequirement
+ ARIADefinitions.documentConformanceRequirementSpecialTags = {
+ "a": {
+ "with-href": {
+ implicitRole: ["link"],
+ //roleCondition: " when non-empty href attribute is present",
+ validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-disabled=true"]
+ },
+ "without-href": {
+ implicitRole: ["generic"],
+ //roleCondition: " when href attribute is not present",
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "area": {
+ "with-href": {
+ implicitRole: ["link"],
+ //roleCondition: " when non-empty href attribute is present",
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "without-href": {
+ implicitRole: ["generic"],
+ //roleCondition: " when href attribute is not present",
+ validRoles: ["button", "link"],
+ globalAriaAttributesValid: true
+ }
+ },
+ // TODO
+ // "autonomous custom element": {
+ // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."],
+ // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"],
+ // globalAriaAttributesValid: true
+ // },
+ "div": {
+ "child-dl": {
+ implicitRole: ["generic"],
+ validRoles: ["presentation", "none"],
+ globalAriaAttributesValid: true
+ },
+ "no-child-dl": {
+ implicitRole: ["generic"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "figure": {
+ "child-figcaption": {
+ implicitRole: ["figure"],
+ validRoles: ['doc-example'],
+ globalAriaAttributesValid: true
+ },
+ "no-child-figcaption": {
+ implicitRole: ["figure"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "footer": {
+ "des-section-article-aside-main-nav": {
+ implicitRole: ["generic"],
+ //roleCondition: " when descendant of an article, aside, main, nav or section element",
+ validRoles: ["doc-footnote", "group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "other": {
+ implicitRole: ["contentinfo"],
+ //roleCondition: " when not a descendant of an article, aside, main, nav or section element",
+ validRoles: ["doc-footnote", "group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ }
+ },
+ // TODO
+ // "form-associated custom element": {
+ // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."],
+ // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"],
+ // globalAriaAttributesValid: true
+ // },
+ "header": {
+ "des-section-article-aside-main-nav": {
+ implicitRole: ["generic"],
+ //roleCondition: " when descendant of an article, aside, main, nav or section element",
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ },
+ "other": {
+ implicitRole: ["banner"],
+ //roleCondition: " when not a descendant of an article, aside, main, nav or section element",
+ validRoles: ["group", "none", "presentation"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "img": {
+ "img-with-alt-text": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute has text (is not empty)",
+ validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "img-with-empty-alt": {
+ implicitRole: ["presentation"],
+ //roleCondition: " when alt attribute is empty",
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden=true"]
+ },
+ "img-without-alt": {
+ implicitRole: ["img"],
+ //roleCondition: " when alt attribute, aria-label, or aria-labelledby are not present",
+ validRoles: null,
+ globalAriaAttributesValid: false,
+ otherAllowedAriaAttributes: ["aria-hidden=true"]
+ }
+ },
+ "input": {
+ "button": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "checkbox-with-aria-pressed": {
+ implicitRole: ["checkbox"],
+ //roleCondition: " with type=checkbox and aria-pressed attribute is present",
+ validRoles: ["button"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "checkbox-without-aria-pressed": {
+ implicitRole: ["checkbox"],
+ //roleCondition: " with type=checkbox and aria-pressed attribute is not present",
+ validRoles: ["menuitemcheckbox", "option", "switch"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "color": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "date": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "datetime-local": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "email-no-list": {
+ implicitRole: ["textbox"],
+ //roleCondition: " with type=email and no list attribute is present",
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "email-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "file": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ },
+ "hidden": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: false
+ },
+ "image": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "month": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "number": {
+ implicitRole: ["spinbutton"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ },
+ "password": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "radio": {
+ implicitRole: ["radio"],
+ validRoles: ["menuitemradio"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-required"],
+ otherDisallowedAriaAttributes: ["aria-checked"]
+ },
+ "range": {
+ implicitRole: ["slider"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"]
+ },
+ "reset": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "search-no-list": {
+ implicitRole: ["searchbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "search-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "submit": {
+ implicitRole: ["button"],
+ validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"],
+ globalAriaAttributesValid: true
+ },
+ "tel-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "tel-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "text-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: ["combobox", "searchbox", "spinbutton"],
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "text-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule
+ },
+ "time": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "url-no-list": {
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"]
+ },
+ "url-with-list": {
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "week": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-readonly"],
+ otherRolesForAttributes: ["textbox"]
+ },
+ "default-with-list": {
+ // input with a missing or invalid type, with a list attribute
+ implicitRole: ["combobox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "default-no-list": {
+ // input with a missing or invalid type, with a list attribute
+ implicitRole: ["textbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ }
+ },
+ "li": {
+ "child-of-list-role": {
+ implicitRole: ['listitem'],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "no-child-of-list-role": {
+ implicitRole: ['generic'],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "section": {
+ "with-name": {
+ implicitRole: ["region"],
+ validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"],
+ globalAriaAttributesValid: true
+ },
+ "without-name": {
+ implicitRole: null,
+ validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "select": {
+ "no-multiple-attr-size-gt1": {
+ //roleCondition: " with a multiple attribute or a size attribute having value greater than 1"
+ implicitRole: ["combobox"],
+ validRoles: ["menu"],
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-multiselectable"]
+ },
+ "multiple-attr-size-gt1": {
+ //roleCondition: " with no multiple attribute and no size attribute having value greater than 1"
+ implicitRole: ["listbox"],
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherDisallowedAriaAttributes: ["aria-multiselectable"]
+ }
+ },
+ "summary": {
+ "first-summary-of-detail": {
+ implicitRole: null,
+ validRoles: null,
+ globalAriaAttributesValid: true,
+ otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"]
+ },
+ "no-first-summary-of-detail": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "tbody": {
+ "des-table": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["rowgroup"],
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "td": {
+ "des-table": {
+ implicitRole: ["cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["gridcell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["gridcell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "th": {
+ "des-table-grid-treegrid-row-scope": {
+ implicitRole: ["rowheader", "cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-table-grid-treegrid-column-scope": {
+ implicitRole: ["columnheader", "cell"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "tr": {
+ "des-table": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-grid": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-treegrid": {
+ implicitRole: ["row"],
+ validRoles: null,
+ globalAriaAttributesValid: true
+ },
+ "des-other": {
+ implicitRole: null,
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ },
+ "default": {
+ implicitRole: null,
+ //roleCondition: "",
+ validRoles: ["any"],
+ globalAriaAttributesValid: true
+ }
+ }; // end of documentConformanceRequirementSpecialTags
+ // map aria attribute to the corresponding native attribute, apply to any element applicable
+ // note this mapping is for the related attributes in the same element without checking the parent tree.
+ // refer to https://w3c.github.io/html-aria/
+ ARIADefinitions.relatedAriaHtmlAttributes = {
+ "aria-checked": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["checked"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["checked"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-disabled": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["disabled"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["disabled"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-hidden": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["hidden"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["hidden"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-placeholder": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["placeholder"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-valuemax": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["max"],
+ htmlAttributeValues: null
+ }
+ //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead.
+ },
+ "aria-valuemin": {
+ conflict: {
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["min"],
+ htmlAttributeValues: null
+ }
+ ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead.
+ },
+ "aria-readonly": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"],
+ htmlAttributeValues: [null, "false", "false"]
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"],
+ htmlAttributeValues: [null, "true", "true"]
+ }
+ },
+ "aria-required": {
+ conflict: {
+ ariaAttributeValue: "false",
+ htmlAttributeNames: ["required"],
+ htmlAttributeValues: null
+ },
+ overlapping: {
+ ariaAttributeValue: "true",
+ htmlAttributeNames: ["required"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-colspan": {
+ conflict: {
+ // conflict occurs if both values are different
+ ariaAttributeValue: "VALUE",
+ htmlAttributeNames: ["colspan"],
+ htmlAttributeValues: ["VALUE"]
+ },
+ overlapping: {
+ // overlap occurs if both exists
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["colspan"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-rowspan": {
+ conflict: {
+ // conflict occurs if both values are different
+ ariaAttributeValue: "VALUE",
+ htmlAttributeNames: ["rowspan"],
+ htmlAttributeValues: ["VALUE"]
+ },
+ overlapping: {
+ // overlap occurs if both exists
+ ariaAttributeValue: null,
+ htmlAttributeNames: ["rowspan"],
+ htmlAttributeValues: null
+ }
+ },
+ "aria-autocomplete": {
+ conflict: {
+ // conflict occurs if both values are conflict
+ ariaAttributeValue: "none",
+ htmlAttributeNames: ["autocomplete"],
+ htmlAttributeValues: ["on"]
+ }
+ }
+ };
+ ARIADefinitions.containers = [];
+ return ARIADefinitions;
+}());
+exports.ARIADefinitions = ARIADefinitions;
+;
+var containerArray = [];
+for (var roleDesign in ARIADefinitions.designPatterns) {
+ var containers = ARIADefinitions.designPatterns[roleDesign].container;
+ if (containers !== null) {
+ for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) {
+ var container = containers_1[_i];
+ if (containerArray.indexOf(container) == -1) {
+ containerArray.push(container);
+ }
+ }
+ }
+}
+ARIADefinitions.containers = containerArray;
+
+
+/***/ }),
+
+/***/ 4944:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIAMapper = void 0;
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CommonMapper_1 = __webpack_require__(1794);
+var DOMUtil_1 = __webpack_require__(295);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIAWalker_1 = __webpack_require__(8015);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper = /** @class */ (function (_super) {
+ __extends(ARIAMapper, _super);
+ function ARIAMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ ARIAMapper.prototype.childrenCanHaveRole = function (node, role) {
+ // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ // const elem = node as Element;
+ // if (elem.getAttribute("aria-hidden") === "true") {
+ // return false;
+ // }
+ // }
+ return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren);
+ };
+ ARIAMapper.prototype.getRole = function (node) {
+ var role = ARIAMapper.nodeToRole(node);
+ return role;
+ };
+ ARIAMapper.prototype.getNamespace = function () {
+ return "aria";
+ };
+ ARIAMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem_1 = node;
+ for (var idx = 0; idx < elem_1.attributes.length; ++idx) {
+ var attrInfo = elem_1.attributes[idx];
+ var name_1 = attrInfo.name.toLowerCase();
+ if (name_1.startsWith("aria-")) {
+ retVal[name_1.substring(5)] = attrInfo.nodeValue;
+ }
+ }
+ var applyAttrRole = function (nodeName) {
+ if (!(nodeName in ARIAMapper.elemAttrValueCalculators))
+ return;
+ for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) {
+ if (!(attr in retVal)) {
+ var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr];
+ if (typeof value != "undefined" && value !== null) {
+ if (typeof value !== typeof "") {
+ value = value(elem_1);
+ }
+ retVal[attr] = value;
+ }
+ }
+ }
+ };
+ applyAttrRole("global");
+ applyAttrRole(node.nodeName.toLowerCase());
+ }
+ else if (node.nodeType === 3 /* Node.TEXT_NODE */) {
+ for (var attr in ARIAMapper.textAttrValueCalculators) {
+ var val = ARIAMapper.textAttrValueCalculators[attr](node);
+ if (typeof val != "undefined" && val !== null) {
+ retVal[attr] = val;
+ }
+ }
+ }
+ return retVal;
+ };
+ ARIAMapper.getAriaOwnedBy = function (elem) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ if (!(0, CacheUtil_1.getCache)(doc, "ARIAMapper::precalcOwned", false)) {
+ var owners = doc.querySelectorAll("[aria-owns]");
+ for (var iOwner = 0; iOwner < owners.length; ++iOwner) {
+ var owner = owners[iOwner];
+ var ownIds = owner.getAttribute("aria-owns").split(/ +/g);
+ for (var iId = 0; iId < ownIds.length; ++iId) {
+ var owned = doc.getElementById(ownIds[iId]);
+ //ignore if the aria-owns point to the element itself
+ if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) {
+ (0, CacheUtil_1.setCache)(owned, "aria-owned", owner);
+ }
+ }
+ }
+ (0, CacheUtil_1.setCache)(doc, "ARIAMapper::precalcOwned", true);
+ }
+ return (0, CacheUtil_1.getCache)(elem, "aria-owned", null);
+ };
+ ARIAMapper.prototype.getNodeHierarchy = function (node) {
+ if (!node)
+ return [];
+ if (node.nodeType !== 1) {
+ var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node));
+ var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : {
+ role: "",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ var nodeHierarchy = [];
+ // Set hierarchy
+ for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) {
+ var item = parentHierarchy_1[_i];
+ nodeHierarchy.push(item);
+ }
+ nodeHierarchy.push({
+ attributes: {},
+ bounds: this.getBounds(node),
+ namespace: this.getNamespace(),
+ node: node,
+ role: this.getRole(node) || "none",
+ rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"),
+ roleCount: {},
+ childrenCanHaveRole: parentInfo.childrenCanHaveRole
+ });
+ return nodeHierarchy;
+ }
+ else {
+ var elem = node;
+ var nodeHierarchy = (0, CacheUtil_1.getCache)(elem, "ARIAMapper::getNodeHierarchy", null);
+ if (!nodeHierarchy) {
+ // This element hasn't been processed yet - but ::reset processes them all in the right order
+ // Get details about the correct parent first
+ var parent_1 = ARIAMapper.getAriaOwnedBy(elem);
+ if (!parent_1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ while (parent_1 && parent_1.nodeType !== 1) {
+ parent_1 = DOMWalker_1.DOMWalker.parentElement(elem);
+ }
+ var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : {
+ role: "",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ while (parentInfo.role === "none" || parentInfo.role === "/none") {
+ parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1);
+ parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : [];
+ parentInfo = parentHierarchy[parentHierarchy.length - 1];
+ }
+ // Set initial node info
+ var nodeInfo = {
+ attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {},
+ bounds: this.getBounds(elem),
+ namespace: this.getNamespace(),
+ node: elem,
+ role: this.getRole(elem) || "none",
+ rolePath: "",
+ roleCount: {},
+ childrenCanHaveRole: true
+ };
+ // Adjust role if we're within a presentational container
+ var presentationalContainer = !parentInfo.childrenCanHaveRole;
+ if (presentationalContainer) {
+ nodeInfo.role = "none";
+ }
+ else {
+ nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole
+ && this.childrenCanHaveRole(elem, nodeInfo.role);
+ }
+ // Set the paths
+ if (nodeInfo.role !== "none") {
+ parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1;
+ nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]";
+ }
+ else {
+ nodeInfo.rolePath = parentInfo.rolePath;
+ }
+ // Set hierarchy
+ nodeHierarchy = [];
+ for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) {
+ var item = parentHierarchy_2[_a];
+ nodeHierarchy.push(item);
+ }
+ nodeHierarchy.push(nodeInfo);
+ (0, CacheUtil_1.setCache)(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy);
+ }
+ return nodeHierarchy;
+ }
+ };
+ ARIAMapper.prototype.reset = function (node) {
+ ARIAMapper.nameComputationId = 0;
+ this.hierarchyRole = [];
+ this.hierarchyResults = [];
+ this.hierarchyPath = [{
+ rolePath: "",
+ roleCount: {}
+ }];
+ // Get to the topmost node
+ var goodNode = node;
+ var next;
+ while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) {
+ goodNode = next;
+ }
+ ;
+ // Walk the tree and set the hierarchies in the right order
+ var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode);
+ do {
+ if (ariaWalker.node.nodeType === 1) {
+ this.getNodeHierarchy(ariaWalker.node);
+ }
+ } while (ariaWalker.nextNode());
+ };
+ ARIAMapper.prototype.openScope = function (node) {
+ if (this.hierarchyRole === null) {
+ this.reset(node);
+ }
+ this.pushHierarchy(node);
+ for (var idx = 0; idx < this.hierarchyResults.length; ++idx) {
+ if (this.hierarchyResults[idx].role[0] === "/") {
+ this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1);
+ }
+ }
+ return this.hierarchyResults;
+ };
+ ARIAMapper.prototype.pushHierarchy = function (node) {
+ // If we're not an element, no special handling
+ var nodeHierarchy = [];
+ // Determine our node info
+ nodeHierarchy = this.getNodeHierarchy(node);
+ var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1];
+ this.hierarchyRole.push(nodeInfo.role);
+ if (nodeInfo.role !== "none") {
+ this.hierarchyPath.push(nodeInfo);
+ }
+ this.hierarchyResults = nodeHierarchy;
+ };
+ ARIAMapper.prototype.closeScope = function (node) {
+ var retVal = [];
+ for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) {
+ var res = _a[_i];
+ // const temp = res.node;
+ // res.node = null;
+ // let cloned = JSON.parse(JSON.stringify(res));
+ // cloned.node = res.node = temp;
+ // retVal.push(cloned);
+ retVal.push(res);
+ }
+ if (retVal.length > 0) {
+ retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role;
+ var parent_2 = DOMWalker_1.DOMWalker.parentElement(node);
+ this.hierarchyResults = parent_2 ? (0, CacheUtil_1.getCache)(parent_2, "ARIAMapper::getNodeInfo", []) : [];
+ }
+ return retVal;
+ };
+ ARIAMapper.computeName = function (cur) {
+ ++ARIAMapper.nameComputationId;
+ return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false);
+ };
+ ARIAMapper.computeNameHelp = function (walkId, cur, labelledbyTraverse, walkTraverse) {
+ // 2g. None of the other content applies to text nodes, so just do this first
+ if (cur.nodeType === 3 /* Node.TEXT_NODE */)
+ return cur.nodeValue;
+ if (cur.nodeType === 11)
+ return "";
+ if (cur.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ if (walkTraverse || labelledbyTraverse)
+ return "";
+ throw new Error("Can only compute name on Element and Text " + cur.nodeType);
+ }
+ var elem = cur;
+ // We've been here before - prevent recursion
+ if ((0, CacheUtil_1.getCache)(elem, "data-namewalk", null) === "" + walkId)
+ return "";
+ (0, CacheUtil_1.setCache)(elem, "data-namewalk", "" + walkId);
+ // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element
+ // 2a. Only show hidden content if it's referenced by a labelledby
+ if (!labelledbyTraverse && !DOMWalker_1.DOMWalker.isNodeVisible(cur)) {
+ return "";
+ }
+ // 2b. collect valid id references
+ if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) {
+ var labelledby = elem.getAttribute("aria-labelledby").split(" ");
+ var validElems = [];
+ for (var _i = 0, labelledby_1 = labelledby; _i < labelledby_1.length; _i++) {
+ var ref = labelledby_1[_i];
+ var refElem = fragment_1.FragmentUtil.getById(cur, ref);
+ if (refElem && !DOMUtil_1.DOMUtil.sameNode(elem, refElem)) {
+ validElems.push(refElem);
+ }
+ }
+ if (validElems.length > 0) {
+ var accumulated = "";
+ for (var _a = 0, validElems_1 = validElems; _a < validElems_1.length; _a++) {
+ var elem_2 = validElems_1[_a];
+ accumulated += " " + this.computeNameHelp(walkId, elem_2, true, false);
+ }
+ return accumulated.trim();
+ }
+ }
+ // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases
+ if (["section", "form"].includes(cur.nodeName.toLowerCase())) {
+ if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) {
+ // If I'm not an embedded control or I'm not recursing, return the aria-label
+ if (!labelledbyTraverse && !walkTraverse) {
+ return elem.getAttribute("aria-label").trim();
+ }
+ }
+ if (elem.hasAttribute("title")) {
+ return elem.getAttribute("title");
+ }
+ return "";
+ }
+ // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label
+ var role = ARIAMapper.nodeToRole(cur);
+ var isEmbeddedControl = [
+ "textbox", "button", "combobox", "listbox",
+ "progressbar", "scrollbar", "slider", "spinbutton"
+ ].includes(role);
+ if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) {
+ // If I'm not an embedded control or I'm not recursing, return the aria-label
+ if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) {
+ return elem.getAttribute("aria-label").trim();
+ }
+ }
+ // 2d.
+ if (role !== "presentation" && role !== "none") {
+ if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) {
+ return DOMUtil_1.DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim();
+ }
+ if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) {
+ var label = elem.ownerDocument.querySelector("label[for='" + elem.getAttribute("id") + "']");
+ if (label) {
+ if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !legacy_1.RPTUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) {
+ return this.computeNameHelp(walkId, label, false, false);
+ }
+ else {
+ return label.textContent;
+ }
+ }
+ }
+ if (cur.nodeName.toLowerCase() === "fieldset") {
+ if (cur.querySelector("legend")) {
+ var legend = cur.querySelector("legend");
+ return legend.innerText;
+ }
+ else {
+ return this.computeNameHelp(walkId, cur, false, false);
+ }
+ }
+ }
+ // 2e.
+ if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) {
+ // If the embedded control has role textbox, return its value.
+ if (role === "textbox") {
+ if (elem.nodeName.toLowerCase() === "input") {
+ if (elem.hasAttribute("value"))
+ return elem.getAttribute("value");
+ }
+ else {
+ walkTraverse = false;
+ }
+ }
+ // If the embedded control has role button, return the text alternative of the button.
+ if (role === "button") {
+ if (elem.nodeName.toLowerCase() === "input") {
+ var type = elem.getAttribute("type").toLowerCase();
+ if (["button", "submit", "reset"].includes(type)) {
+ if (elem.hasAttribute("value"))
+ return elem.getAttribute("value");
+ if (type === "submit")
+ return "Submit";
+ if (type === "reset")
+ return "Reset";
+ }
+ }
+ else {
+ walkTraverse = false;
+ }
+ }
+ // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option.
+ if (role === "combobox") {
+ if (elem.hasAttribute("aria-activedescendant")) {
+ var selected = fragment_1.FragmentUtil.getById(elem, "aria-activedescendant");
+ if (selected && !DOMUtil_1.DOMUtil.sameNode(elem, selected)) {
+ return ARIAMapper.computeNameHelp(walkId, selected, false, false);
+ }
+ }
+ }
+ // If the embedded control has role range (e.g., a spinbutton or slider):
+ if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) {
+ // If the aria-valuetext property is present, return its value,
+ if (elem.hasAttribute("aria-valuetext"))
+ return elem.getAttribute("aria-valuetext");
+ // Otherwise, if the aria-valuenow property is present, return its value,
+ if (elem.hasAttribute("aria-valuenow"))
+ return elem.getAttribute("aria-valuenow");
+ // TODO: Otherwise, use the value as specified by a host language attribute.
+ }
+ }
+ // 2f. 2h.
+ if (walkTraverse || ARIADefinitions_1.ARIADefinitions.nameFromContent(role) || labelledbyTraverse) {
+ // 2fi. Set the accumulated text to the empty string.
+ var accumulated = "";
+ // 2fii. Check for CSS generated textual content associated with the current node and
+ // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2]
+ // can provide textual content for elements that have a content model.
+ // For :before pseudo elements, User agents MUST prepend CSS textual content, without
+ // a space, to the textual content of the current node.
+ // For :after pseudo elements, User agents MUST append CSS textual content, without a
+ // space, to the textual content of the current node.
+ var before = null;
+ before = elem.ownerDocument.defaultView.getComputedStyle(elem, "before").content;
+ if (before && before !== "none") {
+ before = before.replace(/^"/, "").replace(/"$/, "");
+ accumulated += before;
+ }
+ // 2fiii. For each child node of the current node:
+ // Set the current node to the child node.
+ // Compute the text alternative of the current node beginning with step 2. Set the result
+ // to that text alternative.
+ // Append the result to the accumulated text.
+ if (elem.nodeName.toUpperCase() === "SLOT") {
+ //if no assignedNode, check its own text
+ if (!elem.assignedNodes() || elem.assignedNodes().length === 0) {
+ var innerText = legacy_1.RPTUtil.getInnerText(elem);
+ if (innerText && innerText !== null && innerText.trim().length > 0)
+ accumulated += " " + innerText;
+ }
+ else {
+ // check text from all assigned nodes
+ for (var _b = 0, _c = elem.assignedNodes(); _b < _c.length; _b++) {
+ var slotChild = _c[_b];
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ }
+ }
+ }
+ else {
+ var walkChild = elem.firstChild;
+ while (walkChild) {
+ var nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true);
+ accumulated += " " + nextChildContent;
+ walkChild = walkChild.nextSibling;
+ }
+ }
+ var after = null;
+ try {
+ after = elem.ownerDocument.defaultView.getComputedStyle(elem, "after").content;
+ }
+ catch (e) { }
+ if (after && after !== "none") {
+ after = after.replace(/^"/, "").replace(/"$/, "");
+ accumulated += after;
+ }
+ // 2fiv. Return the accumulated text.
+ accumulated = accumulated.replace(/\s+/g, " ").trim();
+ if (accumulated.trim().length > 0) {
+ return accumulated;
+ }
+ }
+ // 2i. Otherwise, if the current node has a Tooltip attribute, return its value.
+ if (elem.hasAttribute("title")) {
+ return elem.getAttribute("title");
+ }
+ if (elem.tagName.toLowerCase() === "svg") {
+ var title = elem.querySelector("title");
+ if (title) {
+ return title.textContent || title.innerText;
+ }
+ }
+ return "";
+ };
+ /* if (role in ARIADefinitions.designPatterns
+ && ARIADefinitions.designPatterns[role].nameFrom
+ && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"))
+ {
+ name = elem.textContent;
+ }
+ if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) {
+ name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent;
+ }
+ if (elem.hasAttribute("aria-label")) {
+ name = elem.getAttribute("aria-label");
+ }
+ if (elem.hasAttribute("aria-labelledby")) {
+ name = "";
+ const ids = elem.getAttribute("aria-labelledby").split(" ");
+ for (const id of ids) {
+ name += FragmentUtil.getById(elem, id).textContent + " ";
+ }
+ name = name.trim();
+ }
+ return name;
+ }*/
+ ARIAMapper.nodeToRole = function (node) {
+ if (node.nodeType === 3 /* Node.TEXT_NODE */) {
+ return "text";
+ }
+ else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ return null;
+ }
+ var elem = node;
+ if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ return null;
+ }
+ if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) {
+ var roleStr = elem.getAttribute("role").trim();
+ var roles_2 = roleStr.split(" ");
+ for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) {
+ var role = roles_1[_i];
+ if (role === "presentation" || role === "none") {
+ // If element is focusable, then presentation roles are to be ignored
+ if (!legacy_1.RPTUtil.isFocusable(elem)) {
+ return null;
+ }
+ }
+ else if (role in ARIADefinitions_1.ARIADefinitions.designPatterns) {
+ return role;
+ }
+ }
+ }
+ //return this.elemToImplicitRole(elem);
+ var roles = legacy_1.RPTUtil.getImplicitRole(elem);
+ return !roles || roles.length === 0 ? null : roles[0];
+ };
+ ////////////////////////////////////////////////////////////////////////////
+ // Helper functions
+ ////
+ // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis
+ ARIAMapper.elemAttrValueCalculators = {
+ "global": {
+ "name": ARIAMapper.computeName
+ },
+ "datalist": {
+ // set to "true" if the datalist's selection model allows multiple option elements to be
+ // selected at a time, and "false" otherwise
+ "multiselectable": function (elem) {
+ var id = elem.getAttribute("id");
+ if (id && id.length > 0) {
+ var input = elem.ownerDocument.querySelector("input[list='" + id + "']");
+ return "" + (elem.getAttribute("multiple")
+ && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == ""));
+ }
+ return null;
+ }
+ },
+ "h1": {
+ "level": "1"
+ },
+ "h2": {
+ "level": "2"
+ },
+ "h3": {
+ "level": "3"
+ },
+ "h4": {
+ "level": "4"
+ },
+ "h5": {
+ "level": "5"
+ },
+ "h6": {
+ "level": "6"
+ },
+ "input": {
+ // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute
+ // is true, or "true" if the element's checkedness is true, or "false" otherwise
+ // - type="radio" state set to "true" if the element's checkedness is true, or "false"
+ // otherwise.
+ "checked": function (elem) {
+ if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") {
+ return "" + elem.checked;
+ }
+ return null;
+ }
+ // - type="radio" and not in menu reflecting number of type=radio input elements
+ // within the radio button group
+ ,
+ "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ // - type="radio" and not in menu value reflecting the elements position
+ // within the radio button group."
+ ,
+ "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a
+ // suggestions source element) combobox role, with the aria-owns property set to the same
+ // value as the list attribute
+ ,
+ "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); }
+ },
+ "keygen": {
+ "multiselectable": "false"
+ },
+ "li": {
+ // Number of li elements within the ol, ul, menu
+ "setsize": function (elem) {
+ var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]);
+ if (!parent)
+ return null;
+ var lis = parent.querySelectorAll("li");
+ var otherlis = parent.querySelectorAll("ol li, ul li, menu li");
+ return "" + (lis.length - otherlis.length);
+ }
+ // Position of li element within the ol, ul, menu
+ ,
+ "posinset": function (elem) {
+ var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]);
+ if (!parent)
+ return null;
+ var lis = parent.querySelectorAll("li");
+ var num = 0;
+ for (var idx = 0; idx < lis.length; ++idx) {
+ var li = lis[idx];
+ if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) {
+ return "" + num;
+ }
+ ++num;
+ }
+ return null;
+ }
+ },
+ "menuitem": {
+ // type = checkbox or radio, set to "true" if the checked attribute
+ // is present, and "false" otherwise
+ "checked": function (elem) { return "" + !!(elem.getAttribute("checked")
+ && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); }
+ },
+ "option": {
+ // set to "true" if the element's selectedness is true, or "false" otherwise.
+ "selected": function (elem) { return "" + !!(elem.getAttribute("selected")
+ && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); }
+ },
+ "progress": {
+ "valuemax": function (elem) { return elem.getAttribute("max") || "1"; },
+ "valuemin": function (elem) { return "0"; },
+ "valuenow": function (elem) { return elem.getAttribute("value"); }
+ }
+ };
+ ARIAMapper.textAttrValueCalculators = {
+ "name": function (node) { return node.nodeValue; }
+ };
+ ARIAMapper.nameComputationId = 0;
+ return ARIAMapper;
+}(CommonMapper_1.CommonMapper));
+exports.ARIAMapper = ARIAMapper;
+
+
+/***/ }),
+
+/***/ 8015:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ARIAWalker = void 0;
+var fragment_1 = __webpack_require__(482);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+/**
+ * Walks in an ARIA order
+ *
+ * See also ../dom/DOMWalker
+ */
+var ARIAWalker = /** @class */ (function () {
+ function ARIAWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ this.bEndTag = (bEnd == undefined ? false : bEnd == true);
+ }
+ ARIAWalker.prototype.atRoot = function () {
+ if (this.ownerElement)
+ return false;
+ if (this.root === this.node) {
+ return true;
+ }
+ else if (this.root.isSameNode) {
+ return this.root.isSameNode(this.node);
+ }
+ else if (this.root.compareDocumentPosition) {
+ return this.root.compareDocumentPosition(this.node) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return this.node.parentNode === null;
+ }
+ };
+ ARIAWalker.prototype.nextNode = function () {
+ var skipOwned = false;
+ do {
+ skipOwned = false;
+ // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id"));
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ //TODO: need to conside its own content, a slot may have its own content or assigned content
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.slotOwner) {
+ var slotOwner = this.node.slotOwner;
+ var nextSlotIndex = this.node.slotIndex + 1;
+ delete this.node.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ skipOwned = true;
+ }
+ else if (this.node.parentNode) {
+ if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) {
+ var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g);
+ if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) {
+ this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]);
+ this.bEndTag = false;
+ }
+ else {
+ var idx = ownIds.indexOf(this.node.getAttribute("id"));
+ if (idx === ownIds.length - 1) {
+ // last one
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ // grab next
+ this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]);
+ this.bEndTag = false;
+ }
+ }
+ }
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")
+ || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node)));
+ return true;
+ };
+ ARIAWalker.prototype.prevNode = function () {
+ do {
+ if (this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker_1.DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return ARIAWalker;
+}());
+exports.ARIAWalker = ARIAWalker;
+
+
+/***/ }),
+
+/***/ 9193:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.AncestorUtil = void 0;
+var AncestorUtil = /** @class */ (function () {
+ function AncestorUtil() {
+ }
+ AncestorUtil.isPresentationFrame = function (contextHierarchy) {
+ if (contextHierarchy && contextHierarchy.dom) {
+ // Skip current node because we want ancestry
+ for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) {
+ var elem = contextHierarchy.dom[idx].node;
+ if (elem.nodeType === 1
+ && elem.nodeName.toLowerCase() === "iframe"
+ && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ AncestorUtil.isFrame = function (contextHierarchy) {
+ if (contextHierarchy && contextHierarchy.dom) {
+ // Skip current node because we want ancestry
+ for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) {
+ var elem = contextHierarchy.dom[idx].node;
+ if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ return AncestorUtil;
+}());
+exports.AncestorUtil = AncestorUtil;
+
+
+/***/ }),
+
+/***/ 482:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.FragmentUtil = void 0;
+var FragmentUtil = /** @class */ (function () {
+ function FragmentUtil() {
+ }
+ FragmentUtil.getOwnerFragment = function (node) {
+ var n = node;
+ while (n.parentNode && (n = n.parentNode)) {
+ if (n.nodeType === 11) {
+ return n;
+ }
+ }
+ return node.ownerDocument;
+ };
+ FragmentUtil.getById = function (node, id) {
+ return this.getOwnerFragment(node).getElementById(id);
+ };
+ FragmentUtil.getAncestor = function (hierarchies, elemName) {
+ var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; });
+ return matches.length > 0 && matches[0].node || null;
+ };
+ FragmentUtil.getAncestorWithRole = function (hierarchies, role) {
+ var matches = hierarchies["aria"].filter(function (info) { return info.role === role; });
+ return matches.length > 0 && matches[0].node || null;
+ };
+ return FragmentUtil;
+}());
+exports.FragmentUtil = FragmentUtil;
+
+
+/***/ }),
+
+/***/ 2527:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2021- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.LangUtil = void 0;
+// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
+var validPrimaryLangs = [
+ ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"],
+ ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"],
+ ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"],
+ ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"],
+ ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"],
+ ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"],
+ ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"],
+ ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"],
+ ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"],
+ ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"],
+ ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"],
+ ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"],
+ ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"],
+ ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"],
+ ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"],
+ ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"],
+ ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"],
+ ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"],
+ ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"],
+ ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"],
+ ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"],
+ ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"],
+ ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"],
+ ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"],
+ ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"],
+ ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"]
+];
+var LangUtil = /** @class */ (function () {
+ function LangUtil() {
+ }
+ /* Determine if given string is a valid BCP 47 string */
+ LangUtil.isBcp47 = function (langStr) {
+ return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr);
+ };
+ LangUtil.validPrimaryLang = function (langStr) {
+ var primary = langStr.toLowerCase();
+ if (primary.includes("-")) {
+ primary = primary.split("-")[0];
+ }
+ if (!primary.match(/[a-z]{2,3}/))
+ return false;
+ // qaa..qtz
+ if (primary.length === 3
+ && primary.charAt(0) === "q"
+ && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116
+ && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) {
+ }
+ return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary);
+ };
+ LangUtil.matchPrimaryLang = function (lang1, lang2) {
+ var primary1 = lang1;
+ if (primary1.includes("-")) {
+ primary1 = primary1.split("-")[0];
+ }
+ var primary2 = lang2;
+ if (primary2.includes("-")) {
+ primary2 = primary2.split("-")[0];
+ }
+ return primary1.toLowerCase() === primary2.toLowerCase();
+ };
+ return LangUtil;
+}());
+exports.LangUtil = LangUtil;
+
+
+/***/ }),
+
+/***/ 8422:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.NodeWalker = exports.RPTUtil = void 0;
+var CacheUtil_1 = __webpack_require__(7788);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+var fragment_1 = __webpack_require__(482);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMUtil_1 = __webpack_require__(295);
+var RPTUtil = /** @class */ (function () {
+ function RPTUtil() {
+ }
+ RPTUtil.isDefinedAriaAttributeAtIndex = function (ele, index) {
+ var attrName = ele.attributes[index].name;
+ return RPTUtil.isDefinedAriaAttribute(ele, attrName);
+ };
+ /**
+ * this method returns user-defined aria attribute name from dom
+ * @param ele element
+ * @returns user defined aria attributes
+ */
+ RPTUtil.getUserDefinedAriaAttributes = function (elem) {
+ var ariaAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (isAria)
+ ariaAttributes.push(attrName);
+ }
+ }
+ return ariaAttributes;
+ };
+ /**
+ * this method returns user-defined html attribute name from dom
+ * @param ele element
+ * @returns user defined html attributes
+ */
+ RPTUtil.getUserDefinedHtmlAttributes = function (elem) {
+ var htmlAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (!isAria)
+ htmlAttributes.push(attrName);
+ }
+ }
+ return htmlAttributes;
+ };
+ /**
+ * this method returns user-defined aria attribute name-value pair from dom
+ * @param ele element
+ * @returns user defined aria attributes
+ */
+ RPTUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) {
+ var ariaAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = elem.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (isAria)
+ ariaAttributes.push({ name: attrName, value: attrValue });
+ }
+ }
+ return ariaAttributes;
+ };
+ /**
+ * this method returns user-defined html attribute name-value pair from dom
+ * @param ele element
+ * @returns user defined html attributes
+ */
+ RPTUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) {
+ var htmlAttributes = [];
+ var domAttributes = elem.attributes;
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = elem.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ var isAria = attrName.substring(0, 5) === 'aria-';
+ if (!isAria)
+ htmlAttributes.push({ name: attrName, value: attrValue });
+ }
+ }
+ return htmlAttributes;
+ };
+ /**
+ * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true"
+ */
+ RPTUtil.getAriaAttribute = function (ele, attributeName) {
+ // If the attribute is defined, it takes precedence
+ var retVal = ele.getAttribute(attributeName);
+ if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check
+ return retVal;
+ }
+ // Then determine implicit values from other attributes
+ if (!retVal) {
+ var tag = ele.nodeName.toLowerCase();
+ if (attributeName in RPTUtil.ariaAttributeImplicitMappings) {
+ if (tag in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName][tag];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ else if ("*" in RPTUtil.ariaAttributeImplicitMappings[attributeName]) {
+ retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName]["*"];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ }
+ }
+ // Check role-based defaults
+ if (!retVal) {
+ var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele);
+ if (role in RPTUtil.ariaAttributeRoleDefaults && attributeName in RPTUtil.ariaAttributeRoleDefaults[role]) {
+ retVal = RPTUtil.ariaAttributeRoleDefaults[role][attributeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(ele);
+ }
+ }
+ }
+ // Still not defined? Check global defaults
+ if (!retVal && attributeName in RPTUtil.ariaAttributeGlobalDefaults) {
+ retVal = RPTUtil.ariaAttributeGlobalDefaults[attributeName];
+ }
+ return retVal;
+ };
+ RPTUtil.wordCount = function (str) {
+ str = str.trim();
+ if (str.length === 0)
+ return 0;
+ return str.split(/\s+/g).length;
+ };
+ /**
+ * Note that this only detects if the element itself is in the tab order.
+ * However, this element may delegate focus to another element via aria-activedescendant
+ * Also, focus varies by browser... sticking to things that are focusable on chrome and firefox
+ */
+ RPTUtil.isTabbable = function (element) {
+ // Using https://allyjs.io/data-tables/focusable.html
+ // Handle the explicit cases first
+ if (!VisUtil_1.VisUtil.isNodeVisible(element))
+ return false;
+ if (element.hasAttribute("tabindex")) {
+ return parseInt(element.getAttribute("tabindex")) >= 0;
+ }
+ // Explicit cases handled - now the implicit
+ var nodeName = element.nodeName.toLowerCase();
+ if (nodeName in RPTUtil.tabTagMap) {
+ var retVal = RPTUtil.tabTagMap[nodeName];
+ if (typeof (retVal) === "function") {
+ retVal = retVal(element);
+ }
+ return retVal;
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.tabIndexLEZero = function (elem) {
+ if (RPTUtil.hasAttribute(elem, "tabindex")) {
+ if (elem.getAttribute("tabindex").match(/^-?\d+$/)) {
+ var tabindexValue = parseInt(elem.getAttribute("tabindex"));
+ return tabindexValue === 0 || tabindexValue === -1;
+ }
+ }
+ return false;
+ };
+ /**
+ * get number of tabbable children
+ * @param element
+ */
+ RPTUtil.getTabbableChildren = function (element) {
+ var count = 0;
+ // If node has children, look for tab stops in the children
+ if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") {
+ var nw = new NodeWalker(element);
+ while (nw.nextNode() && nw.node != element) {
+ if (nw.node.nodeType == 1 && !nw.bEndTag && RPTUtil.isTabbable(nw.node)) {
+ ++count;
+ }
+ }
+ }
+ return count;
+ };
+ //TODO: function does not handle equivalents for roles: row, link, header, button
+ // But it may not have to. Bug reports have been about radio buttons and checkboxes.
+ RPTUtil.isHtmlEquiv = function (node, htmlEquiv) {
+ var retVal = false;
+ if (node) {
+ var nodeName = node.nodeName.toLowerCase();
+ if (nodeName === "input") {
+ var type = node.getAttribute("type").toLowerCase();
+ if (type) {
+ if (htmlEquiv.indexOf("checkbox") != -1) {
+ retVal = type === "checkbox";
+ }
+ else if (htmlEquiv.indexOf("radio") != -1) {
+ retVal = type === "radio";
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ RPTUtil.isDefinedAriaAttribute = function (ele, attrName) {
+ var isDefinedAriaAttribute = false;
+ if (attrName.substring(0, 5) === 'aria-') {
+ // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute.
+ isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0;
+ }
+ return isDefinedAriaAttribute;
+ };
+ RPTUtil.normalizeSpacing = function (s) {
+ return s.trim().replace(/\s+/g, ' ');
+ };
+ ;
+ RPTUtil.nonExistantIDs = function (node, targetids) {
+ var returnnotfoundids = '';
+ if (RPTUtil.normalizeSpacing(targetids).length < 1)
+ return returnnotfoundids;
+ var targetArray = targetids.split(" ");
+ var doc = node.ownerDocument;
+ for (var i = 0; i < targetArray.length; i++) {
+ var xp = "//*[@id='" + targetArray[i] + "']";
+ var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ if (!r)
+ returnnotfoundids += targetArray[i] + ', ';
+ }
+ if (RPTUtil.normalizeSpacing(returnnotfoundids).length >= 2)
+ returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2);
+ else
+ returnnotfoundids = '';
+ return returnnotfoundids;
+ };
+ RPTUtil.getDocElementsByTag = function (elem, tagName) {
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(elem);
+ tagName = tagName.toLowerCase();
+ var cache = (0, CacheUtil_1.getCache)(doc, "RPT_DOCELEMSBYTAG", {});
+ if (!(tagName in cache)) {
+ cache[tagName] = doc.querySelectorAll(tagName);
+ (0, CacheUtil_1.setCache)(doc, "RPT_DOCELEMSBYTAG", cache);
+ }
+ return cache[tagName];
+ };
+ /**
+ * This function is responsible for get a list of all the child elemnts which match the tag
+ * name provided.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getChildByTagHidden
+ *
+ * @parm {element} parentElem - The parent element
+ * @parm {string} tagName - The tag to search for under the parent element
+ * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list
+ * false if the hidden elements should be added
+ *
+ * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getChildByTag = function (parentElem, tagName) {
+ return RPTUtil.getChildByTagHidden(parentElem, tagName, false, false);
+ };
+ /**
+ * This function is responsible for get a list of all the child elemnts which match the tag
+ * name provided.
+ *
+ * @parm {element} parentElem - The parent element
+ * @parm {string} tagName - The tag to search for under the parent element
+ * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list
+ * false if the hidden elements should be added
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ *
+ * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) {
+ // Variable Decleration
+ var retVal = [];
+ var child = parentElem.firstChild;
+ // Loop over all the child elements of the parent to build a list of all the elements that
+ // match the tagName provided
+ while (child != null) {
+ // Only include the children into the return array if they match with tagname.
+ if (child.nodeName.toLowerCase() === tagName) {
+ // In the case that ignorehidden was set to true, then perform a isNodeVisible check
+ // and in the case the node is not visilble we more to theses then move to the next node.
+ // Perform a couple of checks to determine if hidden elements should be ignored or not.
+ // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible
+ // 2. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ if ((ignoreHidden || (considerHiddenSetting && !RPTUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) {
+ // Move on to the next element
+ child = child.nextSibling;
+ continue;
+ }
+ // Push the element
+ retVal.push(child);
+ }
+ // Move to the next sibling element
+ child = child.nextSibling;
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for finding a list of elements that match given roles(s).
+ * This function by defauly will not consider Check Hidden Setting at all.
+ * This function by defauly will not consider implicit roles.
+ * Note: This is a wrapper function to: RPTUtil.getElementsByRoleHidden
+ *
+ * @parm {document} doc - The document node
+ * @parm {list or string} roles - List or single role for which to return elements based on.
+ *
+ * @return {List} retVal - list of all the elements which matched the role(s) that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getElementsByRole = function (doc, roles) {
+ return RPTUtil.getElementsByRoleHidden(doc, roles, false, false);
+ };
+ /**
+ * This function is responsible for finding a list of elements that match given roles(s).
+ * This function aslo finds elements with implicit roles.
+ * This function will also consider elements that are hidden based on the if the Check
+ * Hidden Content settings should be considered or not.
+ *
+ * @parm {document} doc - The document node
+ * @parm {list or string} roles - List or single role for which to return elements based on.
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} retVal - list of all the elements which matched the role(s) that were provided.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) {
+ // In the case that the role to element assoication is already made, and available in the global hasAttribute
+ // we can just use that one instead of building a new one.
+ var roleToElems = null;
+ if (considerImplicitRoles) {
+ roleToElems = (0, CacheUtil_1.getCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", null);
+ }
+ else {
+ roleToElems = (0, CacheUtil_1.getCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE", null);
+ }
+ // Build the new role to element, this is where we loop through all the elements and extract all the
+ // elements bsaed on roles.
+ if (roleToElems === null) {
+ // Re-initialize the roleToElems hash
+ roleToElems = {};
+ // Get the body of the doc
+ var root = doc.body;
+ // Keep looping until we are at the very parent node of the entire page, so that we can loop through
+ // all the nodes.
+ while (DOMWalker_1.DOMWalker.parentNode(root) !== null) {
+ // Get the parentNode
+ root = DOMWalker_1.DOMWalker.parentNode(root);
+ }
+ // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes
+ // and build the roles to Element coralation
+ var nw = new NodeWalker(root);
+ // Loop over the entire doc/list of nodes to build the role to element map
+ // Note: This will build an roleToElems hash which is in the following format.
+ // roleToElems = {
+ // document: [{div},{abbr},{var}],
+ // main: [{div}],
+ // navigation: [{div}]
+ // }
+ while (nw.nextNode()) {
+ if (!nw.elem())
+ continue;
+ // Only check the elements which have the role attribute assiciated to them
+ if (!nw.bEndTag) {
+ var wRoles = [];
+ //check if the node has role attributes
+ if (nw.elem() && nw.elem().hasAttribute("role")) {
+ // Extract all the roles that are assigned to this element, can have multiple roles on one
+ // element split by space, so we need to extract all of them into an array.
+ wRoles = nw.elem().getAttribute("role").split(" ");
+ }
+ if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) {
+ //check if there are any implicit roles for this element.
+ var implicitRole = RPTUtil.getImplicitRole(nw.node);
+ if (implicitRole !== null && implicitRole.length > 0)
+ wRoles = implicitRole;
+ }
+ if (wRoles.length === 0) {
+ continue;
+ }
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Loop through all the roles and assigned this node to all thes roles
+ for (var i = 0; i < wRoles.length; ++i) {
+ // In the case that the role key is not already in the roleToElems hash, construct the
+ // add the key and assign empty array.
+ if (!(wRoles[i] in roleToElems)) {
+ roleToElems[wRoles[i]] = [];
+ }
+ // Add the node to the array for the role
+ roleToElems[wRoles[i]].push(nw.node);
+ }
+ }
+ }
+ // Set the roleToElems hash map as a global variable
+ if (considerImplicitRoles) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems);
+ }
+ else {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_GETELEMENTSBY_ROLE", roleToElems);
+ }
+ }
+ // Initilize the return value
+ var retVal = [];
+ // Handle the cases where the provided role is a string and not an array,
+ // for this case we take the string and put it into an array
+ if (typeof (roles) === "string") {
+ var role = roles;
+ roles = [];
+ roles.push(role);
+ }
+ // Loop through the roles that were provided and find the list of elements for this roles
+ // and add them to the return value.
+ if (roles.length) {
+ // loop over all the roles
+ for (var i = 0; i < roles.length; ++i) {
+ // Extract the role from the array
+ var nextRole = roles[i];
+ // Fetch the list of all the elements for this role
+ var copyRoles = roleToElems[nextRole];
+ // If there are elements to copy to another array, then perform the copy
+ if (copyRoles) {
+ // Loop over all the elements which are to be copied
+ for (var j = 0; j < copyRoles.length; ++j) {
+ // Add this element to the return val
+ retVal.push(copyRoles[j]);
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for retrieving user defined element's roles from dom.
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return {List} roles - list of user defined roles in the element role attribute.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getUserDefinedRoles = function (ele) {
+ return RPTUtil.getRoles(ele, false);
+ };
+ /**
+ * This function is responsible for retrieving element's roles.
+ * This function also finds implicit roles.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} roles - list of attribute roles and implicit roles.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getRoles = function (ele, considerImplicitRoles) {
+ var roles = [];
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ var attrRoles = RPTUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" ");
+ for (var i = 0; i < attrRoles.length; ++i) {
+ roles.push(attrRoles[i]);
+ }
+ }
+ //check if implicit roles exist.
+ //Note: element can have multiple implicit roles
+ if (considerImplicitRoles) {
+ var implicitRole = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ //add implicit roles to the attributes roles.
+ RPTUtil.concatUniqueArrayItemList(implicitRole, roles);
+ }
+ }
+ return roles;
+ };
+ /**
+ * Returns the implicit role of the elemement
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return the implicit role or [] if doesn't exist
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getImplicitRole = function (ele) {
+ if (!ele || ele.nodeType !== 1)
+ return [];
+ var implicitRoles = (0, CacheUtil_1.getCache)(ele, "RPTUtil_ImplicitRole", null);
+ if (!implicitRoles) {
+ var tagProperty = RPTUtil.getElementAriaProperty(ele);
+ // check if there are any implicit roles for this element.
+ if (tagProperty && tagProperty.implicitRole) {
+ if (tagProperty.implicitRole.includes("generic")) {
+ // the 'generic' role is only allowed if a valid aria attribute exists.
+ var domAriaAttributes_1 = RPTUtil.getUserDefinedAriaAttributes(ele);
+ if (domAriaAttributes_1.length === 0) {
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", []);
+ return [];
+ }
+ var roleAttributes = [];
+ var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic'];
+ if (pattern.reqProps && pattern.reqProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes);
+ if (tagProperty.globalAriaAttributesValid)
+ RPTUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes);
+ if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0)
+ RPTUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes);
+ // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes
+ if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) {
+ var implicit = RPTUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole);
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", implicit);
+ return implicit;
+ }
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", tagProperty.implicitRole);
+ return tagProperty.implicitRole;
+ }
+ (0, CacheUtil_1.setCache)(ele, "RPTUtil_ImplicitRole", []);
+ return [];
+ }
+ return implicitRoles;
+ };
+ /**
+ * Returns the required properties of the role
+ * @parm {string} role - the role
+ * @parm {HTMLElement} ele - element for which to find role.
+ *
+ * @return {List} properties - list of properties that are required by the role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getRoleRequiredProperties = function (role, ele) {
+ if (role === null) {
+ return null;
+ }
+ if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) {
+ var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps;
+ // handle special case of separator
+ if (role.toLowerCase() === "separator" && ele && RPTUtil.isFocusable(ele)) {
+ requiredAttributes = RPTUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []);
+ }
+ return requiredAttributes;
+ }
+ else {
+ return null;
+ }
+ };
+ /**
+ * Test if the ele node is focusable
+ */
+ RPTUtil.isFocusable = function (ele) {
+ if (ele === "undefined" || ele === null) {
+ return false;
+ }
+ return RPTUtil.isTabbable(ele);
+ };
+ /**
+ * This function is responsible for finding if a element has given role.
+ * This function aslo finds if element has given roles as implicit role.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {list or string} roles - List or single role for which to find if element has these roles.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {List} retVal - true or false based on if th element has the specified role.
+ *
+ * @memberOf RPTUtil
+ *
+ * Consider to use hasRoleInSemantics() instead.
+ */
+ RPTUtil.hasRole = function (ele, role, considerImplicitRoles) {
+ var retVal = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ if (typeof (role) != typeof ("")) {
+ var roles = ele.getAttribute("role").trim().split(" ");
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ retVal = roles[i] in role;
+ }
+ }
+ else {
+ var roles = ele.getAttribute("role").trim().split(" ");
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ retVal = roles[i] === role;
+ }
+ }
+ }
+ //if none of the the attribute roles matched with given role
+ //check if implicit roles matches.
+ //Note: element can have multiple implicit roles
+ if (!retVal && considerImplicitRoles) {
+ var wRoles = [];
+ //check if there are any implicit roles for this element.
+ var implicitRole = RPTUtil.getImplicitRole(ele);
+ if (implicitRole !== null && implicitRole.length > 0) {
+ RPTUtil.concatUniqueArrayItemList(implicitRole, wRoles);
+ //if role is array loop thru and see if any of the implicit role present in the array
+ if (typeof (role) != typeof ("")) {
+ for (var i = 0; !retVal && i < wRoles.length; ++i) {
+ retVal = wRoles[i] in role;
+ }
+ }
+ else {
+ for (var i = 0; !retVal && i < wRoles.length; ++i) {
+ retVal = wRoles[i] === role;
+ }
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * Checks if the element has the role, including the implied role if role is not explicitly specified.
+ *
+ * This function is replacing the hasRole function
+ *
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {list or string} roles - List or single role for which to find if element has these roles.
+ *
+ * @return {List} retVal - true or false based on if the element has the specified role.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasRoleInSemantics = function (ele, role) {
+ var retVal = false;
+ var roleSpecified = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ if (typeof (role) != typeof ("")) {
+ var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ roleSpecified = true;
+ retVal = roles[i] in role;
+ }
+ }
+ else {
+ var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var i = 0; !retVal && i < roles.length; ++i) {
+ roleSpecified = true;
+ retVal = roles[i] === role;
+ }
+ }
+ }
+ if (roleSpecified) {
+ return retVal;
+ }
+ //check if implicit roles matches.
+ //Note: element can have multiple implicit roles
+ //check if there are any implicit roles for this element.
+ var impRoles = RPTUtil.getImplicitRole(ele);
+ if (impRoles !== null && impRoles.length > 0) {
+ //if role is array loop thru and see if any of the implicit role present in the array
+ if (typeof (role) != typeof ("")) {
+ for (var i = 0; !retVal && i < impRoles.length; ++i) {
+ retVal = impRoles[i] in role;
+ }
+ }
+ else {
+ for (var i = 0; !retVal && i < impRoles.length; ++i) {
+ retVal = impRoles[i] === role;
+ }
+ }
+ }
+ return retVal;
+ };
+ /**
+ * This function is responsible for finding if a element has given role.
+ * This function also checks if element has given roles as implicit roles.
+ * @parm {HTMLElement} ele - element for which to find role.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {bool} retVal - true or false based on if the element has the specified role.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasAnyRole = function (ele, considerImplicitRoles) {
+ var retVal = false;
+ if (ele && ele.hasAttribute && ele.hasAttribute("role")) {
+ retVal = true;
+ }
+ //check if implicit roles exist.
+ //Note: element can have multiple implicit roles
+ if (!retVal && considerImplicitRoles) {
+ //check if there are any implicit roles for this element.
+ var impRoles = RPTUtil.getImplicitRole(ele);
+ if (impRoles !== null && impRoles.length > 0)
+ retVal = true;
+ }
+ return retVal;
+ };
+ RPTUtil.isDataTable = function (tableNode) {
+ return !(RPTUtil.hasRole(tableNode, "none") || RPTUtil.hasRole(tableNode, "presentation"));
+ };
+ /*
+ * A complex data table is a data table with any of the following characteristics:
+ *
+ * a thead element that contains two or more tr elements
+ * a table with more than one thead element
+ * a table with two or more tr elements that contain only th elements
+ * a th or td element with a rowspan or colspan attribute
+ * a tr element that contains at least one td element and two or more th elements
+ * a table with headers not located in the first row or first column
+ * a td element with a headers attribute value that contains more than two IDREFs
+ */
+ RPTUtil.isComplexDataTable = function (table) {
+ if ("RPTUtil_isComplexDataTable" in table) {
+ return !!table.RPTUtil_isComplexDataTable;
+ }
+ var isComplexTable = false;
+ if (table && RPTUtil.isDataTable(table)) {
+ var thNodes = null, tdNodes = null;
+ var trNodes = table.getElementsByTagName("tr");
+ var trNodeCount = trNodes.length;
+ var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0;
+ for (var i = 0; !isComplexTable && i < trNodeCount; ++i) {
+ thNodes = trNodes[i].getElementsByTagName("th");
+ tdNodes = trNodes[i].getElementsByTagName("td");
+ thNodeCount = thNodes.length;
+ tdNodeCount = tdNodes.length;
+ if (tdNodeCount !== 0) {
+ // a tr element that contains at least one td element and two or more th elements;
+ isComplexTable = thNodeCount > 1;
+ // a th element with a rowspan or colspan attribute
+ for (var j = 0; !isComplexTable && j < thNodeCount; ++j) {
+ isComplexTable = ((thNodes[j].hasAttribute("rowspan") ||
+ thNodes[j].hasAttribute("colspan")) &&
+ RPTUtil.getAncestor(thNodes[j], "table") === table);
+ }
+ // a td element with a rowspan or colspan attribute
+ // a td element with a headers attribute value that contains more than two IDREFs
+ for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) {
+ isComplexTable = ((tdNodes[k].hasAttribute("rowspan") ||
+ tdNodes[k].hasAttribute("colspan") ||
+ (tdNodes[k].hasAttribute("headers") && RPTUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) &&
+ RPTUtil.getAncestor(tdNodes[k], "table") === table);
+ }
+ }
+ else {
+ // two or more tr elements that contain only th elements
+ if (thNodeCount > 0) {
+ ++trNodesHavingOnlyThNodes;
+ }
+ isComplexTable = trNodesHavingOnlyThNodes === 2;
+ }
+ }
+ if (!isComplexTable) {
+ var theadNodes = table.getElementsByTagName("thead");
+ var theadNodesLength = theadNodes.length;
+ if (theadNodesLength > 0) {
+ // table has more than one thead element
+ isComplexTable = theadNodesLength > 1;
+ // a thead element that contains two or more tr elements
+ if (!isComplexTable) {
+ isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1;
+ }
+ }
+ }
+ if (!isComplexTable && trNodeCount !== 0) {
+ // a table with headers not located in the first row or first column
+ isComplexTable = thNodeCount > 0 && !RPTUtil.tableHeaderExists(table);
+ }
+ }
+ table.RPTUtil_isComplexDataTable = isComplexTable;
+ return isComplexTable;
+ };
+ // Return true if a table cell is hidden or contain no data:
+ RPTUtil.isTableCellEmpty = function (cell) {
+ if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/ /g, ' ').trim().length === 0)
+ return true;
+ return false;
+ };
+ // Return true if a table row is hidden or contain no data: or
+ RPTUtil.isTableRowEmpty = function (row) {
+ if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row))
+ return true;
+ var passed = true; //empty
+ for (var c = 0; passed && c < row.cells.length; c++) {
+ var cell = row.cells[c];
+ passed = RPTUtil.isTableCellEmpty(cell);
+ }
+ return passed;
+ };
+ // Return true if a table's header is in the first row or column
+ RPTUtil.tableHeaderExists = function (ruleContext) {
+ var rows = ruleContext.rows;
+ if (!rows || rows.length === 0)
+ return null;
+ // note that table.rows return all all the rows in the table,
+ // including the rows contained within , , and elements.
+ //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot
+ //get the first row with data, ignoring the rows with no data
+ var passed = true;
+ var firstRow = rows[0];
+ for (var r = 0; passed && r < rows.length; r++) {
+ firstRow = rows[r];
+ // ignore the rows from tfoot
+ if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot')
+ continue;
+ passed = RPTUtil.isTableRowEmpty(firstRow);
+ }
+ //table contain no data:
+ if (passed)
+ return null;
+ // Check if the cells with data in the first data row are all TH's
+ passed = true;
+ for (var r = 0; passed && r < firstRow.cells.length; r++) {
+ var cell = firstRow.cells[r];
+ passed = RPTUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th';
+ }
+ if (passed)
+ return true;
+ // Case 2: headers are in the first column with data
+ // Assume that the first column has all TH's or a TD without data in the first column.
+ passed = true;
+ for (var i = 0; passed && i < rows.length; ++i) {
+ // ignore the rows from tfoot
+ if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot')
+ continue;
+ // If no cells in this row, or no data at all, that's okay too.
+ passed = !rows[i].cells ||
+ rows[i].cells.length === 0 ||
+ rows[i].cells[0].innerHTML.trim().length === 0 ||
+ rows[i].cells[0].nodeName.toLowerCase() != "td";
+ }
+ if (passed)
+ return true;
+ //case 3: all td data cells have headers attributes that point to the id of a th element in the same table.
+ // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements
+ passed = true;
+ var thIds = [];
+ var tdHeaders = [];
+ for (var r = 0; passed && r < rows.length; r++) {
+ var row = rows[r];
+ // Check if the cells with data in the last data row are all TH's
+ for (var c = 0; c < row.cells.length; c++) {
+ var cell = row.cells[c];
+ if (RPTUtil.isTableCellEmpty(cell))
+ continue;
+ if (cell.nodeName.toLowerCase() === 'td') {
+ if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0)
+ passed = false;
+ else
+ RPTUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders);
+ }
+ else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0)
+ RPTUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds);
+ }
+ }
+ if (passed) { // all td elements have headers, to exam if the headers point to a th id
+ if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); }))
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.isNodeInGrid = function (node) {
+ return RPTUtil.getAncestorWithRole(node, "grid") != null;
+ };
+ RPTUtil.isLayoutTable = function (tableNode) {
+ return RPTUtil.hasRole(tableNode, "presentation") || RPTUtil.hasRole(tableNode, "none");
+ };
+ RPTUtil.getFileExt = function (url) {
+ var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);
+ if (m != null && m.length >= 2) {
+ return "." + m[1];
+ }
+ return "";
+ };
+ RPTUtil.getFileAnchor = function (url) {
+ var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/);
+ if (m != null && m.length >= 2) {
+ return m[1];
+ }
+ return "";
+ };
+ RPTUtil.checkObjEmbed = function (node, extTest, mimeTest) {
+ var nodeName = node.nodeName.toLowerCase();
+ if (nodeName != "object" && nodeName != "embed" &&
+ nodeName != "a" && nodeName != "area")
+ return false;
+ var retVal = false;
+ // Check mime type
+ if (!retVal && node.hasAttribute("type")) {
+ var mime = node.getAttribute("type").toLowerCase();
+ retVal = mimeTest(mime);
+ }
+ if (!retVal && node.hasAttribute("codetype")) {
+ var mime = node.getAttribute("codetype");
+ retVal = mimeTest(mime);
+ }
+ // Check the filename
+ if (!retVal) {
+ var filename = "";
+ if (nodeName === "embed") {
+ filename = node.getAttribute("src");
+ }
+ else if (nodeName === "a" || nodeName === "area") {
+ filename = node.getAttribute("href");
+ }
+ else if (node.hasAttribute("data")) {
+ filename = node.getAttribute("data");
+ }
+ if (filename === null)
+ filename = "";
+ var ext = RPTUtil.getFileExt(filename);
+ retVal = extTest(ext);
+ }
+ // Check for filenames in the params
+ if (!retVal && nodeName === "object") {
+ // In the case that Check Hidden Option is set then comply with that setting
+ var params = RPTUtil.getChildByTagHidden(node, "param", false, true);
+ for (var i = 0; !retVal && params != null && i < params.length; ++i) {
+ retVal = params[i].hasAttribute("value") &&
+ extTest(RPTUtil.getFileExt(params[i].getAttribute("value")));
+ }
+ }
+ return retVal;
+ };
+ RPTUtil.isAudioObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isAudioExt, function (mime) {
+ return mime.startsWith("audio");
+ });
+ };
+ RPTUtil.isAudioExt = function (ext) {
+ var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda",
+ ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med",
+ ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm",
+ ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul",
+ ".voc", ".wav", ".wma", ".wve"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), audio_extensions);
+ };
+ RPTUtil.isVideoObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isVideoExt, function (mime) {
+ return mime.startsWith("video") ||
+ mime.startsWith("application/x-shockwave-flash");
+ });
+ };
+ RPTUtil.isVideoExt = function (ext) {
+ var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov",
+ ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt",
+ ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb",
+ ".mvb"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), video_extensions);
+ };
+ RPTUtil.isImageObjEmbedLink = function (node) {
+ return RPTUtil.checkObjEmbed(node, RPTUtil.isImgExt, function (mime) {
+ return mime.startsWith("image");
+ });
+ };
+ RPTUtil.isImgExt = function (ext) {
+ var image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"];
+ return RPTUtil.valInArray(ext.toLowerCase(), image_extensions);
+ };
+ RPTUtil.isHtmlExt = function (ext) {
+ var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm",
+ ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml"
+ ];
+ return RPTUtil.valInArray(ext.toLowerCase(), html_extensions);
+ };
+ RPTUtil.isPresentationalElement = function (node) {
+ // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics,
+ // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn",
+ "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s",
+ "samp", "small", "span", "strong", "sub", "sup", "time", "u",
+ "var", "wbr", "a", "progress", "meter", "basefont", "big", "center",
+ "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6",
+ "hr", "blockquote", "p"
+ ];
+ return RPTUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements);
+ };
+ RPTUtil.hasTriggered = function (doc, id) {
+ return (0, CacheUtil_1.getCache)(doc, id, false);
+ };
+ RPTUtil.triggerOnce = function (doc, id, passed) {
+ if (passed)
+ return true;
+ var triggered = (0, CacheUtil_1.getCache)(doc, id, false);
+ (0, CacheUtil_1.setCache)(doc, id, true);
+ return triggered;
+ };
+ /* determine if the given value exists in the given array */
+ RPTUtil.valInArray = function (value, arr) {
+ for (var idx in arr) {
+ if (arr[idx] === value)
+ return true;
+ }
+ return false;
+ };
+ /**
+ * return the ancestor of the given element
+ * @param tagNames string, array, or dictionary containing the tags to search for
+ */
+ RPTUtil.getAncestor = function (element, tagNames) {
+ var walkNode = element;
+ while (walkNode !== null) {
+ var thisTag = walkNode.nodeName.toLowerCase();
+ if (typeof (tagNames) === "string") {
+ if (thisTag === tagNames.toLowerCase()) {
+ break;
+ }
+ }
+ else if (tagNames.length) {
+ for (var idx in tagNames) {
+ if (tagNames[idx] === thisTag)
+ return walkNode;
+ }
+ }
+ else if (thisTag in tagNames) {
+ break;
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return walkNode;
+ };
+ // return true if element1 and element2 are siblings
+ RPTUtil.isSibling = function (element1, element2) {
+ if (element1 && element2) {
+ var node = null;
+ if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) {
+ node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild;
+ }
+ while (node) {
+ if (node === element2)
+ return true;
+ node = node.nextSibling;
+ }
+ }
+ return false;
+ };
+ /**
+ * return the ancestor of the given element and role.
+ *
+ * @parm {element} element - The element to start the node walk on to find parent node
+ * @parm {string} role - The role to search for on an element under the provided element
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} walkNode - A parent node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) {
+ var walkNode = DOMWalker_1.DOMWalker.parentNode(element);
+ while (walkNode !== null) {
+ if (considerImplicitRoles) {
+ if (RPTUtil.hasRoleInSemantics(walkNode, roleName)) {
+ break;
+ }
+ }
+ else {
+ if (RPTUtil.hasRole(walkNode, roleName, false)) {
+ break;
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return walkNode;
+ };
+ /**
+ * return the ancestor with the given style properties.
+ *
+ * @parm {element} element - The element to start the node walk on to find parent node
+ * @parm {[string]} styleProps - The style properties and values of the parent to search for.
+ * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']}
+ * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop.
+ * @parm {bool} excludedValues - style values that should be ignored.
+ * @return {node} walkNode - A parent node of the element, which has the style properties
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) {
+ if (excludedValues === void 0) { excludedValues = []; }
+ var walkNode = elem;
+ while (walkNode !== null) {
+ var node = (0, CacheUtil_1.getCache)(walkNode, "RPTUtil_AncestorWithStyles", null);
+ if (node !== null)
+ return node;
+ var styles = (0, CSSUtil_1.getDefinedStyles)(walkNode);
+ for (var style in styleProps) {
+ var value = styles[style];
+ if (value) {
+ value = value.split(" ")[0]; //get rid of !important
+ if (!excludedValues.includes(value)) {
+ if (styleProps[style].includes('*')) {
+ (0, CacheUtil_1.setCache)(walkNode, "RPTUtil_AncestorWithStyles", walkNode);
+ return walkNode;
+ }
+ else if (styleProps[style].includes(value)) {
+ (0, CacheUtil_1.setCache)(walkNode, "RPTUtil_AncestorWithStyles", walkNode);
+ return walkNode;
+ }
+ }
+ }
+ }
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ (0, CacheUtil_1.setCache)(elem, "RPTUtil_AncestorWithStyles", undefined);
+ return null;
+ };
+ /**
+ * This function is responsible for finding a node which matches the role and is a sibling of the
+ * provided element.
+ *
+ * This function by default will not consider Check Hidden Setting at all.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getSiblingWithRoleHidden
+ *
+ * @parm {element} element - The element to start the node walk on to find sibling node
+ * @parm {string} role - The role to search for on an element under the provided element
+ *
+ * @return {node} walkNode - A sibling node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getSiblingWithRole = function (element, role) {
+ return RPTUtil.getSiblingWithRoleHidden(element, role, false);
+ };
+ /**
+ * This function is responsible for finding a node which matches the role and is a sibling of the
+ * provided element.
+ *
+ * This function also considers implicit roles for the elements.
+ *
+ * This function will also consider elements that are hidden based on the if the Check
+ * Hidden Content settings should be considered or not.
+ *
+ * @parm {element} element - The element to start the node walk on to find sibling node
+ * @parm {string} role - The role to search for on an element under the provided element
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered.
+ *
+ * @return {node} walkNode - A sibling node of the element passed in, which has the provided role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) {
+ // Variable Declaration
+ var walkNode = null;
+ var hasRole = false;
+ // Only perform the check if element and role are both provided
+ if (element && role) {
+ // Fetch the next sibling element
+ walkNode = element.nextSibling;
+ // Keep looping over the next siblings to find element which matches
+ // the provided role.
+ while (walkNode !== null && !hasRole) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) {
+ // Move on to the next node
+ walkNode = walkNode.nextSibling;
+ continue;
+ }
+ // Check if this node has the role that we need to check exists
+ if (considerImplicitRole) {
+ hasRole = RPTUtil.hasRoleInSemantics(walkNode, role);
+ }
+ else {
+ hasRole = RPTUtil.hasRole(walkNode, role, false);
+ }
+ // Move on to the next node
+ walkNode = walkNode.nextSibling;
+ }
+ // If we still have not found a node that matches the role, start a reverse look up
+ if (!walkNode) {
+ // Fetch the previous Sibling of this element
+ walkNode = element.previousSibling;
+ // Keep looping over all the previous siblings to search for an element which
+ // matches the provided role.
+ while (walkNode !== null && !hasRole) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(walkNode)) {
+ // Move on to the next node
+ walkNode = walkNode.previousSibling;
+ continue;
+ }
+ // Check if this node has the role that we need to check exists
+ hasRole = RPTUtil.hasRole(walkNode, role, considerImplicitRole);
+ // Move on to the next node
+ walkNode = walkNode.previousSibling;
+ }
+ }
+ }
+ return walkNode;
+ };
+ RPTUtil.isDescendant = function (parent, child) {
+ var node = DOMWalker_1.DOMWalker.parentNode(child);
+ while (node != null) {
+ if (node === parent) {
+ return true;
+ }
+ node = DOMWalker_1.DOMWalker.parentNode(node);
+ }
+ return false;
+ };
+ //check if the first form control child is disabled
+ RPTUtil.isDisabledByFirstChildFormElement = function (element) {
+ var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (nw.nextNode()) {
+ if (formElements.includes(nw.node.nodeName.toLowerCase())) {
+ if (RPTUtil.isNodeDisabled(nw.node))
+ return true;
+ return false;
+ }
+ }
+ }
+ return false;
+ };
+ RPTUtil.isDisabledByReferringElement = function (element) {
+ var id = element.getAttribute("id");
+ var doc = element.ownerDocument;
+ var root = doc.body;
+ while (DOMWalker_1.DOMWalker.parentNode(root) !== null) {
+ // Get the parentNode
+ root = DOMWalker_1.DOMWalker.parentNode(root);
+ }
+ var nw = new NodeWalker(root);
+ while (nw.nextNode()) {
+ // check the element whose 'aria-describedby' equals to the id
+ if (nw.node && nw.node.nodeType === 1 && nw.elem()) {
+ var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" ");
+ if (AriaDescribedbyIDArray.includes(id) && RPTUtil.isNodeDisabled(nw.node)) {
+ return true;
+ }
+ }
+ }
+ };
+ /**
+ * This function is responsible for getting a descendant element with the specified role, under
+ * the element that was provided.
+ *
+ * Note by default this function will not consider the Check Hidden Content Setting.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getDescendantWithRoleHidden
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDescendantWithRole = function (element, roleName) {
+ return RPTUtil.getDescendantWithRoleHidden(element, roleName, false);
+ };
+ /**
+ * This function is responsible for getting a descendant element with the specified role, under
+ * the element that was provided. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendant = null;
+ var nw = new NodeWalker(element);
+ // Loop over all the childrens of the element provided and check if the rolename provided exists
+ while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ if (considerImplicitRoles ? RPTUtil.hasRoleInSemantics(nw.node, roleName) : RPTUtil.hasRole(nw.node, roleName, false)) {
+ descendant = nw.node;
+ break;
+ }
+ }
+ return descendant;
+ };
+ /**
+ * This function is responsible for getting All descendant elements with the specified role, under
+ * the element that was provided. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - parent element for which we will be checking descendants for
+ * @parm {string} roleName - The role to look for on the descendants elements
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The descendant element that matches the role specified (only one)
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var descendants = [];
+ var nw = new NodeWalker(element);
+ // Loop over all the childrens of the element provided and check if the rolename provided exists
+ while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) {
+ if (nw.bEndTag) {
+ continue;
+ }
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (considerHiddenSetting && RPTUtil.shouldNodeBeSkippedHidden(nw.node)) {
+ continue;
+ }
+ // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the
+ // nodes.
+ if (RPTUtil.hasRole(nw.node, roleName, considerImplicitRoles)) {
+ descendants.push(nw.node);
+ }
+ }
+ return descendants;
+ };
+ /**
+ * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation)
+ *
+ * @parm {element} element - parent element for which we will be checking children for
+ * @return {node} - The direct child elements in AT tree that has a role
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getDirectATChildren = function (element) {
+ var requiredChildRoles = RPTUtil.getRequiredChildRoles(element, true);
+ var direct = [];
+ RPTUtil.retrieveDirectATChildren(element, requiredChildRoles, direct);
+ return direct;
+ };
+ /**
+ * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation)
+ *
+ * @parm {element} element - parent element for which we will be checking children for
+ * @return {node} - The direct child elements in AT tree
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) {
+ var children = [];
+ if (element.children !== null && element.children.length > 0) {
+ for (var i = 0; i < element.children.length; i++) {
+ children.push(element.children[i]);
+ }
+ }
+ // if the element contains "aria-own" attribute, then the aria-owned children need to be included too
+ var owned = element.getAttribute("aria-owns");
+ if (owned) {
+ var doc = element.ownerDocument;
+ if (doc) {
+ var ownedIds = owned.split(" ");
+ for (var i = 0; i < ownedIds.length; i++) {
+ var ownedElem = doc.getElementById(ownedIds[i]);
+ if (ownedElem) {
+ children.push(ownedElem);
+ }
+ }
+ }
+ }
+ if (children.length > 0) {
+ for (var i = 0; i < children.length; i++) {
+ //ignore hidden and invisible child
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i]))
+ continue;
+ var roles = RPTUtil.getRoles(children[i], false);
+ if (roles === null || roles.length === 0) {
+ roles = RPTUtil.getImplicitRole(children[i]);
+ }
+ if (roles && roles !== null && roles.length > 0) {
+ //remove 'none' and 'presentation'
+ roles = roles.filter(function (role) {
+ return role !== "none" && role !== "presentation";
+ });
+ // a 'group' role is allowed but not required for some elements so remove it if exists
+ if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) {
+ roles = roles.filter(function (role) {
+ return role !== 'group';
+ });
+ }
+ }
+ if (roles && roles !== null && roles.length > 0) {
+ direct.push(children[i]);
+ }
+ else {
+ // recursive until get a return value,
+ RPTUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct);
+ }
+ }
+ return null;
+ }
+ else
+ return null;
+ };
+ /**
+ * this function returns null or required child roles for a given element with one more roles,
+ * return null if the role is 'none' or 'presentation'
+ * @param element
+ * @param includeImplicit include implicit roles if no role is explicitly provided
+ * @returns
+ */
+ RPTUtil.getRequiredChildRoles = function (element, includeImplicit) {
+ var roles = RPTUtil.getRoles(element, false);
+ // if explicit role doesn't exist, get the implicit one
+ if ((!roles || roles.length === 0) && includeImplicit) {
+ roles = RPTUtil.getImplicitRole(element);
+ }
+ /**
+ * ignore if the element doesn't have any explicit or implicit role
+ */
+ if (!roles || roles.length === 0) {
+ return null;
+ }
+ /**
+ * ignore if the element contains none or presentation role
+ */
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var requiredChildRoles = new Array();
+ for (var j = 0; j < roles.length; ++j) {
+ if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) {
+ requiredChildRoles = RPTUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles);
+ }
+ }
+ return requiredChildRoles;
+ };
+ /**
+ * This function is responsible for getting an element referenced by aria-owns and has the
+ * role that was specified.
+ *
+ * Note by default this function will not consider the Check Hidden Content Setting.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getAriaOwnsWithRoleHidden
+ *
+ * @parm {element} element - Element to check for aria-owns
+ * @parm {string} roleName - The role to look for on the aria-owns element
+ *
+ * @return {node} - The element that is referenced by aria-owns and has role specified.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAriaOwnsWithRole = function (element, roleName) {
+ return RPTUtil.getAriaOwnsWithRoleHidden(element, roleName, false);
+ };
+ /**
+ * This function is responsible for getting an element referenced by aria-owns and has the
+ * role that was specified. This function aslo finds elements with implicit roles.
+ *
+ * @parm {element} element - Element to check for aria-owns
+ * @parm {string} roleName - The role to look for on the aria-owns element
+ * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered.
+ * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered.
+ *
+ * @return {node} - The element that is referenced by aria-owns and has role specified.
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) {
+ // Variable Decleration
+ var referencedElement = null;
+ var referencedElemHasRole = false;
+ // In the case aria-owns is not on the element just break out of this function with null
+ if (RPTUtil.attributeNonEmpty(element, "aria-owns")) {
+ // Get the reference ID
+ var referenceID = element.getAttribute("aria-owns");
+ // Get the element for the reference ID
+ referencedElement = fragment_1.FragmentUtil.getById(element, referenceID);
+ //ignore if the aria-owns point to the element itself
+ if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement))
+ return null;
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. If considerHiddenSetting option is set to true then we perform the check to consider the
+ // Check Hidden Content that is provided.
+ // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ if (considerHiddenSetting && referencedElement != null && RPTUtil.shouldNodeBeSkippedHidden(referencedElement)) {
+ referencedElemHasRole = null;
+ }
+ else {
+ referencedElemHasRole = RPTUtil.hasRole(referencedElement, roleName, considerImplicitRoles);
+ }
+ }
+ return referencedElemHasRole ? referencedElement : null;
+ };
+ /** get element containing label for the given element
+ * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead
+ */
+ RPTUtil.getInputLabel = function (element) {
+ return RPTUtil.getLabelForElement(element);
+ };
+ /**
+ * This function is responsible for getting the element containing the label for the given element.
+ *
+ * Note: This is a wrapper function to: RPTUtil.getLabelForElementHidden
+ *
+ * @parm {element} element - The element for which to get the label element for.
+ *
+ * @return {element} element - return the element for the label, otherwise null
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getLabelForElement = function (element) {
+ return RPTUtil.getLabelForElementHidden(element, false);
+ };
+ /**
+ * This function is responsible for getting the element containing the label for the given element.
+ *
+ * This function will return null if the containing lable element is hidden, when the ignoreHidden option
+ * is set to true.
+ *
+ * @parm {element} element - The element for which to get the label element for.
+ * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list
+ * false if the hidden elements should be added
+ *
+ * @return {element} element - return the element for the label, otherwise null
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.getLabelForElementHidden = function (element, ignoreHidden) {
+ // Check if the global RPTUtil_LABELS hash is available, as this will contain the label nodes based on
+ // for attribute.
+ //if (!getCache(element.ownerDocument,"RPTUtil_LABELS", null)) {
+ var root = element.getRootNode();
+ if (!(0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", null)) {
+ // Variable Decleration
+ var idToLabel = {};
+ // Get all the label elements in the entire doc
+ var labelNodes = RPTUtil.getDocElementsByTag(element, "label");
+ // Loop over all the label nodes, in the case the label node has a for attribute,
+ // extract that attribute and add this node to the hash if it is visible.
+ for (var i = 0; i < labelNodes.length; ++i) {
+ if (labelNodes[i].hasAttribute("for")) {
+ // If ignore hidden is specified and the node is not visible we do not add it to the
+ // labelNodes hash.
+ if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) {
+ continue;
+ }
+ idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i];
+ }
+ }
+ // Add the built hash to the ownerDocument (document), to be used later to fast retrival
+ //setCache(element.ownerDocument, "RPTUtil_LABELS", idToLabel);
+ (0, CacheUtil_1.setCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", idToLabel);
+ }
+ // If this element has an id attribute, get the corosponding label element
+ if (element.hasAttribute("id")) {
+ // Fetch the id attribute
+ var ctrlId = element.getAttribute("id");
+ // Return the corosponding label element.
+ // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden
+ if (ctrlId.trim().length > 0) {
+ //return getCache(element.getRootNode().ownerDocument,"RPTUtil_LABELS",{})[ctrlId];
+ return (0, CacheUtil_1.getCache)((root.nodeType === 11) ? root : root, "RPTUtil_LABELS", {})[ctrlId];
+ }
+ }
+ return null;
+ };
+ /* Return specified element attribute if present else return null */
+ RPTUtil.getElementAttribute = function (element, attr) {
+ //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null;
+ if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr))
+ return null;
+ var atrValue = element.getAttribute(attr);
+ if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr))
+ return atrValue;
+ //attr is a reference to other elements(s)
+ var values = atrValue.split(/ +/g);
+ //ignore if none of the referred element(s) exist or all point to the element itself
+ var exist = false;
+ for (var id = 0; values < values.length; ++id) {
+ var referred = document.getElementById(values[id]);
+ if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) {
+ exist = true;
+ break;
+ }
+ }
+ return exist ? atrValue : null;
+ };
+ // Return true if the element has an ARIA label
+ RPTUtil.hasAriaLabel = function (element) {
+ // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element
+ return RPTUtil.attributeNonEmpty(element, "aria-label") || RPTUtil.attributeNonEmpty(element, "aria-labelledby");
+ };
+ // Return true if element has valid implicit label
+ RPTUtil.hasImplicitLabel = function (element) {
+ var parentNode = RPTUtil.getAncestor(element, "label");
+ // Test a) if the parent is a label which is the implicit label
+ // b) if the form element is the first child of the label
+ // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output"
+ // form elements that do not require implicit or explicit label element are:
+ // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later
+ if (parentNode && parentNode.tagName.toLowerCase() === "label" && RPTUtil.isFirstFormElement(parentNode, element)) {
+ var parentClone = parentNode.cloneNode(true);
+ // exclude all form elements from the label since they might also have inner content
+ parentClone = RPTUtil.removeAllFormElementsFromLabel(parentClone);
+ return RPTUtil.hasInnerContentHidden(parentClone);
+ }
+ else {
+ return false;
+ }
+ };
+ RPTUtil.isFirstFormElement = function (parentNode, element) {
+ var formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"];
+ if (parentNode.firstChild != null) {
+ var nw = new NodeWalker(parentNode);
+ while (nw.nextNode()) {
+ if (formElementsRequiringLabel.indexOf(nw.node.nodeName.toLowerCase()) !== -1) {
+ return nw.node === element;
+ }
+ }
+ }
+ return false;
+ };
+ // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored)
+ RPTUtil.isShadowHostElement = function (element) {
+ if (RPTUtil.isShadowElement(element))
+ return false;
+ var walkNode = element;
+ while (walkNode) {
+ if (walkNode.shadowRoot)
+ return true;
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ return false;
+ };
+ //check if an element is in a shadow tree
+ RPTUtil.isShadowElement = function (element) {
+ var root = element.getRootNode();
+ if (root.toString() === "[object ShadowRoot]")
+ return true;
+ return false;
+ };
+ RPTUtil.removeAllFormElementsFromLabel = function (element) {
+ var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"];
+ var childNodes = element.childNodes;
+ for (var i = 0; i < childNodes.length; i++) {
+ if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) {
+ element.removeChild(childNodes[i]);
+ }
+ }
+ return element;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) {
+ if (elements.length === 0)
+ return false;
+ var doc = elements[0].ownerDocument;
+ var hasDuplicateLabels = false;
+ var uniqueAriaLabels = null;
+ if (isGlobal) {
+ uniqueAriaLabels = (0, CacheUtil_1.getCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null);
+ }
+ if (uniqueAriaLabels === null) {
+ uniqueAriaLabels = {};
+ }
+ for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) {
+ if (elements[i].hasAttribute) {
+ if (elements[i].hasAttribute("aria-label")) {
+ var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase();
+ hasDuplicateLabels = ariaLabel in uniqueAriaLabels;
+ uniqueAriaLabels[ariaLabel] = true;
+ }
+ else if (elements[i].hasAttribute("aria-labelledby")) {
+ var labelID = elements[i].getAttribute("aria-labelledby");
+ var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID);
+ var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? RPTUtil.getInnerText(labelNode) : "";
+ var normalizedLabel = RPTUtil.normalizeSpacing(label).toLowerCase();
+ hasDuplicateLabels = normalizedLabel in uniqueAriaLabels;
+ uniqueAriaLabels[normalizedLabel] = true;
+ }
+ else {
+ // Has no label at all
+ hasDuplicateLabels = true;
+ }
+ }
+ }
+ if (isGlobal) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return !hasDuplicateLabels;
+ };
+ RPTUtil.getAriaLabel = function (ele) {
+ if (ele.hasAttribute) {
+ if (ele.hasAttribute("aria-labelledby")) {
+ var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" ");
+ var normalizedLabel = "";
+ for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) {
+ var labelID = labelIDs[j];
+ var labelNode = fragment_1.FragmentUtil.getById(ele, labelID);
+ var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase();
+ }
+ return normalizedLabel.trim();
+ }
+ else if (ele.hasAttribute("aria-label")) {
+ return RPTUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim();
+ }
+ }
+ if (ele.nodeName.toLowerCase() === "input") {
+ //const label = RPTUtil.getLabelForElement(ele);
+ var label = RPTUtil.getLabelForElementHidden(ele, true);
+ if (!label)
+ return "";
+ return (RPTUtil.getAriaLabel(label) || label.innerText || "").trim();
+ }
+ return "";
+ };
+ /**
+ * @param element
+ * @param idStr
+ * @returns true if any one (if multiple Ids) id points to itself
+ */
+ RPTUtil.isIdReferToSelf = function (element, idStr) {
+ if (!idStr || idStr.trim() === '')
+ return false;
+ var ids = idStr.trim().split(" ");
+ for (var j = 0, length_2 = ids.length; j < length_2; ++j) {
+ var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]);
+ if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element))
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.findAriaLabelDupes = function (elements) {
+ var dupeMap = {};
+ elements.forEach(function (ele) {
+ dupeMap[RPTUtil.getAriaLabel(ele)] = (dupeMap[RPTUtil.getAriaLabel(ele)] || 0) + 1;
+ });
+ return dupeMap;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasUniqueAriaLabels = function (elements) {
+ return RPTUtil.hasUniqueAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels
+ RPTUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) {
+ if (elements.length === 0)
+ return false;
+ var doc = elements[0].ownerDocument;
+ var hasDuplicateLabels = false;
+ var uniqueAriaLabels = null;
+ var duplicateLabelNameArray = new Array();
+ if (isGlobal) {
+ uniqueAriaLabels = (0, CacheUtil_1.getCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", null);
+ }
+ if (uniqueAriaLabels === null) {
+ uniqueAriaLabels = {};
+ }
+ for (var i = 0; i < elements.length; ++i) {
+ if (elements[i].hasAttribute) {
+ if (elements[i].hasAttribute("aria-label")) {
+ var ariaLabel = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase();
+ hasDuplicateLabels = ariaLabel in uniqueAriaLabels;
+ uniqueAriaLabels[ariaLabel] = true;
+ if (!(ariaLabel in duplicateLabelNameArray)) {
+ duplicateLabelNameArray[ariaLabel] = new Array();
+ }
+ duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase());
+ }
+ else if (elements[i].hasAttribute("aria-labelledby")) {
+ var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" ");
+ var normalizedLabel = "";
+ for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) {
+ var labelID = labelIDs[j];
+ var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID);
+ var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? RPTUtil.getInnerText(labelNode) : "";
+ normalizedLabel += RPTUtil.normalizeSpacing(label).toLowerCase();
+ }
+ hasDuplicateLabels = normalizedLabel in uniqueAriaLabels;
+ uniqueAriaLabels[normalizedLabel] = true;
+ if (!(normalizedLabel in duplicateLabelNameArray)) {
+ duplicateLabelNameArray[normalizedLabel] = new Array();
+ }
+ duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase());
+ }
+ }
+ }
+ if (isGlobal) {
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels);
+ }
+ return duplicateLabelNameArray;
+ };
+ // Given an array of elements, return true if the elements have unique ARIA labels globally
+ RPTUtil.hasDuplicateAriaLabels = function (elements) {
+ return RPTUtil.hasDuplicateAriaLabelsLocally(elements, true);
+ };
+ // Given an array of elements, return true if the elements have unique aria-labelledby attributes
+ RPTUtil.hasUniqueAriaLabelledby = function (elements) {
+ var hasDuplicateLabels = false;
+ var labelRefs = {};
+ for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) {
+ if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !RPTUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) {
+ var labelRef = RPTUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby"));
+ hasDuplicateLabels = labelRef in labelRefs;
+ labelRefs[labelRef] = true;
+ }
+ else {
+ hasDuplicateLabels = true;
+ }
+ }
+ return !hasDuplicateLabels;
+ };
+ /* Determine the node depth of the given element */
+ RPTUtil.nodeDepth = function (element) {
+ var depth = 0;
+ var walkNode = element;
+ while (walkNode !== null) {
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ depth = depth + 1;
+ }
+ return depth;
+ };
+ /* compare node order of the 2 given nodes */
+ /* returns
+ * 0 if the nodes are equal
+ * 1 if node b is before node a
+ * -1 if node a is before node b
+ * 2 if node a is nested in node b
+ * -2 if node b is nested in node a
+ * null if either node is null or their parent nodes are not equal
+ */
+ RPTUtil.compareNodeOrder = function (nodeA, nodeB) {
+ if (nodeA === nodeB)
+ return 0;
+ var aDepth = RPTUtil.nodeDepth(nodeA);
+ var bDepth = RPTUtil.nodeDepth(nodeB);
+ if (bDepth > aDepth) {
+ for (var i = 0; i < bDepth - aDepth; ++i)
+ nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB);
+ if (nodeA === nodeB) // Node B nested in Node A
+ return -2;
+ }
+ else if (aDepth > bDepth) {
+ for (var i = 0; i < aDepth - bDepth; ++i)
+ nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA);
+ if (nodeA === nodeB) // Node A nested in Node B
+ return 2;
+ }
+ while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) {
+ nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA);
+ nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB);
+ }
+ if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB))
+ return null;
+ while (nodeB != null && nodeB != nodeA)
+ nodeB = nodeB.previousSibling;
+ if (nodeB === null) // nodeB before nodeA
+ return 1;
+ else
+ return -1;
+ };
+ /**
+ * Determine if the given attribute of the given element is not empty
+ * @memberOf RPTUtil
+ */
+ RPTUtil.attributeNonEmpty = function (element, attrStr) {
+ return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0;
+ };
+ /* Return a pointer to the given frame, null if not found */
+ RPTUtil.getFrameByName = function (ruleContext, frameName) {
+ var window = ruleContext.ownerDocument.defaultView;
+ var frameList = [window];
+ var idx = 0;
+ while (idx < frameList.length) {
+ try {
+ if (frameList[idx].name === frameName)
+ return frameList[idx];
+ for (var i = 0; i < frameList[idx].frames.length; ++i) {
+ try {
+ // Ensure it's a real frame and avoid recursion
+ if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) {
+ frameList.push(frameList[idx].frames[i]);
+ }
+ }
+ catch (e) { }
+ }
+ }
+ catch (e) { }
+ ++idx;
+ }
+ return null;
+ };
+ RPTUtil.defaultNSResolver = function (prefix) {
+ var uri;
+ switch (prefix) {
+ case 'html':
+ uri = 'http://www.w3.org/1999/xhtml';
+ case 'x2':
+ uri = 'http://www.w3.org/TR/xhtml2';
+ case 'x':
+ uri = 'http://www.w3.org/1999/xhtml';
+ case 'xhtml':
+ uri = 'http://www.w3.org/1999/xhtml';
+ default:
+ uri = null;
+ }
+ return uri;
+ };
+ //checking if only the inner text is empty or not
+ RPTUtil.isInnerTextOnlyEmpty = function (element) {
+ // Get the innerText of the element
+ var text = element.innerText;
+ if (text === undefined && element.textContent !== undefined) {
+ // In headless mode, innerText is sometimes 'undefined'
+ // so we try textContent as a workaround
+ text = element.textContent;
+ }
+ var retVal = !(text !== null && text.trim().length > 0);
+ if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") {
+ //TODO: need to conside its own content, a slot may have its own content or assigned content
+ for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) {
+ var slotElem = _a[_i];
+ retVal = retVal && RPTUtil.isInnerTextEmpty(slotElem);
+ }
+ }
+ // Trim the inner text and verify that it is not empty.
+ return retVal;
+ };
+ /* Return the inner text of the given element */
+ RPTUtil.getInnerText = function (element) {
+ var retVal = element.innerText;
+ if (retVal === undefined || retVal.trim() === "")
+ retVal = element.textContent;
+ return retVal;
+ };
+ /** Return the text content of the given node
+ * this is different than innerText or textContent that return text content of a node and its descendants
+ */
+ RPTUtil.getNodeText = function (element) {
+ if (!element)
+ return "";
+ var text = "";
+ var childNodes = element.childNodes;
+ for (var i = 0; i < childNodes.length; ++i) {
+ if (childNodes[i].nodeType == 3) {
+ text += childNodes[i].nodeValue;
+ }
+ }
+ return text;
+ };
+ /**
+ * This function is responsible for checking if elements inner text is empty or not.
+ *
+ * @parm {element} node The node which should be checked it has inner text or not.
+ * @return {bool} true if element has empty inner text, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.isInnerTextEmpty = function (element) {
+ // Get the innerText of the element
+ var text = RPTUtil.getInnerText(element);
+ // Trim the inner text and verify that it is not empty.
+ return !(text != null && text.trim().length > 0);
+ };
+ RPTUtil.hasInnerContent = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0);
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode()) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.attributeNonEmpty(nw.node, "alt"));
+ }
+ }
+ return hasContent;
+ };
+ /**
+ * This function is responsible for determine if an element has inner content.
+ * This function also considers cases where inner text is hidden, which now will
+ * be classified as does not have hidden content.
+ *
+ * @parm {element} node The node which should be checked it has inner text or not.
+ * @return {bool} true if element has empty inner text, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.hasInnerContentHidden = function (element) {
+ return RPTUtil.hasInnerContentHiddenHyperLink(element, false);
+ };
+ RPTUtil.svgHasName = function (element) {
+ return RPTUtil.attributeNonEmpty(element, "aria-label")
+ || RPTUtil.attributeNonEmpty(element, "aria-labelledby")
+ || !!element.querySelector(":scope > title");
+ };
+ RPTUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) {
+ if (!element)
+ return false;
+ // Variable Decleration
+ var childElement = element.firstElementChild;
+ var hasContent = false;
+ // In the case that the childElement is not null then we need to check each of the elements
+ // to make sure that the elements are not all hidden.
+ if (childElement != null) {
+ // Get the nodewalter of the element node, so that we can loop over it and verify
+ // that the elements under the element are not completly hidden.
+ var nw = new NodeWalker(element);
+ // Loop over all the nodes until there are no more nodes or we have determine that there is content under
+ // this parent element.
+ while (!hasContent && nw.nextNode() && nw.node != element) {
+ // Get the next node
+ var node = nw.node;
+ // In the case an img element is present with alt then we can mark this as pass
+ // otherwise keep checking all the other elements. Make sure that this image element is not hidden.
+ hasContent = (node.nodeName.toLowerCase() === "img"
+ && (RPTUtil.attributeNonEmpty(node, "alt") || RPTUtil.attributeNonEmpty(node, "title"))
+ && VisUtil_1.VisUtil.isNodeVisible(node)) || (node.nodeName.toLowerCase() === "svg"
+ && RPTUtil.svgHasName(node));
+ // Now we check if this node is of type element, visible
+ if (!hasContent && node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(node)) {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextOnlyEmpty(node);
+ if (!hasContent && hyperlink_flag === true) {
+ hasContent = RPTUtil.attributeNonEmpty(node, "aria-label") || RPTUtil.attributeNonEmpty(node, "aria-labelledby");
+ var doc = node.ownerDocument;
+ if (doc) {
+ var win = doc.defaultView;
+ if (win) {
+ var cStyle = win.getComputedStyle(node);
+ if (!hasContent && cStyle != null) {
+ // console.log(cStyle.backgroundImage);
+ // console.log(cStyle.content)
+ hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && RPTUtil.attributeNonEmpty(node, "alt");
+ }
+ }
+ }
+ }
+ }
+ // Check for cases where there is text node after an element under the parent
+ // In the case we detect nodetype as text node and the patent of the text node is
+ // the same element we are checking has Inner content for then get the inner content of this
+ // text node.
+ if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextEmpty(node);
+ }
+ }
+ }
+ // In the case there are no child elements then we can simply perform the check for only innertext
+ // the img with alt case will be covered in the above if, as img is considers as an element.
+ else {
+ // Check if the innerText of the element is empty or not
+ hasContent = !RPTUtil.isInnerTextEmpty(element);
+ }
+ return hasContent;
+ };
+ RPTUtil.hasInnerContentOrAlt = function (element) {
+ var text = RPTUtil.getInnerText(element);
+ var hasContent = (text != null && text.trim().length > 0) || RPTUtil.attributeNonEmpty(element, "alt");
+ if (element.firstChild != null) {
+ var nw = new NodeWalker(element);
+ while (!hasContent && nw.nextNode() && nw.node != element) {
+ hasContent = (nw.node.nodeName.toLowerCase() === "img" &&
+ RPTUtil.attributeNonEmpty(nw.node, "alt"));
+ if (!hasContent
+ && (RPTUtil.hasRole(nw.node, "button", true) || RPTUtil.hasRole(nw.node, "textbox"))
+ && (RPTUtil.hasAriaLabel(nw.node) || RPTUtil.attributeNonEmpty(nw.node, "title") || RPTUtil.getLabelForElementHidden(nw.elem(), true))) {
+ hasContent = true;
+ }
+ }
+ }
+ return hasContent;
+ };
+ RPTUtil.concatUniqueArrayItem = function (item, arr) {
+ arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false;
+ return arr;
+ };
+ RPTUtil.concatUniqueArrayItemList = function (itemList, arr) {
+ for (var i = 0; itemList !== null && i < itemList.length; i++) {
+ arr = RPTUtil.concatUniqueArrayItem(itemList[i], arr);
+ }
+ return arr;
+ };
+ /**
+ * remove array items from a given array
+ * @param itemList items to be removed from arr
+ * @param arr the array
+ * @returns
+ */
+ RPTUtil.reduceArrayItemList = function (itemList, arr) {
+ if (arr && arr.length > 0 && itemList && itemList.length > 0) {
+ var result = arr.filter(function (value) {
+ return !itemList.includes(value);
+ });
+ return result;
+ }
+ return arr;
+ };
+ /**
+ * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML
+ * @param ruleContext the HTML element to be examined
+ * @returns
+ */
+ RPTUtil.getElementAriaProperty = function (ruleContext) {
+ var tagProperty = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_ElementAriaProperty", null);
+ if (!tagProperty) {
+ var tagName = null;
+ var name_1 = null;
+ if (ruleContext.tagName) {
+ tagName = ruleContext.tagName.toLowerCase();
+ }
+ else if (ruleContext.nodeName) {
+ tagName = ruleContext.nodeName.toLowerCase();
+ }
+ // check if the tagProperty exists in the documentConformanceRequirement hash.
+ tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName];
+ // The tag needs to check some special attributes
+ if (tagProperty === null || tagProperty === undefined) {
+ var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName];
+ switch (tagName) { // special cases
+ case "a":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "area":
+ RPTUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"];
+ break;
+ case "figure": {
+ var fcs = RPTUtil.getChildByTag(ruleContext, "figcaption");
+ fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"];
+ break;
+ }
+ case "footer":
+ case "header":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "article", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null
+ || RPTUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "region", true) !== null
+ || RPTUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null)
+ tagProperty = specialTagProperties["des-section-article-aside-main-nav"];
+ else
+ tagProperty = specialTagProperties["other"];
+ break;
+ case "img":
+ if (ruleContext.hasAttribute("alt")) {
+ ruleContext.getAttribute("alt").trim() === "" ? tagProperty = specialTagProperties["img-with-empty-alt"] : tagProperty = specialTagProperties["img-with-alt-text"];
+ }
+ else {
+ RPTUtil.hasAriaLabel(ruleContext) ? tagProperty = specialTagProperties["img-with-alt-text"] : tagProperty = specialTagProperties["img-without-alt"];
+ }
+ break;
+ case "input":
+ if (RPTUtil.attributeNonEmpty(ruleContext, "type")) {
+ var type = ruleContext.getAttribute("type").trim().toLowerCase();
+ tagProperty = specialTagProperties[type];
+ if (tagProperty === null || tagProperty === undefined) {
+ switch (type) {
+ case "checkbox":
+ RPTUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"];
+ break;
+ case "email":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"];
+ break;
+ case "search":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"];
+ break;
+ case "tel":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"];
+ break;
+ case "text":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"];
+ break;
+ case "url":
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"];
+ break;
+ default:
+ // default
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"];
+ break;
+ }
+ }
+ }
+ else {
+ // default type is the same as type=text
+ RPTUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"];
+ }
+ break;
+ case "li":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"];
+ if (ruleContext.parentElement && RPTUtil.hasRoleInSemantics(ruleContext.parentElement, "list"))
+ tagProperty = specialTagProperties["child-of-list-role"];
+ else
+ tagProperty = specialTagProperties["no-child-of-list-role"];
+ break;
+ case "section":
+ name_1 = ARIAMapper_1.ARIAMapper.computeName(ruleContext);
+ if (name_1 && name_1.trim().length > 0) {
+ tagProperty = specialTagProperties["with-name"];
+ }
+ else {
+ tagProperty = specialTagProperties["without-name"];
+ }
+ break;
+ case "select":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"];
+ if (ruleContext.hasAttribute("multiple") ||
+ RPTUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1)
+ tagProperty = specialTagProperties["multiple-attr-size-gt1"];
+ else
+ tagProperty = specialTagProperties["no-multiple-attr-size-gt1"];
+ break;
+ case "summary":
+ specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"];
+ if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details'
+ && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext))
+ tagProperty = specialTagProperties["first-summary-of-detail"];
+ else
+ tagProperty = specialTagProperties["no-first-summary-of-detail"];
+ break;
+ case "tbody":
+ case "td":
+ case "tr":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null) {
+ tagProperty = specialTagProperties["des-table"];
+ }
+ else {
+ RPTUtil.getAncestorWithRole(ruleContext, "grid", true) || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"];
+ }
+ break;
+ case "th":
+ if (RPTUtil.getAncestorWithRole(ruleContext, "table", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) {
+ var scope = RPTUtil.getScopeForTh(ruleContext);
+ if (scope === 'column')
+ tagProperty = specialTagProperties["des-table-grid-treegrid-column-scope"];
+ else
+ tagProperty = specialTagProperties["des-table-grid-treegrid-row-scope"];
+ }
+ else {
+ tagProperty = specialTagProperties["des-other"];
+ }
+ break;
+ case "div":
+ var prt = ruleContext.parentElement;
+ prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"];
+ break;
+ default:
+ tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"];
+ } //switch
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_ElementAriaProperty", tagProperty);
+ return tagProperty || null;
+ };
+ RPTUtil.getScopeForTh = function (element) {
+ /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics
+ * A header cell anchored at the slot with coordinate (x, y) with width width and height height is
+ * said to be a column header if any of the following conditions are true:
+ * * The cell's scope attribute is in the column state, or
+ * * The cell's scope attribute is in the auto state, and there are no data cells in any of
+ * the cells covering slots with y-coordinates y .. y+height-1.
+ * A header cell anchored at the slot with coordinate (x, y) with width width and height height is
+ * said to be a row header if any of the following conditions are true:
+ * * The cell's scope attribute is in the row state, or
+ * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are
+ * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1.
+ */
+ // Note: auto is default scope
+ // Easiest answer is if scope is specified
+ if (element.hasAttribute("scope")) {
+ var scope = element.getAttribute("scope").toLowerCase();
+ if (scope === "row" || scope === 'rowgroup')
+ return "row";
+ if (scope === "col" || scope === 'colgroup')
+ return "column";
+ }
+ // scope is auto, default (without a scope) or invalid value.
+ // if all the sibling elements are th, then return "columnheader"
+ var siblings = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); };
+ if (siblings === null || siblings.length === 0)
+ return "column";
+ else
+ return "row";
+ };
+ RPTUtil.getAllowedAriaRoles = function (ruleContext, properties) {
+ var allowedRoles = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_AllowedAriaRoles", null);
+ if (!allowedRoles) {
+ allowedRoles = [];
+ var tagProperty = null;
+ if (properties !== null && properties !== undefined) {
+ tagProperty = properties;
+ }
+ else {
+ tagProperty = RPTUtil.getElementAriaProperty(ruleContext);
+ }
+ if (tagProperty !== null && tagProperty !== undefined) {
+ if (tagProperty.implicitRole !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles);
+ }
+ if (tagProperty.validRoles !== null) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ var implicitRoles = RPTUtil.getImplicitRole(ruleContext);
+ if (implicitRoles && implicitRoles.length > 0) {
+ RPTUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles);
+ }
+ }
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_AllowedAriaRoles", allowedRoles);
+ }
+ return allowedRoles;
+ };
+ RPTUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) {
+ var allowedAttributes = (0, CacheUtil_1.getCache)(ruleContext, "RPTUtil_AllowedAriaAttributes", null);
+ if (!allowedAttributes) {
+ allowedAttributes = [];
+ var permittedRoles = __spreadArray([], roles, true);
+ var tagName = ruleContext.tagName.toLowerCase();
+ var prohibitedAttributes = [];
+ // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) {
+ // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes);
+ }
+ // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) {
+ // Use the aria-required attribute on any element that is allowed the required attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-required", allowedAttributes);
+ }
+ if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) {
+ // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5.
+ allowedAttributes = RPTUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes);
+ }
+ var tagProperty = null;
+ if (properties != null && properties !== undefined)
+ tagProperty = properties;
+ else
+ tagProperty = RPTUtil.getElementAriaProperty(ruleContext);
+ if (tagProperty !== null && tagProperty !== undefined) {
+ // add the implicit role allowed attributes to the allowed role list if there is no specified role
+ // ignore if the element doesn't allow the attributes from the implicit roles
+ if (tagProperty.implicitRole !== null &&
+ (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0)
+ && tagProperty.allowAttributesFromImplicitRole === undefined) {
+ for (var i = 0; i < tagProperty.implicitRole.length; i++) {
+ var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]];
+ if (roleProperty !== null && roleProperty !== undefined) {
+ var properties_1 = roleProperty.props;
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ properties_1 = RPTUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext);
+ RPTUtil.concatUniqueArrayItemList(properties_1, allowedAttributes);
+ var prohibitedProps = roleProperty.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case of separator
+ if (tagProperty.implicitRole[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes);
+ }
+ }
+ }
+ }
+ // Adding the global properties to the valid attribute list
+ if (tagProperty.globalAriaAttributesValid) {
+ var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties
+ RPTUtil.concatUniqueArrayItemList(properties_2, allowedAttributes);
+ }
+ }
+ // adding the other role to the allowed roles for the attributes
+ if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0)
+ RPTUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles);
+ // adding the specified role properties to the allowed attribute list
+ for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) {
+ var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]];
+ if (roleProperties !== null && roleProperties !== undefined) {
+ // ignore the properties if the element doesn't allow attributes from the implicit role
+ if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) {
+ var properties_3 = roleProperties.props; // allowed properties
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ properties_3 = RPTUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties
+ RPTUtil.concatUniqueArrayItemList(properties_3, allowedAttributes);
+ }
+ var prohibitedProps = roleProperties.prohibitedProps;
+ if (prohibitedProps && prohibitedProps.length > 0)
+ RPTUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes);
+ // special case for separator
+ if (permittedRoles[i] === "separator" && RPTUtil.isFocusable(ruleContext)) {
+ RPTUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes);
+ }
+ }
+ }
+ // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid
+ if (permittedRoles.includes("row") && RPTUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) {
+ var index = -1;
+ if ((index = allowedAttributes.indexOf("aria-level")) > -1)
+ allowedAttributes.splice(index, 1);
+ if ((index = allowedAttributes.indexOf("aria-setsize")) > -1)
+ allowedAttributes.splice(index, 1);
+ if ((index = allowedAttributes.indexOf("aria-posinset")) > -1)
+ allowedAttributes.splice(index, 1);
+ }
+ // add the other allowed attributes for the element
+ if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) {
+ // check attribute-value pair if exists
+ var allowed = [];
+ for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) {
+ var attr = tagProperty.otherAllowedAriaAttributes[p];
+ if (attr.includes("=")) {
+ var pair = attr.split("=");
+ if (ruleContext.getAttribute(pair[0]) === pair[1])
+ allowed.push(pair[0]);
+ }
+ else
+ allowed.push(attr);
+ }
+ if (allowed.length > 0)
+ RPTUtil.concatUniqueArrayItemList(allowed, allowedAttributes);
+ }
+ // add the other prohibitted attributes for the element
+ if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) {
+ // check attribute-value pair if exists
+ var disallowed = [];
+ for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) {
+ var attr = tagProperty.otherDisallowedAriaAttributes[p];
+ if (attr.includes("=")) {
+ var pair = attr.split("=");
+ if (ruleContext.getAttribute(pair[0]) === pair[1])
+ disallowed.push(pair[0]);
+ }
+ else
+ disallowed.push(attr);
+ }
+ if (disallowed.length > 0)
+ RPTUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes);
+ }
+ //exclude the prohibitedAttributes from the allowedAttributes
+ allowedAttributes = RPTUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes);
+ //exclude aria attribute for elements without implicit role and with 'Naming Prohibited'
+ if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole)
+ allowedAttributes = RPTUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes);
+ (0, CacheUtil_1.setCache)(ruleContext, "RPTUtil_AllowedAriaAttributes", allowedAttributes);
+ }
+ return allowedAttributes;
+ };
+ /**
+ *
+ * @param ariaAttr
+ * @param htmlAttrs
+ * @type: conflict or overlapping
+ * @returns htmlAttrName, 'Pass' or null
+ * htmlAttrName that conflicts with the ariaAttr,
+ * 'Pass' with no conflict with the ariaAttr,
+ * or null where ariaAttr won't cause conflict
+ */
+ RPTUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) {
+ var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']];
+ if (exist) {
+ var examinedHtmlAtrNames = [];
+ var ariaAttrValue = '';
+ if (type === 'conflict') {
+ if (!exist.conflict)
+ return null;
+ ariaAttrValue = exist.conflict.ariaAttributeValue;
+ }
+ else if (type === 'overlapping') {
+ if (!exist.overlapping)
+ return null;
+ ariaAttrValue = exist.overlapping.ariaAttributeValue;
+ }
+ else
+ return null;
+ if (ariaAttrValue === null || ariaAttrValue === 'VALUE' || ariaAttrValue === ariaAttr['value']) {
+ var htmlAttrNames = [];
+ var htmlAttrValues = [];
+ if (type === 'conflict') {
+ htmlAttrNames = exist.conflict.htmlAttributeNames;
+ htmlAttrValues = exist.conflict.htmlAttributeValues;
+ }
+ else {
+ htmlAttrNames = exist.overlapping.htmlAttributeNames;
+ htmlAttrValues = exist.overlapping.htmlAttributeValues;
+ }
+ for (var i = 0; i < htmlAttrs.length; i++) {
+ var index = htmlAttrNames.indexOf(htmlAttrs[i]['name']);
+ if (index !== -1) {
+ if (htmlAttrValues === null
+ || (ariaAttrValue === 'VALUE' && htmlAttrValues[index] === 'VALUE' && htmlAttrs[i]['value'] !== ariaAttr['value'])
+ || htmlAttrs[i]['value'] === htmlAttrValues[index]) {
+ examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] });
+ continue;
+ }
+ else
+ examinedHtmlAtrNames.push({ result: 'Pass', 'attr': htmlAttrs[i]['name'] });
+ }
+ }
+ }
+ return examinedHtmlAtrNames;
+ }
+ else
+ return null;
+ };
+ RPTUtil.containsPresentationalChildrenOnly = function (elem) {
+ var roles = RPTUtil.getRoles(elem, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = RPTUtil.getImplicitRole(elem);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return false;
+ for (var i = 0; roles !== null && i < roles.length; i++) {
+ var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]];
+ if (roleProperties !== null && roleProperties !== undefined) {
+ var presentional = roleProperties.presentationalChildren;
+ if (presentional === true)
+ return true;
+ }
+ }
+ return false;
+ };
+ RPTUtil.shouldBePresentationalChild = function (element) {
+ var walkNode = DOMWalker_1.DOMWalker.parentElement(element);
+ while (walkNode) {
+ if (RPTUtil.containsPresentationalChildrenOnly(walkNode))
+ return true;
+ //aria-own case: if the element is referred by an aria-won
+ walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ return false;
+ };
+ /** moved to CSSUtil
+ public static CSS(element) {
+ let styleText = "";
+ if (element === null) return [];
+ if (element.IBM_CSS_THB) return element.IBM_CSS_THB;
+ let nodeName = element.nodeName.toLowerCase();
+ if (nodeName === "style") {
+ styleText = RPTUtil.getInnerText(element);
+ } else if (element.hasAttribute("style")) {
+ styleText = element.getAttribute("style");
+ } else return [];
+ if (styleText === null || styleText.trim().length === 0) return [];
+ //remove comment blocks
+ let re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.* /g;
+ let subst = ' ';
+ styleText = styleText.replace(re, subst);
+ // Find all "key : val;" pairs with various whitespace inbetween
+ let rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g;
+ // Find all "selector { csskeyvals } with various whitespace inbetween
+ let rSelectors = /\s*([^{]*){([^}]*)}/g;
+ if (styleText.indexOf("{") === -1) {
+
+ let keyVals = {};
+ let m;
+ while ((m = rKeyVals.exec(styleText)) != null) {
+ keyVals[m[1]] = m[2].trim().toLowerCase();
+ }
+ let retVal = [{
+ selector: null,
+ values: keyVals
+ }];
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ } else {
+ let retVal = [];
+ let m;
+ let m2;
+ while ((m = rSelectors.exec(styleText)) != null) {
+ let keyVals = {}
+ let selKey = m[1];
+ let selVal = m[2];
+
+ while ((m2 = rKeyVals.exec(selVal)) != null) {
+ keyVals[m2[1]] = m2[2].trim().toLowerCase();
+ }
+ retVal.push({
+ selector: selKey,
+ values: keyVals
+ });
+ }
+ element.IBM_CSS_THB = retVal;
+ return retVal;
+ }
+ }
+ */
+ RPTUtil.getControlOfLabel = function (node) {
+ // Handle the easy case of label -> for
+ var labelAncestor = RPTUtil.getAncestor(node, "label");
+ if (labelAncestor) {
+ if (labelAncestor.hasAttribute("for")) {
+ return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for"));
+ }
+ }
+ // Create a dictionary containing ids of parent nodes
+ var idDict = {};
+ var parentWalk = node;
+ while (parentWalk) {
+ if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var ancestor = parentWalk;
+ if (ancestor.hasAttribute("id")) {
+ idDict[ancestor.getAttribute("id")] = true;
+ }
+ }
+ parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk);
+ }
+ // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids
+ var inputsUsingLabelledBy = node.ownerDocument.querySelectorAll("*[aria-labelledby]");
+ for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) {
+ var inputUsingLabelledBy = inputsUsingLabelledBy[idx];
+ var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby");
+ var sp = ariaLabelledBy.split(" ");
+ for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) {
+ var id = sp_1[_i];
+ if (id in idDict && !RPTUtil.isIdReferToSelf(node, node.getAttribute("aria-labelledby"))) {
+ return inputUsingLabelledBy;
+ }
+ }
+ }
+ // Find the cases where we're within an aria labelledby
+ return null;
+ };
+ /**
+ * This function is responsible for checking if the node that is provied is
+ * disabled or not. Following is how the check is performed:
+ * 1. Check if the current node is disabled with the following options:
+ * attribute --> disabled
+ * Also needs to be "button", "input", "select", "textarea", "optgroup", "option",
+ * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled)
+ * attribute --> aria-disabled="true"
+ * 2. Check if any of the current nodes parents are disabled with the same
+ * options listed in 1.
+ *
+ * Note: If either current node or any of the parent nodes are disabled then this
+ * function will return true (node is disabled).
+ *
+ * @parm {HTMLElement} node - The node which should be checked if it is disabled or not.
+ * @return {bool} true if the node is disabled, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.isNodeDisabled = function (node) {
+ // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to
+ // true when we detect that the node is disabled. We have to set it to false so that we know
+ // the node has already been checked. Only set it to false if the setting is undefined or null
+ // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it
+ // to speed up the check.
+ var PT_NODE_DISABLED = (0, CacheUtil_1.getCache)(node, "PT_NODE_DISABLED", false);
+ // Check the nodeType of this node, if this node is a text node then
+ // we get the parentnode and set that as the node as a text nodes,
+ // disabled is directly related to the parent node.
+ if (node.nodeType === 3) {
+ node = DOMWalker_1.DOMWalker.parentNode(node);
+ }
+ // Variable Declaration
+ var nodeName = node.nodeName.toLowerCase();
+ // Get the disabled element property, disabled and aria-disabled attribute and check that it is true
+ var disabledAttribute = node.hasAttribute("disabled");
+ var disabledPropertyCustom = PT_NODE_DISABLED;
+ var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true';
+ // If this node has disabled attribute and the node allows disabled attribute, then return true.
+ // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset"
+ // In the case aria-disabled is set to true, then also return true
+ if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) {
+ PT_NODE_DISABLED = true;
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_DISABLED", PT_NODE_DISABLED);
+ return true;
+ }
+ // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have
+ // disabled attribute. Only keep checking until we are all the way back to the parentNode
+ // element.
+ var parentElement = DOMWalker_1.DOMWalker.parentNode(node);
+ // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check
+ // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not
+ // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with
+ // child node.
+ if (parentElement != null && parentElement.nodeType === 1) {
+ // Check upwards recursively, and save the results in an variable
+ var nodeDisabled = RPTUtil.isNodeDisabled(parentElement);
+ // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true.
+ // so that we can use this next time, to quickly determine if node is disabled or not.
+ // This is extra percaution, the isNodeDisabled function already sets this.
+ if (nodeDisabled) {
+ PT_NODE_DISABLED = true;
+ }
+ // Check upwards recursively
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_DISABLED", PT_NODE_DISABLED);
+ return nodeDisabled;
+ }
+ // Return false (node is not disabled)
+ return false;
+ };
+ /**
+ * This function is responsible for determine if hidden content should be checked
+ * in rules.
+ *
+ * @parm {element} node - A node so that the document can be accessed to check for the
+ * option. Can be document element or a simple node element.
+ * @return {bool} true if hidden content should be checked, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.shouldCheckHiddenContent = function (node) {
+ return false;
+ };
+ /**
+ * This function is responsible for determining if node should be skipped from checking or not, based
+ * on the Check Hidden Content settings and if the node is visible or not.
+ *
+ * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content
+ * setting.
+ *
+ * @return {bool} true if node should be skipped, false otherwise
+ *
+ * @memberOf RPTUtil
+ */
+ RPTUtil.shouldNodeBeSkippedHidden = function (node) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we
+ // return true to identify that the node should not be scanned/added to any hash/array.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (!RPTUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) {
+ return true;
+ }
+ return false;
+ };
+ RPTUtil.isfocusableByDefault = function (node) {
+ var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area'];
+ if (node.nodeName.toLowerCase() === "a" && RPTUtil.hasAttribute(node, 'href'))
+ return true;
+ if (node.nodeName.toLowerCase() === "area" && RPTUtil.hasAttribute(node, 'href'))
+ return true;
+ if (focusableElements.indexOf(node.nodeName.toLowerCase()) != -1)
+ return true;
+ return false;
+ };
+ /**
+ * This function check if a non-tabable node has valid tabable content.
+ * If it is tabable (the tabindex is not speicified or is not -1), returns false;
+ * If it is non-tabable, but a child is tabable and does not have element content, returns false;
+ * Otherwise, returns true.
+ */
+ RPTUtil.nonTabableChildCheck = function (element) {
+ if (!element.hasAttribute("tabindex") ||
+ (parseInt(element.getAttribute("tabindex")) != -1)) {
+ return false;
+ }
+ var nw = new NodeWalker(element);
+ while (nw.nextNode()) {
+ var child = nw.elem();
+ if (child === null) { // Text node. usually is a cartridge return.
+ continue;
+ }
+ if (child.hasAttribute("tabindex") &&
+ (parseInt(child.getAttribute("tabindex")) != -1) &&
+ !RPTUtil.hasInnerContent(child)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ RPTUtil.hasAttribute = function (element, attributeName) {
+ var hasAttribute = false;
+ if (element.hasAttribute) {
+ hasAttribute = element.hasAttribute(attributeName);
+ }
+ else if (element.attributes && element.attributes.getNamedItem) {
+ var attr = element.attributes.getNamedItem(attributeName);
+ hasAttribute = attr && attr.specified;
+ }
+ return hasAttribute;
+ };
+ // This list contains a list of elements tags which have display: none by default, since we have rules triggering
+ RPTUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index'];
+ // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden
+ // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always
+ // pass theses rules no matter what the Check Hidden Content Setting is.
+ RPTUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId'];
+ // https://www.w3.org/TR/wai-aria-1.1/#introstates
+ RPTUtil.ariaAttributeRoleDefaults = {
+ "alert": {
+ "aria-live": "assertive",
+ "aria-atomic": "true"
+ },
+ "combobox": {
+ "aria-haspopup": "listbox"
+ },
+ "listbox": {
+ "aria-orientation": "vertical"
+ },
+ "log": {
+ "aria-live": "polite"
+ },
+ "menu": {
+ "aria-orientation": "vertical"
+ },
+ "menubar": {
+ "aria-orientation": "horizontal"
+ },
+ "meter": {
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "option": {
+ "aria-selected": "false"
+ },
+ "progressbar": {
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "scrollbar": {
+ "aria-orientation": "vertical",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "separator": {
+ "aria-orientation": "horizontal",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "slider": {
+ "aria-orientation": "horizontal",
+ "aria-valuemin": "0",
+ "aria-valuemax": "100"
+ },
+ "spinbutton": {
+ // Not sure how to encode min/max (or now in 1.2 - "has no value")
+ //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec
+ // Probably just delete spinbutton from this list completely and let user agents handle "defaults"
+ },
+ "status": {
+ "aria-live": "polite",
+ "aria-atomic": "true"
+ },
+ "tab": {
+ "aria-selected": "false"
+ },
+ "tablist": {
+ "aria-orientation": "horizontal"
+ },
+ "toolbar": {
+ "aria-orientation": "horizontal"
+ },
+ "tree": {
+ "aria-orientation": "vertical"
+ }
+ };
+ // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic
+ RPTUtil.ariaAttributeGlobalDefaults = {
+ "aria-atomic": "false",
+ "aria-autocomplete": "none",
+ "aria-busy": "false",
+ "aria-checked": undefined,
+ "aria-current": "false",
+ "aria-disabled": "false",
+ "aria-dropeffect": "none",
+ "aria-expanded": undefined,
+ "aria-grabbed": undefined,
+ "aria-haspopup": "false",
+ "aria-hidden": undefined,
+ "aria-invalid": "false",
+ "aria-live": "off",
+ "aria-modal": "false",
+ "aria-multiline": "false",
+ "aria-multiselectable": "false",
+ "aria-orientation": undefined,
+ "aria-pressed": undefined,
+ "aria-readonly": "false",
+ //"aria-relevant": "additions text", TODO: are multiple values supported?
+ "aria-required": "false",
+ "aria-selected": undefined,
+ "aria-sort": "none"
+ };
+ // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings
+ RPTUtil.ariaAttributeImplicitMappings = {
+ "aria-autocomplete": {
+ "form": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "input": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "select": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ },
+ "textarea": function (e) {
+ return "off" === e.getAttribute("autocomplete") ? "none" : "both";
+ }
+ },
+ "aria-checked": {
+ "input": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ return "" + e.hasAttribute("checked");
+ },
+ "menuitem": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ return "" + e.hasAttribute("checked");
+ },
+ "*": function (e) {
+ if (e.hasAttribute("indeterminate"))
+ return "mixed";
+ },
+ },
+ "aria-disabled": {
+ "button": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "fieldset": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "input": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "optgroup": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "option": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "select": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ },
+ "textarea": function (e) {
+ return e.hasAttribute("disabled") ? "true" : "false";
+ }
+ },
+ "aria-expanded": {
+ "details": function (e) {
+ return e.getAttribute("open");
+ },
+ "dialog": function (e) {
+ return e.getAttribute("open");
+ }
+ },
+ "aria-multiselectable": {
+ "select": function (e) {
+ if (e.hasAttribute("multiple"))
+ return "true";
+ return;
+ }
+ },
+ "aria-placeholder": {
+ "input": function (e) {
+ return e.getAttribute("placeholder");
+ },
+ "textarea": function (e) {
+ return e.getAttribute("placeholder");
+ }
+ },
+ "aria-required": {
+ "input": function (e) {
+ return e.getAttribute("required");
+ },
+ "select": function (e) {
+ return e.getAttribute("required");
+ },
+ "textarea": function (e) {
+ return e.getAttribute("required");
+ }
+ }
+ };
+ RPTUtil.tabTagMap = {
+ "button": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "iframe": true,
+ "input": function (element) {
+ return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled");
+ },
+ "select": function (element) {
+ return !element.hasAttribute("disabled");
+ },
+ "textarea": true,
+ "div": function (element) {
+ return element.hasAttribute("contenteditable");
+ },
+ "a": function (element) {
+ // xlink:href?? see svg
+ return element.hasAttribute("href");
+ },
+ "area": function (element) {
+ return element.hasAttribute("href");
+ },
+ "audio": function (element) {
+ return element.hasAttribute("controls");
+ },
+ "video": function (element) {
+ return element.hasAttribute("controls");
+ },
+ "summary": function (element) {
+ // first summary child of a details element is automatically focusable
+ return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details'
+ && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element);
+ },
+ "details": function (element) {
+ //details element without a direct summary child is automatically focusable
+ return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0;
+ }
+ };
+ return RPTUtil;
+}());
+exports.RPTUtil = RPTUtil;
+/** moved to CSSUtil
+export class RPTUtilStyle {
+ public static getWeightNumber(styleVal) {
+ let map = {
+ "light": 100,
+ "bold": 700
+ };
+ let retVal = parseInt(styleVal);
+ if (retVal) return retVal;
+ if (styleVal in map)
+ return map[styleVal];
+ return 400;
+ }
+
+ public static getFontInPixels = function (styleVal) {
+ let map = {
+ "xx-small": 16,
+ "x-small": 10,
+ "small": 13,
+ "medium": 16,
+ "large": 18,
+ "x-large": 24,
+ "xx-large": 32
+ };
+ let value = parseFloat(styleVal);
+ if (!value) {
+ return map[styleVal];
+ }
+ let units = styleVal.substring(("" + value).length);
+ if (units === "" || units === "px") return value;
+ if (units === "em") return value * 16;
+ if (units === "%") return value / 100 * 16;
+ if (units === "pt") return value * 4 / 3;
+ return Math.round(value);
+ }
+}
+*/
+/* Return a node walker for the given element.
+ * bEnd is optional and defaults to false
+ * but if true, indicates the node is the end node*/
+var NodeWalker = /** @class */ (function () {
+ function NodeWalker(node, bEnd) {
+ this.node = node;
+ this.bEndTag = (bEnd === undefined ? false : bEnd === true);
+ }
+ NodeWalker.prototype.elem = function () {
+ return this.node.nodeType === 1 && this.node || null;
+ };
+ NodeWalker.prototype.nextNode = function () {
+ if (!this.node) {
+ this.bEndTag = false;
+ return false;
+ }
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.nwOwnerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = 0;
+ }
+ else if (this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ return this.nextNode();
+ }
+ }
+ else {
+ if (this.node.nwSlotOwner) {
+ var slotOwner = this.node.nwSlotOwner;
+ var nextSlotIndex = this.node.nwSlotIndex + 1;
+ delete this.node.nwSlotOwner;
+ delete this.node.nwSlotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.nwSlotOwner = slotOwner;
+ this.node.nwSlotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.nwOwnerElement) {
+ this.node = this.node.nwOwnerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+ };
+ NodeWalker.prototype.prevNode = function () {
+ if (this.bEndTag && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ this.bEndTag = true;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ if (this.bEndTag && (this.node.firstChild === null || typeof (this.node.firstChild) === 'undefined'))
+ this.bEndTag = false;
+ return true;
+ };
+ return NodeWalker;
+}());
+exports.NodeWalker = NodeWalker;
+
+
+/***/ }),
+
+/***/ 1794:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.CommonMapper = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var CommonMapper = /** @class */ (function () {
+ function CommonMapper() {
+ this.hierarchyRole = null;
+ this.hierarchyPath = null;
+ this.hierarchyResults = null;
+ }
+ CommonMapper.prototype.getBounds = function (node) {
+ return null;
+ };
+ CommonMapper.prototype.reset = function (node) {
+ this.hierarchyRole = [];
+ this.hierarchyResults = [];
+ this.hierarchyPath = [{
+ rolePath: "",
+ roleCount: {}
+ }];
+ var ancestors = [];
+ var parent = DOMWalker_1.DOMWalker.parentNode(node);
+ while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) {
+ ancestors.push(parent);
+ parent = DOMWalker_1.DOMWalker.parentNode(parent);
+ }
+ ancestors = ancestors.reverse();
+ for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) {
+ var ancestor = ancestors_1[_i];
+ var siblings = [];
+ var sibling = ancestor.previousSibling;
+ while (sibling) {
+ siblings.push(sibling);
+ sibling = sibling.previousSibling;
+ }
+ siblings = siblings.reverse();
+ for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) {
+ var sibling_1 = siblings_1[_a];
+ this.pushHierarchy(sibling_1);
+ this.popHierarchy();
+ }
+ this.pushHierarchy(ancestor);
+ }
+ };
+ CommonMapper.prototype.pushHierarchy = function (node) {
+ var role = this.getRole(node) || "none";
+ this.hierarchyRole.push(role);
+ if (role !== "none") {
+ var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1];
+ parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1;
+ this.hierarchyPath.push({
+ "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]",
+ "roleCount": {}
+ });
+ }
+ var attr = {};
+ if (node.nodeType === 1) {
+ attr = this.getAttributes(node);
+ }
+ this.hierarchyResults.push({
+ node: node,
+ namespace: this.getNamespace(),
+ role: role,
+ attributes: attr,
+ rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath,
+ bounds: this.getBounds(node)
+ });
+ };
+ CommonMapper.prototype.popHierarchy = function () {
+ var role = this.hierarchyRole.pop();
+ if (role !== "none") {
+ this.hierarchyPath.pop();
+ }
+ this.hierarchyResults.pop();
+ };
+ CommonMapper.prototype.openScope = function (node) {
+ if (this.hierarchyRole === null) {
+ this.reset(node);
+ }
+ this.pushHierarchy(node);
+ return this.hierarchyResults;
+ };
+ CommonMapper.prototype.closeScope = function (node) {
+ var retVal = [];
+ for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) {
+ var res = _a[_i];
+ // const temp = res.node;
+ // res.node = null;
+ // let cloned = JSON.parse(JSON.stringify(res));
+ // cloned.node = res.node = temp;
+ // retVal.push(cloned);
+ retVal.push(res);
+ }
+ retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role;
+ this.popHierarchy();
+ return retVal;
+ };
+ return CommonMapper;
+}());
+exports.CommonMapper = CommonMapper;
+
+
+/***/ }),
+
+/***/ 2306:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Context = exports.PartInfo = exports.AttrInfo = void 0;
+// Context that will cause this rule to execute.
+// Context syntax:
+// Triggers:
+// aria:role - Triggers on element with ARIA role role
+// aria:role[attribute] - Triggers on elements with the equivalent logical
+// aria- attribute (e.g., button[disabled] will trigger on
+// or )
+// role[attribute=value] - Similar to above, with case-sensitive match
+// to value
+// role[attribute~value] - Similar to above, with case-insensitive match
+// dom:element - Triggers on an element with the specified name
+// dom:element[attribute] - Triggers on a dom element with the specified attribute
+// dom:*[attribute] - Triggers on all elements with the specified attribute
+// Combining triggers:
+// trigger1 trigger2 - Triggers on elements with trigger2 within an
+// element with trigger1
+// !trigger1 trigger2 - Triggers on elements with trigger2 not within
+// element with trigger1
+// trigger1>trigger2 - Triggers on elements with trigger2 with an
+// an immediate parent with trigger1
+// trigger1+trigger2 - Triggers on elements with trigger2 with an
+// immediate previous sibling with trigger1
+// trigger1~trigger2 - Triggers on elements with trigger2 with an
+// some earlier sibling with trigger1
+// context,context - Triggers on elements with either context
+var AttrInfo = /** @class */ (function () {
+ function AttrInfo(inclusive, attr, eq, value) {
+ this.inclusive = inclusive;
+ this.attr = attr;
+ this.eq = eq;
+ this.value = value;
+ if (!inclusive
+ && ((typeof eq) !== "undefined" && eq.length > 0)) {
+ throw new Error("Cannot have !attr" + eq + " context");
+ }
+ if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) {
+ throw new Error("Cannot have equivalence check without a value");
+ }
+ }
+ AttrInfo.prototype.matches = function (context) {
+ var ruleAttrPart = this;
+ var elemAttrs = context.attributes;
+ if (!(ruleAttrPart.attr in elemAttrs)) {
+ return !ruleAttrPart.inclusive;
+ }
+ else if (!ruleAttrPart.inclusive) {
+ return false;
+ }
+ else if (!ruleAttrPart.eq) {
+ // inclusive match and I have that attribute and no equivalence defined
+ return true;
+ }
+ else {
+ // inclusive match and I have that attribute and equivalence defined
+ var attrValue = elemAttrs[ruleAttrPart.attr];
+ if (ruleAttrPart.eq === "=") {
+ return ruleAttrPart.value === attrValue;
+ }
+ else if (ruleAttrPart.eq === "!=") {
+ return ruleAttrPart.value !== attrValue;
+ }
+ else if (ruleAttrPart.eq === "~") {
+ return ruleAttrPart.value === attrValue;
+ }
+ else if (ruleAttrPart.eq === "!~") {
+ return ruleAttrPart.value !== attrValue;
+ }
+ else {
+ throw new Error("Context equivalence operator not supported");
+ }
+ }
+ };
+ return AttrInfo;
+}());
+exports.AttrInfo = AttrInfo;
+var PartInfo = /** @class */ (function () {
+ function PartInfo(inclusive, namespace, role, attrs, connector) {
+ this.inclusive = inclusive;
+ this.namespace = namespace;
+ this.role = role;
+ this.attrs = attrs;
+ this.connector = connector;
+ if (role === "*" && !inclusive) {
+ throw new Error("!* context not supported");
+ }
+ }
+ PartInfo.prototype.matches = function (contextHier, hierLevel) {
+ var rulePart = this;
+ var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel]
+ && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role
+ || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*");
+ if (ruleRoleMatch
+ && rulePart.role === "*"
+ && rulePart.namespace === "dom"
+ && (contextHier[rulePart.namespace][hierLevel].role === "#text"
+ || contextHier[rulePart.namespace][hierLevel].role === "/#text")) {
+ ruleRoleMatch = false;
+ }
+ if (rulePart.inclusive && !ruleRoleMatch)
+ return false;
+ if (!rulePart.inclusive && !ruleRoleMatch)
+ return true;
+ // Match the attributes
+ var ruleAttrs = rulePart.attrs;
+ var elemContext = contextHier[rulePart.namespace][hierLevel];
+ var match = true;
+ for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) {
+ var ruleAttrPart = ruleAttrs_1[_i];
+ match = match && ruleAttrPart.matches(elemContext);
+ }
+ if (!rulePart.inclusive)
+ match = !match;
+ return match;
+ };
+ return PartInfo;
+}());
+exports.PartInfo = PartInfo;
+var Context = /** @class */ (function () {
+ function Context(context) {
+ this.contextInfo = [];
+ var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);
+ var results = [];
+ for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) {
+ var part = contextHierMatches_1[_i];
+ var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/);
+ var attrInfo = [];
+ for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) {
+ var attrPart = _b[_a];
+ var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);
+ attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4]));
+ }
+ parts[2] = parts[2].toLowerCase();
+ var nsParts = parts[2].split(":");
+ var incl = parts[1] !== "!";
+ var ns = nsParts.shift();
+ var role = nsParts.join(":");
+ var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]);
+ results.push(partInfo);
+ }
+ this.contextInfo = results;
+ }
+ Context.cleanContext = function (context) {
+ context = context.toLowerCase().trim();
+ context = context.replace(/ +!/g, " !");
+ context = context.replace(/ +([>+~,])/g, "$1");
+ context = context.replace(/([>+~,]) +/g, "$1");
+ context = context.replace(/ +/g, " ");
+ return context.trim();
+ };
+ Context.parse = function (context) {
+ var contexts = Context.splitMultiple(Context.cleanContext(context));
+ var retVal = [];
+ for (var i = 0; i < contexts.length; ++i) {
+ var ctx = new Context(contexts[i]);
+ retVal.push(ctx);
+ }
+ return retVal;
+ };
+ /**
+ * Handles initial processing of splitting on comma - context,context
+ * @param context
+ */
+ Context.splitMultiple = function (context) {
+ var contexts = [];
+ if (context) {
+ if (context.indexOf(",") === -1) {
+ contexts.push(context);
+ }
+ else {
+ for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) {
+ var c = _a[_i];
+ contexts.push(c);
+ }
+ }
+ }
+ return contexts;
+ };
+ return Context;
+}());
+exports.Context = Context;
+
+
+/***/ }),
+
+/***/ 9324:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Engine = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var Context_1 = __webpack_require__(2306);
+var Config_1 = __webpack_require__(3962);
+var DOMMapper_1 = __webpack_require__(5697);
+var DOMUtil_1 = __webpack_require__(295);
+var CacheUtil_1 = __webpack_require__(7788);
+var IRule_1 = __webpack_require__(4377);
+var WrappedRule = /** @class */ (function () {
+ function WrappedRule(rule, parsedInfo) {
+ this.rule = rule;
+ this.parsedInfo = parsedInfo;
+ this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace;
+ Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo));
+ }
+ /**
+ * This function is responsible converting the node into a snippet which can be added to report.
+ *
+ * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this.
+ *
+ * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc...
+ *
+ * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only.
+ *
+ * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains,
+ * nodename and attributes. i.e.
+ *
+ * @memberOf this
+ */
+ WrappedRule.convertNodeToSnippet = function (node) {
+ // Variable Decleration
+ var nodeSnippet = '';
+ // Extract the node name and add it to the node snippet
+ nodeSnippet += '<' + node.nodeName.toLowerCase();
+ // Extract all the node attributes as an array
+ var nodeAttributes = node.attributes;
+ // In the case there are attributes on this node
+ if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') {
+ // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned
+ for (var i = nodeAttributes.length - 1; i >= 0; i--) {
+ if (nodeAttributes[i].name === "data-namewalk")
+ continue;
+ // Add the attribute name and value.
+ nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"';
+ }
+ }
+ // Close the node
+ nodeSnippet += '>';
+ // Return the node snippet
+ return nodeSnippet;
+ };
+ WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) {
+ var startTime = new Date().getTime();
+ var results;
+ try {
+ results = this.rule.run(context, options, contextHierarchies);
+ }
+ catch (e) {
+ var err = e;
+ console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack);
+ throw e;
+ }
+ var endTime = new Date().getTime();
+ if (!results)
+ results = [];
+ if (!(results instanceof Array)) {
+ results = [results];
+ }
+ var retVal = [];
+ for (var _i = 0, results_1 = results; _i < results_1.length; _i++) {
+ var result = results_1[_i];
+ var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs);
+ var path = {};
+ for (var ns in context) {
+ path[ns] = context[ns].rolePath;
+ }
+ var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1");
+ retVal.push({
+ ruleId: ruleId,
+ value: result.value,
+ node: context["dom"].node,
+ path: path,
+ ruleTime: endTime - startTime,
+ reasonId: result.reasonId,
+ message: message,
+ messageArgs: result.messageArgs,
+ apiArgs: result.apiArgs,
+ bounds: context["dom"].bounds,
+ snippet: WrappedRule.convertNodeToSnippet(context["dom"].node)
+ });
+ }
+ return retVal;
+ };
+ return WrappedRule;
+}());
+var Engine = /** @class */ (function () {
+ function Engine() {
+ this.mappers = {};
+ this.ruleMap = {};
+ this.wrappedRuleMap = {};
+ this.nlsMap = {};
+ this.helpMap = {};
+ this.inclRules = {};
+ this.exclRules = {};
+ // Need a DOM Mapper as a minimum
+ this.addMapper(new DOMMapper_1.DOMMapper());
+ }
+ Engine.getLanguages = function () {
+ var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env;
+ // If all else fails, default to US English
+ var nodeLang = "en-US";
+ if (env) {
+ nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES;
+ if (nodeLang && nodeLang.length > 0) {
+ nodeLang = nodeLang.split(".")[0].replace(/_/g, "-");
+ }
+ else {
+ nodeLang = "en-US";
+ }
+ }
+ return typeof navigator !== "undefined" && navigator.languages || [nodeLang];
+ };
+ Engine.prototype.run = function (root, options) {
+ if (root === null) {
+ return Promise.reject("null document");
+ }
+ if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) {
+ root = root.documentElement;
+ }
+ root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false);
+ (0, CacheUtil_1.clearCaches)(root);
+ var walker = new DOMWalker_1.DOMWalker(root);
+ var retVal = {
+ results: [],
+ numExecuted: 0,
+ ruleTime: 0,
+ totalTime: 0
+ };
+ var start = new Date().getTime();
+ // Reset the role mappers
+ for (var namespace in this.mappers) {
+ this.mappers[namespace].reset(root);
+ }
+ // Initialize the context detector
+ do {
+ // Get the context information from the rule mappers
+ var contextHierarchies = {};
+ for (var namespace in this.mappers) {
+ if (!walker.bEndTag) {
+ contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node);
+ // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ // const elem = walker.node as Element;
+ // let id;
+ // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) {
+ // if (root.ownerDocument.getElementById(id) === elem) {
+ // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']";
+ // }
+ // }
+ // }
+ }
+ else {
+ contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node);
+ }
+ }
+ if (walker.node.nodeType !== 11
+ && (DOMWalker_1.DOMWalker.isNodeVisible(walker.node)
+ // || walker.node.nodeName.toLowerCase() === "head"
+ || walker.node.nodeName.toLowerCase() === "meta"
+ || walker.node.nodeName.toLowerCase() === "style"
+ || walker.node.nodeName.toLowerCase() === "datalist"
+ || walker.node.nodeName.toLowerCase() === "param"
+ || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) {
+ var context = {};
+ for (var ns in contextHierarchies) {
+ var nsHier = contextHierarchies[ns];
+ var lastHier = nsHier[nsHier.length - 1];
+ context[ns] = lastHier;
+ }
+ var matchingRules = this.getMatchingRules(contextHierarchies);
+ var depMatch = {};
+ for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) {
+ var matchingRule = matchingRules_1[_i];
+ var fulfillsDependencies = true;
+ for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) {
+ var dep = _b[_a];
+ if (!depMatch[dep])
+ fulfillsDependencies = false;
+ }
+ if (fulfillsDependencies) {
+ var results = [];
+ try {
+ results = matchingRule.run(this, context, options, contextHierarchies);
+ }
+ catch (err) {
+ // Wrapper shows error in console. Skip this rule as N/A
+ // We don't want to kill the engine
+ }
+ // If out of scope, it fulfills the dependency
+ if (results.length === 0) {
+ depMatch[matchingRule.rule.id] = true;
+ }
+ for (var _c = 0, results_2 = results; _c < results_2.length; _c++) {
+ var result = results_2[_c];
+ retVal.results.push(result);
+ retVal.ruleTime += result.ruleTime;
+ retVal.numExecuted++;
+ if (result.value[1] === IRule_1.eRuleConfidence.PASS) {
+ depMatch[result.ruleId] = true;
+ }
+ }
+ }
+ }
+ }
+ } while (walker.nextNode());
+ (0, CacheUtil_1.clearCaches)(root);
+ retVal.totalTime = new Date().getTime() - start;
+ return Promise.resolve(retVal);
+ };
+ Engine.prototype.enableRules = function (ruleIds) {
+ for (var ruleId in this.ruleMap) {
+ this.ruleMap[ruleId].enabled = false;
+ }
+ for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) {
+ var ruleId = _a[_i];
+ if (!(ruleId in this.ruleMap)) {
+ console.warn("WARNING: Rule Id", ruleId, "could not be enabled.");
+ }
+ else {
+ this.ruleMap[ruleId].enabled = true;
+ }
+ }
+ };
+ Engine.prototype.getRule = function (ruleId) {
+ return this.ruleMap[ruleId];
+ };
+ Engine.prototype.getRulesIds = function () {
+ var retVal = [];
+ for (var ruleId in this.ruleMap) {
+ retVal.push(ruleId);
+ }
+ return retVal;
+ };
+ Engine.prototype.addRules = function (rules) {
+ for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) {
+ var rule = rules_1[_i];
+ this.addRule(rule, true);
+ }
+ this._sortRules();
+ };
+ Engine.prototype.addRule = function (rule, skipSort) {
+ var ctxs = Context_1.Context.parse(rule.context);
+ var idx = 0;
+ var ruleId = rule.id;
+ if (ruleId in this.ruleMap) {
+ console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring...");
+ return;
+ }
+ this.ruleMap[ruleId] = rule;
+ for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) {
+ var ctx = ctxs_1[_i];
+ var wrapId = ruleId;
+ if (idx >= 1) {
+ wrapId = ruleId + "$$" + idx;
+ }
+ ++idx;
+ var wrappedRule = new WrappedRule(rule, ctx);
+ this.wrappedRuleMap[wrapId] = wrappedRule;
+ var parts = wrappedRule.parsedInfo.contextInfo;
+ var lastPart = parts[parts.length - 1];
+ var triggerRole = lastPart.namespace + ":" + lastPart.role;
+ if (lastPart.inclusive) {
+ this.inclRules[triggerRole] = this.inclRules[triggerRole] || [];
+ this.inclRules[triggerRole].push(wrappedRule);
+ }
+ else {
+ this.exclRules[triggerRole] = this.exclRules[triggerRole] || [];
+ this.exclRules[triggerRole].push(wrappedRule);
+ }
+ }
+ if (!skipSort) {
+ this._sortRules();
+ }
+ };
+ Engine.prototype._sortRules = function () {
+ for (var role in this.inclRules) {
+ this.inclRules[role].sort(function (ruleA, ruleB) {
+ var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0;
+ var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0;
+ // If B depends on A, sort A before B
+ if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id))
+ return -1;
+ // If A depends on B, sort B before A
+ if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id))
+ return 1;
+ // Otherwise, doesn't matter
+ return 0;
+ });
+ }
+ for (var role in this.exclRules) {
+ this.exclRules[role].sort(function (ruleA, ruleB) {
+ var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0;
+ var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0;
+ // If B depends on A, sort A before B
+ if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id))
+ return -1;
+ // If A depends on B, sort B before A
+ if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id))
+ return 1;
+ // Otherwise, doesn't matter
+ return 0;
+ });
+ }
+ };
+ Engine.prototype.addNlsMap = function (map) {
+ for (var key in map) {
+ this.nlsMap[key] = map[key];
+ }
+ };
+ Engine.prototype.addHelpMap = function (map) {
+ for (var key in map) {
+ this.helpMap[key] = map[key];
+ }
+ };
+ Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) {
+ var splitter = ruleId.indexOf("$$");
+ if (splitter >= 0) {
+ ruleId = ruleId.substring(0, splitter);
+ }
+ if (!(ruleId in this.nlsMap))
+ return ruleId;
+ var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0];
+ if (!messageTemplate)
+ return ruleId + "_" + ruleIdx;
+ return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; });
+ };
+ Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) {
+ if (!archiveId) {
+ // Set to the latest
+ archiveId = "latest";
+ }
+ return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId));
+ };
+ Engine.prototype.getHelpRel = function (ruleId, ruleIdx) {
+ var splitter = ruleId.indexOf("$$");
+ if (splitter >= 0) {
+ ruleId = ruleId.substring(0, splitter);
+ }
+ if (!(ruleId in this.helpMap))
+ return ruleId;
+ ruleIdx = ruleIdx || 0;
+ var helpStr = null;
+ if (ruleIdx in this.helpMap[ruleId]) {
+ helpStr = this.helpMap[ruleId][ruleIdx || 0];
+ }
+ else {
+ helpStr = this.helpMap[ruleId][0];
+ }
+ if (!helpStr)
+ return ruleId + "_" + ruleIdx;
+ return helpStr;
+ };
+ Engine.prototype.addMapper = function (mapper) {
+ this.mappers[mapper.getNamespace()] = mapper;
+ };
+ Engine.match = function (rule, contextHier) {
+ var ruleParts = rule.parsedInfo.contextInfo;
+ var partIdx = ruleParts.length - 1;
+ var curNS = ruleParts[partIdx].namespace;
+ var curHier = contextHier[curNS][contextHier[curNS].length - 1];
+ var contextNode = curHier.node;
+ // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match
+ if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) {
+ return false;
+ }
+ // If there was only one part, we have a match
+ if (ruleParts.length === 1) {
+ return true;
+ }
+ // Need to deal with parent parts. To walk the hierarchy, these need to be
+ // all in the same namespace. Confirm that is true.
+ curNS = ruleParts[0].namespace;
+ curHier = contextHier[curNS][contextHier[curNS].length - 1];
+ --partIdx;
+ if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) {
+ console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces"));
+ return false;
+ }
+ // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end
+ var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1);
+ while (hierIdx >= 0 && partIdx >= 0) {
+ var part = ruleParts[partIdx];
+ var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx);
+ if (part.connector === ">") {
+ if (!matchesPart) {
+ // Direct parent check and doesn't match
+ return false;
+ }
+ else {
+ // Direct parent check and does match
+ --partIdx;
+ --hierIdx;
+ }
+ }
+ else if (part.connector === " ") {
+ if (part.inclusive) {
+ // inclusive ancestor match
+ if (matchesPart) {
+ --partIdx;
+ }
+ // If doesn't match, just move up the role hierarchy
+ --hierIdx;
+ }
+ else if (!matchesPart) {
+ // exclusive ancestor match and current matches
+ return false;
+ }
+ else {
+ // exclusive ancestor match and current doesn't match - check for other ancestors
+ var parentMatch = false;
+ for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) {
+ parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx);
+ }
+ if (parentMatch)
+ return false;
+ else
+ --partIdx;
+ }
+ }
+ else {
+ throw new Error("Context connector " + part.connector + " is not supported");
+ }
+ }
+ return partIdx === -1;
+ };
+ Engine.prototype.getMatchingRules = function (ctxHier) {
+ var matches = [];
+ function addMatches(rules) {
+ for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) {
+ var rule = rules_2[_i];
+ if (rule.rule.enabled && Engine.match(rule, ctxHier)) {
+ matches.push(rule);
+ }
+ }
+ }
+ for (var ns in ctxHier) {
+ var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none");
+ if (role in this.inclRules) {
+ addMatches(this.inclRules[role]);
+ }
+ for (var xRole in this.exclRules) {
+ if (xRole !== role) {
+ addMatches(this.exclRules[xRole]);
+ }
+ }
+ if (role !== ns + ":none") {
+ if (role.startsWith(ns + ":/")) {
+ if (ns + ":/*" in this.inclRules) {
+ addMatches(this.inclRules[ns + ":/*"]);
+ }
+ }
+ else {
+ if (ns + ":*" in this.inclRules) {
+ addMatches(this.inclRules[ns + ":*"]);
+ }
+ }
+ }
+ }
+ return this.sortDeps(matches);
+ };
+ /**
+ * Sorts the rules in order to execute dependencies in the correct order
+ * @param inRules List of wrapped rules to sort
+ * @returns Sorted list of wrapped rules
+ */
+ Engine.prototype.sortDeps = function (inRules) {
+ var depRules = [];
+ for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) {
+ var rule = inRules_1[_i];
+ depRules.push(rule);
+ }
+ var retVal = [];
+ var idToRule = {};
+ // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list
+ // Repeat until no changes are made to the satisfied list
+ // If a rule cannot be satisfied, it will never execute, so it can be dropped.
+ var change = false;
+ do {
+ change = false;
+ for (var idx = 0; idx < depRules.length; ++idx) {
+ var depRule = depRules[idx];
+ if (depRule.rule.id in idToRule)
+ continue;
+ var allMatch = true;
+ if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) {
+ for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) {
+ var depId = _b[_a];
+ if (!(depId in idToRule)) {
+ allMatch = false;
+ }
+ }
+ }
+ // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) {
+ // for (const depId of depRule.rule.prereqs) {
+ // if (!(depId in idToRule)) {
+ // allMatch = false;
+ // }
+ // }
+ // }
+ if (allMatch) {
+ change = true;
+ retVal.push(depRule);
+ idToRule[depRule.rule.id] = true;
+ depRules.splice(idx--, 1);
+ }
+ }
+ } while (change);
+ return retVal;
+ };
+ return Engine;
+}());
+exports.Engine = Engine;
+
+
+/***/ }),
+
+/***/ 3962:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Config = void 0;
+var Config = /** @class */ (function () {
+ function Config() {
+ }
+ Config.DEBUG = false;
+ Config.helpRoot = "https://able.ibm.com/rules/archives";
+ return Config;
+}());
+exports.Config = Config;
+
+
+/***/ }),
+
+/***/ 9831:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.ColorObj = exports.ColorUtil = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var ColorUtil = /** @class */ (function () {
+ function ColorUtil() {
+ }
+ // Rewrite the color object to account for alpha
+ ColorUtil.Color = function (cssStyleColor) {
+ cssStyleColor = cssStyleColor.toLowerCase();
+ if (cssStyleColor === "transparent")
+ return new ColorObj(255, 255, 255, 0);
+ if (cssStyleColor in ColorUtil.CSSColorLookup)
+ cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor];
+ if (cssStyleColor.startsWith("rgb(")) {
+ var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ return new ColorObj(m[1], m[2], m[3]);
+ }
+ }
+ else if (cssStyleColor.startsWith("rgba(")) {
+ var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ return new ColorObj(m[1], m[2], m[3], m[4]);
+ }
+ }
+ else if (cssStyleColor.charAt(0) != "#") {
+ return null;
+ }
+ else {
+ if (cssStyleColor.length === 4) {
+ // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits
+ // (https://www.w3.org/TR/css-color-3/#rgb-color)
+ cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) +
+ cssStyleColor.charAt(2).repeat(2) +
+ cssStyleColor.charAt(3).repeat(2);
+ }
+ var thisRed = parseInt(cssStyleColor.substring(1, 3), 16);
+ var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16);
+ var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16);
+ return new ColorObj(thisRed, thisGreen, thisBlue);
+ }
+ // return null; // Unreachable
+ };
+ ;
+ ColorUtil.ColorCombo = function (ruleContext) {
+ try {
+ var doc = ruleContext.ownerDocument;
+ if (!doc) {
+ return null;
+ }
+ var win = doc.defaultView;
+ if (!win) {
+ return null;
+ }
+ var ancestors = [];
+ var walkNode = ruleContext;
+ while (walkNode) {
+ if (walkNode.nodeType === 1)
+ ancestors.push(walkNode);
+ walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode);
+ }
+ var retVal = {
+ "hasGradient": false,
+ "hasBGImage": false,
+ "textShadow": false,
+ "fg": null,
+ "bg": null
+ };
+ // start
+ var cStyle = win.getComputedStyle(ruleContext);
+ var compStyleColor = cStyle.color;
+ if (!compStyleColor)
+ compStyleColor = "black";
+ var fg = ColorUtil.Color(compStyleColor);
+ var reColor = /transparent|rgba?\([^)]+\)/gi;
+ var guessGradColor = function (gradList, bgColor, fgColor) {
+ try {
+ // If there's only one color, return that
+ if (typeof gradList.length === "undefined")
+ return gradList;
+ var overallWorst = null;
+ var overallWorstRatio = null;
+ for (var iGrad = 1; iGrad < gradList.length; ++iGrad) {
+ var worstColor = gradList[iGrad - 1];
+ var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]);
+ var step = .1;
+ var idx = 0;
+ while (step > .0001) {
+ while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) {
+ worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor);
+ worstRatio = fgColor.contrastRatio(worstColor);
+ idx = idx + step;
+ }
+ while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) {
+ worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor);
+ worstRatio = fgColor.contrastRatio(worstColor);
+ idx = idx - step;
+ }
+ step = step / 10;
+ }
+ if (overallWorstRatio === null || overallWorstRatio > worstRatio) {
+ overallWorstRatio = worstRatio;
+ overallWorst = worstColor;
+ }
+ }
+ return overallWorst; // return the darkest color
+ }
+ catch (e) {
+ console.log(e);
+ }
+ return bgColor;
+ };
+ var priorStackBG = ColorUtil.Color("white");
+ var thisStackOpacity = null;
+ var thisStackAlpha = null;
+ var thisStackBG = null;
+ // Ancestors processed from the topmost parent toward the child
+ while (ancestors.length > 0) {
+ var procNext = ancestors.pop();
+ //var procNext = ancestors.splice(0, 1)[0];
+ // cStyle is the computed style of this layer
+ var cStyle = win.getComputedStyle(procNext);
+ if (cStyle === null)
+ continue;
+ // thisBgColor is the color of this layer or null if the layer is transparent
+ var thisBgColor = null;
+ if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") {
+ thisBgColor = ColorUtil.Color(cStyle.backgroundColor);
+ }
+ // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground
+ if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) {
+ var gradColors = cStyle.backgroundImage.match(reColor);
+ if (gradColors) {
+ var gradColorComp = [];
+ for (var i = 0; i < gradColors.length; ++i) {
+ if (!gradColors[i].length) {
+ gradColors.splice(i--, 1);
+ }
+ else {
+ var colorComp = ColorUtil.Color(gradColors[i]);
+ if (colorComp.alpha !== undefined && colorComp.alpha < 1) {
+ // mix the grdient bg color wit parent bg if alpha < 1
+ var compStackBg = thisStackBG || priorStackBG;
+ colorComp = colorComp.getOverlayColor(compStackBg);
+ }
+ gradColorComp.push(colorComp);
+ }
+ }
+ thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg);
+ }
+ }
+ // Handle non-solid opacity
+ if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) {
+ // New stack, reset
+ if (thisStackBG != null) {
+ // Overlay
+ thisStackBG.alpha = thisStackOpacity * thisStackAlpha;
+ priorStackBG = thisStackBG.getOverlayColor(priorStackBG);
+ }
+ thisStackOpacity = 1.0;
+ thisStackAlpha = null;
+ thisStackBG = null;
+ if (cStyle.opacity && cStyle.opacity.length > 0) {
+ thisStackOpacity = parseFloat(cStyle.opacity);
+ }
+ if (thisBgColor != null) {
+ thisStackBG = thisBgColor;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ delete thisStackBG.alpha;
+ if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) {
+ retVal.hasBGImage = false;
+ retVal.hasGradient = false;
+ }
+ }
+ }
+ // Handle solid color backgrounds and gradient color backgrounds
+ else if (thisBgColor != null) {
+ // If this stack already has a background color, blend it
+ if (thisStackBG === null) {
+ thisStackBG = thisBgColor;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ delete thisStackBG.alpha;
+ }
+ else {
+ thisStackBG = thisBgColor.getOverlayColor(thisStackBG);
+ //thisStackAlpha = thisBgColor.alpha || 1.0;
+ thisStackAlpha = thisStackBG.alpha || 1.0;
+ }
+ // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code
+ // We can't wipe out the gradient info if this layer was transparent
+ if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) {}
+ }
+ if (cStyle.backgroundImage && cStyle.backgroundImage != "none") {
+ if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) {
+ retVal.hasGradient = true;
+ }
+ else {
+ retVal.hasBGImage = true;
+ }
+ }
+ }
+ if (thisStackBG != null) {
+ fg = fg.getOverlayColor(thisStackBG);
+ delete fg.alpha;
+ }
+ fg.alpha = (fg.alpha || 1) * thisStackOpacity;
+ fg = fg.getOverlayColor(priorStackBG);
+ if (thisStackBG != null) {
+ thisStackBG.alpha = thisStackOpacity * thisStackAlpha;
+ priorStackBG = thisStackBG.getOverlayColor(priorStackBG);
+ }
+ retVal.fg = fg;
+ retVal.bg = priorStackBG;
+ if (cStyle.textShadow && cStyle.textShadow !== 'none')
+ retVal.textShadow = true;
+ return retVal;
+ }
+ catch (err) {
+ // something happened, then...
+ return null;
+ }
+ };
+ ;
+ ColorUtil.CSSColorLookup = {
+ "aliceblue": "#f0f8ff",
+ "antiquewhite": "#faebd7",
+ "aqua": "#00ffff",
+ "aquamarine": "#7fffd4",
+ "azure": "#f0ffff",
+ "beige": "#f5f5dc",
+ "bisque": "#ffe4c4",
+ "black": "#000000",
+ "blanchedalmond": "#ffebcd",
+ "blue": "#0000ff",
+ "blueviolet": "#8a2be2",
+ "brown": "#a52a2a",
+ "burlywood": "#deb887",
+ "cadetblue": "#5f9ea0",
+ "chartreuse": "#7fff00",
+ "chocolate": "#d2691e",
+ "coral": "#ff7f50",
+ "cornflowerblue": "#6495ed",
+ "cornsilk": "#fff8dc",
+ "crimson": "#dc143c",
+ "cyan": "#00ffff",
+ "darkblue": "#00008b",
+ "darkcyan": "#008b8b",
+ "darkgoldenrod": "#b8860b",
+ "darkgray": "#a9a9a9",
+ "darkgreen": "#006400",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#696969",
+ "dodgerblue": "#1e90ff",
+ "firebrick": "#b22222",
+ "floralwhite": "#fffaf0",
+ "forestgreen": "#228b22",
+ "fuchsia": "#ff00ff",
+ "gainsboro": "#dcdcdc",
+ "ghostwhite": "#f8f8ff",
+ "gold": "#ffd700",
+ "goldenrod": "#daa520",
+ "gray": "#808080",
+ "green": "#008000",
+ "greenyellow": "#adff2f",
+ "honeydew": "#f0fff0",
+ "hotpink": "#ff69b4",
+ "indianred": "#cd5c5c",
+ "indigo": "#4b0082",
+ "ivory": "#fffff0",
+ "khaki": "#f0e68c",
+ "lavender": "#e6e6fa",
+ "lavenderblush": "#fff0f5",
+ "lawngreen": "#7cfc00",
+ "lemonchiffon": "#fffacd",
+ "lightblue": "#add8e6",
+ "lightcoral": "#f08080",
+ "lightcyan": "#e0ffff",
+ "lightgoldenrodyellow": "#fafad2",
+ "lightgrey": "#d3d3d3",
+ "lightgreen": "#90ee90",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370d8",
+ "mediumseagreen": "#3cb371",
+ "mediumslateblue": "#7b68ee",
+ "mediumspringgreen": "#00fa9a",
+ "mediumturquoise": "#48d1cc",
+ "mediumvioletred": "#c71585",
+ "midnightblue": "#191970",
+ "mintcream": "#f5fffa",
+ "mistyrose": "#ffe4e1",
+ "moccasin": "#ffe4b5",
+ "navajowhite": "#ffdead",
+ "navy": "#000080",
+ "oldlace": "#fdf5e6",
+ "olive": "#808000",
+ "olivedrab": "#6b8e23",
+ "orange": "#ffa500",
+ "orangered": "#ff4500",
+ "orchid": "#da70d6",
+ "palegoldenrod": "#eee8aa",
+ "palegreen": "#98fb98",
+ "paleturquoise": "#afeeee",
+ "palevioletred": "#d87093",
+ "papayawhip": "#ffefd5",
+ "peachpuff": "#ffdab9",
+ "peru": "#cd853f",
+ "pink": "#ffc0cb",
+ "plum": "#dda0dd",
+ "powderblue": "#b0e0e6",
+ "purple": "#800080",
+ "red": "#ff0000",
+ "rosybrown": "#bc8f8f",
+ "royalblue": "#4169e1",
+ "saddlebrown": "#8b4513",
+ "salmon": "#fa8072",
+ "sandybrown": "#f4a460",
+ "seagreen": "#2e8b57",
+ "seashell": "#fff5ee",
+ "sienna": "#a0522d",
+ "silver": "#c0c0c0",
+ "skyblue": "#87ceeb",
+ "slateblue": "#6a5acd",
+ "slategray": "#708090",
+ "snow": "#fffafa",
+ "springgreen": "#00ff7f",
+ "steelblue": "#4682b4",
+ "tan": "#d2b48c",
+ "teal": "#008080",
+ "thistle": "#d8bfd8",
+ "tomato": "#ff6347",
+ "turquoise": "#40e0d0",
+ "violet": "#ee82ee",
+ "wheat": "#f5deb3",
+ "white": "#ffffff",
+ "whitesmoke": "#f5f5f5",
+ "yellow": "#ffff00",
+ "yellowgreen": "#9acd32",
+ "buttontext": "rgba(0, 0, 0, 0.847)",
+ "buttonface": "#ffffff",
+ "graytext": "rgba(0, 0, 0, 0.247)"
+ };
+ return ColorUtil;
+}());
+exports.ColorUtil = ColorUtil;
+var ColorObj = /** @class */ (function () {
+ function ColorObj(red, green, blue, alpha) {
+ function fixComponent(comp) {
+ if (typeof (comp) != typeof (""))
+ return comp;
+ var compStr = comp;
+ compStr = compStr.trim();
+ if (compStr[compStr.length - 1] != "%")
+ return parseInt(compStr);
+ return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55);
+ }
+ this.red = fixComponent(red);
+ this.green = fixComponent(green);
+ this.blue = fixComponent(blue);
+ if (typeof (alpha) != "undefined") {
+ this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha;
+ }
+ }
+ ColorObj.prototype.toHexHelp = function (value) {
+ var retVal = Math.round(value).toString(16);
+ if (retVal.length === 1)
+ return "0" + retVal;
+ return retVal;
+ };
+ ;
+ ColorObj.prototype.toHex = function () {
+ return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue);
+ };
+ ;
+ ColorObj.prototype.contrastRatio = function (bgColor) {
+ var fgColor = this;
+ if (typeof (this.alpha) != "undefined")
+ fgColor = this.getOverlayColor(bgColor);
+ var lum1 = fgColor.relativeLuminance();
+ if (!bgColor.relativeLuminance) {
+ var s = "";
+ for (var key in bgColor) {
+ s += key + "\n";
+ }
+ alert(bgColor);
+ alert(s);
+ }
+ var lum2 = bgColor.relativeLuminance();
+ var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05);
+ return ratio;
+ };
+ ;
+ ColorObj.prototype.relativeLuminance = function () {
+ var R = this.red / 255.0;
+ var G = this.green / 255.0;
+ var B = this.blue / 255.0;
+ R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4);
+ G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4);
+ B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4);
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B;
+ };
+ ;
+ ColorObj.prototype.mix = function (color2, percThis) {
+ if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") {
+ return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue);
+ }
+ else {
+ var alphaThis = this.alpha ? this.alpha : 1;
+ var alphaOther = color2.alpha ? color2.alpha : 1;
+ return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther);
+ }
+ };
+ ;
+ ColorObj.prototype.getOverlayColor = function (bgColor) {
+ if (typeof (this.alpha) === "undefined" || this.alpha >= 1) {
+ // No mixing required - it's opaque
+ return this;
+ }
+ if (this.alpha < 0) {
+ // Haac.Error.logError("Invalid alpha value");
+ return null;
+ }
+ if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) {
+ // Haac.Error.logError("Cannot mix with a background alpha");
+ return null;
+ }
+ var retVal = this.mix(bgColor, this.alpha);
+ delete retVal.alpha;
+ return retVal;
+ };
+ ColorObj.fromCSSColor = function (cssStyleColor) {
+ var thisRed = -1;
+ var thisGreen = -1;
+ var thisBlue = -1;
+ cssStyleColor = cssStyleColor.toLowerCase();
+ if (cssStyleColor.startsWith("rgb(")) {
+ var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ thisRed = m[1];
+ thisGreen = m[2];
+ thisBlue = m[3];
+ }
+ }
+ else if (cssStyleColor.startsWith("rgba(")) {
+ var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/;
+ var m = cssStyleColor.match(rgbRegex);
+ if (m === null)
+ return null;
+ else {
+ thisRed = m[1];
+ thisGreen = m[2];
+ thisBlue = m[3];
+ }
+ }
+ else {
+ if (cssStyleColor.charAt(0) != "#") {
+ if (cssStyleColor in ColorUtil.CSSColorLookup)
+ cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor];
+ else
+ return null;
+ }
+ var fromHex = function (val) {
+ var lookup = {
+ "a": 10,
+ "b": 11,
+ "c": 12,
+ "d": 13,
+ "e": 14,
+ "f": 15
+ };
+ var retVal = 0;
+ for (var i = 0; i < val.length; ++i) {
+ retVal = retVal * 16 +
+ parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i));
+ }
+ return retVal;
+ };
+ if (cssStyleColor.length === 4) {
+ // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits
+ // (https://www.w3.org/TR/css-color-3/#rgb-color)
+ cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) +
+ cssStyleColor.charAt(2).repeat(2) +
+ cssStyleColor.charAt(3).repeat(2);
+ }
+ thisRed = fromHex(cssStyleColor.substring(1, 3));
+ thisGreen = fromHex(cssStyleColor.substring(3, 5));
+ thisBlue = fromHex(cssStyleColor.substring(5, 7));
+ }
+ return new ColorObj(thisRed, thisGreen, thisBlue);
+ };
+ return ColorObj;
+}());
+exports.ColorObj = ColorObj;
+
+
+/***/ }),
+
+/***/ 5697:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMMapper = void 0;
+var CommonMapper_1 = __webpack_require__(1794);
+var DOMMapper = /** @class */ (function (_super) {
+ __extends(DOMMapper, _super);
+ function DOMMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ DOMMapper.prototype.getRole = function (node) {
+ return node.nodeName.toLowerCase();
+ };
+ DOMMapper.prototype.getNamespace = function () {
+ return "dom";
+ };
+ DOMMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem = node;
+ for (var idx = 0; idx < elem.attributes.length; ++idx) {
+ var attrInfo = elem.attributes[idx];
+ retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue;
+ }
+ }
+ return retVal;
+ };
+ DOMMapper.prototype.getBounds = function (node) {
+ if (node.nodeType === 1 /*Node.ELEMENT_NODE*/) {
+ var adjustment = 1;
+ if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) {
+ adjustment = node.ownerDocument.defaultView.devicePixelRatio;
+ }
+ var bounds = node.getBoundingClientRect();
+ // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function
+ if (bounds) {
+ var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0;
+ var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0;
+ return {
+ "left": Math.ceil((bounds.left + scrollX_1) * adjustment),
+ "top": Math.ceil((bounds.top + scrollY_1) * adjustment),
+ "height": Math.ceil(bounds.height * adjustment),
+ "width": Math.ceil(bounds.width * adjustment)
+ };
+ }
+ }
+ return null;
+ };
+ return DOMMapper;
+}(CommonMapper_1.CommonMapper));
+exports.DOMMapper = DOMMapper;
+
+
+/***/ }),
+
+/***/ 295:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMUtil = void 0;
+var DOMWalker_1 = __webpack_require__(7440);
+var DOMUtil = /** @class */ (function () {
+ function DOMUtil() {
+ }
+ DOMUtil.hasParent = function (node, names) {
+ var p = DOMWalker_1.DOMWalker.parentElement(node);
+ while (p && !names.includes(p.nodeName)) {
+ p = DOMWalker_1.DOMWalker.parentElement(p);
+ }
+ return !!p;
+ };
+ DOMUtil.getAncestor = function (node, names) {
+ var p = DOMWalker_1.DOMWalker.parentElement(node);
+ while (p && !names.includes(p.nodeName.toLowerCase())) {
+ p = DOMWalker_1.DOMWalker.parentElement(p);
+ }
+ return p;
+ };
+ DOMUtil.sameNode = function (a, b) {
+ if (a === b) {
+ return true;
+ }
+ else if (a.isSameNode) {
+ return a.isSameNode(b);
+ }
+ else if (a.compareDocumentPosition) {
+ return a.compareDocumentPosition(b) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return true;
+ }
+ };
+ DOMUtil.cleanWhitespace = function (s) {
+ var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " ");
+ return retVal;
+ };
+ DOMUtil.cleanSpace = function (s) {
+ var retVal = s.replace(/ +/g, " ");
+ return retVal;
+ };
+ // return true if element1 and element2 (cells) are in the same table
+ DOMUtil.isInSameTable = function (element1, element2) {
+ if (element1 && element2) {
+ var parentName = ['table'];
+ var parent1 = DOMUtil.getAncestor(element1, parentName);
+ var parent2 = DOMUtil.getAncestor(element2, parentName);
+ if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2))
+ return true;
+ }
+ return false;
+ };
+ DOMUtil.shadowRootNode = function (node) {
+ var nd = node;
+ while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */)
+ nd = nd.parentNode;
+ return nd;
+ };
+ /**
+ * Copies objects, but retains Node attributes as references
+ * @param rhs
+ */
+ DOMUtil.objectCopyWithNodeRefs = function (rhs) {
+ if (!rhs)
+ return rhs;
+ if (typeof rhs !== "object") {
+ if (typeof rhs === "function") {
+ return rhs;
+ }
+ else {
+ return JSON.parse(JSON.stringify(rhs));
+ }
+ }
+ else if (rhs instanceof Node || !!rhs.nodeType) {
+ return rhs;
+ }
+ else {
+ var retVal = void 0;
+ if (rhs.constructor.name === "Array") {
+ retVal = [];
+ for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) {
+ var item = rhs_1[_i];
+ retVal.push(this.objectCopyWithNodeRefs(item));
+ }
+ }
+ else {
+ retVal = {};
+ for (var key in rhs) {
+ retVal[key] = this.objectCopyWithNodeRefs(rhs[key]);
+ }
+ }
+ return retVal;
+ }
+ };
+ DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) {
+ var walkNode = DOMWalker_1.DOMWalker.parentNode(element);
+ while (walkNode !== null) {
+ if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue)
+ return walkNode;
+ walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode);
+ }
+ return null;
+ };
+ return DOMUtil;
+}());
+exports.DOMUtil = DOMUtil;
+
+
+/***/ }),
+
+/***/ 7440:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.DOMWalker = void 0;
+/**
+ * Walks in a DOM order
+ *
+ * See also ../aria/ARIAWalker
+ */
+var DOMWalker = /** @class */ (function () {
+ function DOMWalker(element, bEnd, root) {
+ this.root = root || element;
+ this.node = element;
+ this.bEndTag = (bEnd == undefined ? false : bEnd == true);
+ }
+ DOMWalker.parentNode = function (node) {
+ if (node === null)
+ return null;
+ var p = node.parentNode;
+ if (node.slotOwner) {
+ p = node.slotOwner;
+ }
+ else if (node.ownerElement) {
+ p = node.ownerElement;
+ }
+ else if (p && p.nodeType === 11) {
+ if (p.host) {
+ p = p.host;
+ }
+ else {
+ p = null;
+ }
+ }
+ return p;
+ };
+ DOMWalker.parentElement = function (node) {
+ var elem = node;
+ do {
+ elem = DOMWalker.parentNode(elem);
+ } while (elem && elem.nodeType !== 1);
+ return elem;
+ };
+ DOMWalker.isNodeVisible = function (node) {
+ if (node === null)
+ return false;
+ try {
+ var vis = null;
+ while (node && node.nodeType !== 1 /* Node.ELEMENT_NODE */) {
+ node = DOMWalker.parentElement(node);
+ }
+ var elem = node;
+ var w = elem.ownerDocument.defaultView;
+ do {
+ var cs = w.getComputedStyle(elem);
+ if (cs.display === "none")
+ return false;
+ if (vis === null && cs.visibility) {
+ vis = cs.visibility;
+ if (vis === "hidden")
+ return false;
+ }
+ elem = DOMWalker.parentElement(elem);
+ } while (elem);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+ };
+ DOMWalker.prototype.atRoot = function () {
+ if (this.ownerElement)
+ return false;
+ if (this.root === this.node) {
+ return true;
+ }
+ else if (this.root.isSameNode) {
+ return this.root.isSameNode(this.node);
+ }
+ else if (this.root.compareDocumentPosition) {
+ return this.root.compareDocumentPosition(this.node) === 0;
+ }
+ else {
+ // Not supported in this environment - try our best
+ return this.node.parentNode === null;
+ }
+ };
+ DOMWalker.prototype.nextNode = function () {
+ do {
+ // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id"));
+ if (!this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ var slotElement = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.firstChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1
+ && elementNode.nodeName.toLowerCase() === "slot"
+ && slotElement.assignedNodes().length > 0) {
+ var slotOwner = this.node;
+ this.node = slotElement.assignedNodes()[0];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = 0;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) {
+ this.node = this.node.firstChild;
+ }
+ else {
+ this.bEndTag = true;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.slotOwner) {
+ var slotOwner = this.node.slotOwner;
+ var nextSlotIndex = this.node.slotIndex + 1;
+ delete this.node.slotOwner;
+ delete this.node.slotIndex;
+ if (nextSlotIndex < slotOwner.assignedNodes().length) {
+ this.node = slotOwner.assignedNodes()[nextSlotIndex];
+ this.node.slotOwner = slotOwner;
+ this.node.slotIndex = nextSlotIndex;
+ this.bEndTag = false;
+ }
+ else {
+ this.node = slotOwner;
+ this.bEndTag = true;
+ }
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = true;
+ }
+ else if (this.node.nextSibling) {
+ this.node = this.node.nextSibling;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = true;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ DOMWalker.prototype.prevNode = function () {
+ do {
+ if (this.bEndTag) {
+ var iframeNode = this.node;
+ var elementNode = this.node;
+ if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && this.node.nodeName.toUpperCase() === "IFRAME"
+ && DOMWalker.isNodeVisible(iframeNode)
+ && iframeNode.contentDocument
+ && iframeNode.contentDocument.documentElement) {
+ var ownerElement = this.node;
+ this.node = iframeNode.contentDocument.documentElement;
+ this.node.ownerElement = ownerElement;
+ }
+ else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */
+ && DOMWalker.isNodeVisible(elementNode)
+ && elementNode.shadowRoot
+ && elementNode.shadowRoot.lastChild) {
+ var ownerElement = this.node;
+ this.node = elementNode.shadowRoot;
+ this.node.ownerElement = ownerElement;
+ }
+ else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) {
+ this.node = this.node.lastChild;
+ }
+ else {
+ this.bEndTag = false;
+ }
+ }
+ else {
+ if (this.atRoot()) {
+ return false;
+ }
+ else if (this.node.previousSibling) {
+ this.node = this.node.previousSibling;
+ this.bEndTag = true;
+ }
+ else if (this.node.ownerElement) {
+ this.node = this.node.ownerElement;
+ this.bEndTag = false;
+ }
+ else if (this.node.parentNode) {
+ this.node = this.node.parentNode;
+ this.bEndTag = false;
+ }
+ else {
+ return false;
+ }
+ }
+ } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11)
+ || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"));
+ return true;
+ };
+ return DOMWalker;
+}());
+exports.DOMWalker = DOMWalker;
+
+
+/***/ }),
+
+/***/ 8174:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.VisUtil = void 0;
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMUtil_1 = __webpack_require__(295);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil = /** @class */ (function () {
+ function VisUtil() {
+ }
+ /**
+ * This function is responsible for checking if the node that is provied is
+ * visible or not. Following is how the check is performed:
+ * 1. Check if the current node is hidden with the following options:
+ * CSS --> dislay: none
+ * CSS --> visibility: hidden
+ * attribute --> hidden
+ * 2. Check if the any of the current nodes parents are hidden with the same
+ * options listed in 1.
+ *
+ * Note: If either current node or any of the parent nodes are hidden then this
+ * function will return false (node is not visible).
+ *
+ * @parm {element} node The node which should be checked if it is visible or not.
+ * @return {bool} false if the node is NOT visible, true otherwise
+ *
+ * @memberOf VisUtil
+ */
+ VisUtil.isNodeVisible = function (nodeIn) {
+ // Check the nodeType if this node, if this node is a text node then
+ // we get the parentnode and set that as the node as a text nodes,
+ // visibility is directly related to the parent node.
+ if (nodeIn.nodeType === 3) {
+ nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn);
+ }
+ var node = nodeIn;
+ // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to
+ // true when we detect that the node is hidden. We have to set it to false so that we know
+ // the rules has already been checked.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", false));
+ // We should only allow nodeType element, and TextNode all other nodesTypes
+ // we can return the visibility as visible.
+ // Following nodes will be returned as visable by default, since we can not
+ // actually change their visibility.
+ // Node.PROCESSING_INSTRUCTION_NODE --> 7
+ // Node.COMMENT_NODE --> 8
+ // 9 /* Node.DOCUMENT_NODE */ --> 9
+ // Node.DOCUMENT_TYPE_NODE --> 10
+ // Node.DOCUMENT_FRAGMENT_NODE --> 11
+ if (node.nodeType !== 1) {
+ return true;
+ }
+ // Make sure that the ownerDocument is present before moving forward
+ // in detecting if the node is visible or not. In the case that ownerDocument
+ // does not exist then we simply return node is visible by default.
+ if (!node.ownerDocument) {
+ return true;
+ }
+ // Variable Declaration
+ var compStyle;
+ var nodeName = node.nodeName.toLowerCase();
+ // In the case this node is a script, link or style node, right away return node is visible
+ // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan
+ // the elements everytime as they render content still which is still visible to users.
+ // script --> script elements have display: none by default
+ // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) {
+ return true;
+ }
+ // Check if this node is visible, we check couple of CSS properties and hidden attribute.
+ // area, param and audio elements we do not check if they are hidden as it does not apply to them.
+ // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not
+ // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element,
+ // and go stright to the parent node.
+ // Array check elements like:
+ // area --> area element is part of a map element and it can not be hidden because it is used to
+ // make an certian parts of an map interactive.
+ // param --> element can only be part of object elment and it cannot be hidden directly, it
+ // can only be hidden if the parent is hidden.
+ // audio --> If this element is hidden it will still play the music, so we should still trigger
+ // violations for this element.
+ // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all.
+ if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) {
+ // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle
+ // function to get the CSS style for the node.
+ if (node.ownerDocument.defaultView) {
+ // Run the getComputedStyle on this node to fetch the CSS compuation of the node
+ compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null);
+ }
+ // In the case that defaultView does not exists return true to identify that this
+ // node is visible, because were not able to detect if it was not.
+ else {
+ return true;
+ }
+ // Get the hidden element property and hidden attribute
+ var hiddenAttribute = node.getAttribute("hidden");
+ var hiddenPropertyCustom = (0, CacheUtil_1.getCache)(node, "PT_NODE_HIDDEN", undefined);
+ // To get the hidden property we need to perform a special check as in some cases the hidden property will not be
+ // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition.
+ // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element
+ // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to
+ // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356
+ var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false;
+ // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT
+ // hidden property then we can just return true (node visible) at this point.
+ if (!compStyle &&
+ !hiddenProperty && // this covers false, null, or undefined
+ (hiddenAttribute === null || hiddenAttribute === undefined) &&
+ !hiddenPropertyCustom // This covers false, null or undefined
+ ) {
+ return true;
+ }
+ // In the case that the compStyle is defined we check the following:
+ // CSS style display set to none
+ // CSS style visibility set to hidden
+ // Note: For this property since it is inherited, need to skip the check on parents as
+ // the parent can have hidden but the child can be visible. So we only check this property
+ // on child elements/elements that are passed to this function the first time.
+ // node hidden property set (node.hidden)
+ // node attribute hidden set (to any value)
+ // node custom hidden property ser (node.PT_NODE_HIDDEN)
+ // If any of the above conditions are true then we return false as this element is not visible
+ if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' ||
+ (!(0, CacheUtil_1.getCache)(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) ||
+ (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) {
+ // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses
+ // use this in the rules to determine if the node is hidden or not, if we need to.
+ // Use expandos property instead of a hash map which stores the elements, adding/checking expandos
+ // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate
+ // xpath it is more performance impact.
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ return false;
+ }
+ }
+ // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have
+ // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode
+ // element.
+ var parentElement = DOMWalker_1.DOMWalker.parentNode(node);
+ // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check
+ // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not
+ // have to duplicate the logic for checking if the node is visible or not for all the parents starting with
+ // child node.
+ if (parentElement != null && parentElement.nodeType === 1) {
+ // When we have a parent element going through the isNodeVisible function we have to mark it as such
+ // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden
+ // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked
+ // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over.
+ (0, CacheUtil_1.setCache)(parentElement, "Visibility_Check_Parent", true);
+ // Check upwards recursively, and save the results in an variable
+ var nodeVisible = VisUtil.isNodeVisible(parentElement);
+ // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true.
+ // so that we can use this in the rules.
+ if (!nodeVisible) {
+ (0, CacheUtil_1.setCache)(node, "PT_NODE_HIDDEN", true);
+ }
+ // Check upwards recursively
+ return nodeVisible;
+ }
+ // Return true (node is visible)
+ return true;
+ };
+ /**
+ * return true if the node or its ancestor is natively hidden or aria-hidden = 'true'
+ * @param node
+ */
+ VisUtil.isNodeHiddenFromAT = function (node) {
+ if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true')
+ return true;
+ var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true");
+ if (ancestor)
+ return true;
+ return false;
+ };
+ // This list contains a list of element tags which can not be hidden, when hidden is
+ // added to theses elements it does not do anything at all.
+ // area --> area element is part of a map element and it can not be hidden because it is used to
+ // make an certian parts of an map interactive.
+ // param --> element can only be part of object elment and it cannot be hidden directly, it
+ // can only be hidden if the parent is hidden.
+ // audio --> If this element is hidden it will still play the music, so we should still trigger
+ // violations for this element.
+ // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check.
+ VisUtil.unhideableElements = ['area', 'param', 'audio'];
+ // This list contains a list of elements tags which have display: none by default, since we have rules triggering
+ // on theses elements we need to make then visible by default so that the rules can trigger regardless of the
+ // Check Hidden Content option in the tools.
+ // script --> script elements have display: none by default
+ // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to
+ // mark this element as visible at all times.
+ // head --> head elements have display: none by default, but it will still behave correct
+ // title --> title elements have display: none by default, but it will still display the title
+ // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to
+ // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to
+ // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to
+ // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content
+ // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template
+ // datalist --> datalist elements have display: none by default,
+ VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'title', 'meta', 'base', 'noscript', 'template', 'datalist'];
+ return VisUtil;
+}());
+exports.VisUtil = VisUtil;
+
+
+/***/ }),
+
+/***/ 1970:
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.StyleMapper = void 0;
+var CommonMapper_1 = __webpack_require__(1794);
+var StyleMapper = /** @class */ (function (_super) {
+ __extends(StyleMapper, _super);
+ function StyleMapper() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ StyleMapper.prototype.getRole = function (node) {
+ return "computed";
+ };
+ StyleMapper.prototype.getNamespace = function () {
+ return "css";
+ };
+ StyleMapper.prototype.getAttributes = function (node) {
+ var retVal = {};
+ if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {
+ var elem = node;
+ var style = elem.ownerDocument.defaultView.getComputedStyle(elem);
+ for (var idx = 0; idx < style.length; ++idx) {
+ var name_1 = style[idx].toLowerCase();
+ retVal[name_1] = style[name_1];
+ }
+ }
+ return retVal;
+ };
+ return StyleMapper;
+}(CommonMapper_1.CommonMapper));
+exports.StyleMapper = StyleMapper;
+
+
+/***/ }),
+
+/***/ 3005:
+/***/ ((__unused_webpack_module, exports) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0;
+var eToolkitLevel;
+(function (eToolkitLevel) {
+ eToolkitLevel["LEVEL_ONE"] = "1";
+ eToolkitLevel["LEVEL_TWO"] = "2";
+ eToolkitLevel["LEVEL_THREE"] = "3";
+ eToolkitLevel["LEVEL_FOUR"] = "4";
+})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {}));
+var eGuidelineCategory;
+(function (eGuidelineCategory) {
+ eGuidelineCategory["ACCESSIBILITY"] = "Accessibility";
+ eGuidelineCategory["DESIGN"] = "Design";
+ eGuidelineCategory["OTHER"] = "Other";
+})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {}));
+var eGuidelineType;
+(function (eGuidelineType) {
+ eGuidelineType["DEFAULT"] = "default";
+ eGuidelineType["EXTENSION"] = "extension";
+})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {}));
+
+
+/***/ }),
+
+/***/ 4377:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0;
+var eRuleConfidence;
+(function (eRuleConfidence) {
+ eRuleConfidence["PASS"] = "PASS";
+ eRuleConfidence["FAIL"] = "FAIL";
+ eRuleConfidence["POTENTIAL"] = "POTENTIAL";
+ eRuleConfidence["MANUAL"] = "MANUAL";
+})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {}));
+var eRulePolicy;
+(function (eRulePolicy) {
+ eRulePolicy["VIOLATION"] = "VIOLATION";
+ eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION";
+ eRulePolicy["INFORMATION"] = "INFORMATION";
+})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {}));
+function RulePass(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePass = RulePass;
+function RuleRender(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS],
+ reasonId: 0,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleRender = RuleRender;
+function RuleFail(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleFail = RuleFail;
+function RulePotential(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RulePotential = RulePotential;
+function RuleManual(reasonId, messageArgs, apiArgs) {
+ if (typeof reasonId === "undefined" || reasonId === null)
+ throw new Error("Reason ID must be defined");
+ return {
+ value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL],
+ reasonId: reasonId,
+ messageArgs: messageArgs || [],
+ apiArgs: apiArgs || []
+ };
+}
+exports.RuleManual = RuleManual;
+/**
+ * @deprecated See ./IGuideline
+ */
+var IGuideline_1 = __webpack_require__(3005);
+Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } }));
+/**
+ * @deprecated See ./IGuideline:eGuidelineCategory
+ */
+var IGuideline_2 = __webpack_require__(3005);
+Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } }));
+/**
+ * @deprecated See ./IGuideline:eGuidelineType
+ */
+var IGuideline_3 = __webpack_require__(3005);
+Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } }));
+
+
+/***/ }),
+
+/***/ 7884:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2020- IBM, Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.Checker = void 0;
+var IRule_1 = __webpack_require__(4377);
+var Engine_1 = __webpack_require__(9324);
+var ARIAMapper_1 = __webpack_require__(4944);
+var StyleMapper_1 = __webpack_require__(1970);
+var rulesets_1 = __webpack_require__(1070);
+var checkRulesV4 = __webpack_require__(8081);
+var IGuideline_1 = __webpack_require__(3005);
+var checkRules = [];
+var checkNls = {};
+var checkHelp = {};
+function _initialize() {
+ var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages()));
+ // Default lang to en-US if nothing else specified is found
+ langs.push("en-US");
+ // Process V4 rules into the V2 format
+ for (var rulename in checkRulesV4) {
+ // Convert rule
+ var v4Rule = checkRulesV4[rulename];
+ checkRules.push(v4Rule);
+ // Go backwards because the first lang is the preferred, so
+ // earlier languages will override later languages
+ for (var idx = langs.length - 1; idx >= 0; --idx) {
+ var langId = langs[idx];
+ if (langId in v4Rule.messages) {
+ checkNls[v4Rule.id] = v4Rule.messages[langId];
+ checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group;
+ }
+ if (langId in v4Rule.help) {
+ checkHelp[v4Rule.id] = {};
+ for (var reasonId in v4Rule.help[langId]) {
+ checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]);
+ }
+ checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group;
+ }
+ }
+ // Convert RS
+ for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) {
+ var rsSection = _a[_i];
+ for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) {
+ var rs = _c[_b];
+ var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id;
+ if (checkRsIds.includes(rs.id)) {
+ for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) {
+ var cp = _e[_d];
+ var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num;
+ if (checkCPIds.includes(cp.num)) {
+ cp.rules = cp.rules || [];
+ cp.rules.push({
+ id: v4Rule.id,
+ reasonCodes: rsSection.reasonCodes,
+ level: rsSection.level,
+ toolkitLevel: rsSection.toolkitLevel
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+}
+_initialize();
+var Checker = /** @class */ (function () {
+ function Checker() {
+ this.guidelines = [];
+ /**
+ * @deprecated Use getGuidelines().
+ */
+ this.rulesets = this.guidelines;
+ /**
+ * @deprecated Use getGuidelineIds().
+ */
+ this.rulesetIds = [];
+ this.rulesetRules = {};
+ this.ruleLevels = {};
+ this.ruleCategory = {};
+ var engine = this.engine = new Engine_1.Engine();
+ engine.addMapper(new ARIAMapper_1.ARIAMapper());
+ engine.addMapper(new StyleMapper_1.StyleMapper());
+ engine.addRules(checkRules);
+ engine.addNlsMap(checkNls);
+ engine.addHelpMap(checkHelp);
+ for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) {
+ var rs = a11yRulesets_1[_i];
+ this.addRuleset(rs);
+ }
+ }
+ /**
+ * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced.
+ * @param guideline
+ */
+ Checker.prototype.addGuideline = function (guideline) {
+ if (guideline.id in this.rulesetRules) {
+ this.removeGuideline(guideline.id);
+ }
+ this.guidelines.push(guideline);
+ this.rulesetIds.push(guideline.id);
+ var ruleIds = [];
+ for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) {
+ var cp = _a[_i];
+ cp.rules = cp.rules || [];
+ for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) {
+ var rule = _c[_b];
+ if (rule.enabled !== false) {
+ ruleIds.push(rule.id);
+ this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {};
+ this.ruleLevels[rule.id][guideline.id] = rule.level;
+ this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {};
+ this.ruleCategory[rule.id][guideline.id] = guideline.category;
+ }
+ }
+ }
+ this.rulesetRules[guideline.id] = ruleIds;
+ };
+ /**
+ * Enable a rule for all guidelines
+ * @param ruleId
+ */
+ Checker.prototype.enableRule = function (ruleId) {
+ for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) {
+ var guideline = _a[_i];
+ var updated = false;
+ for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) {
+ var cp = _c[_b];
+ for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) {
+ var rule = _e[_d];
+ if (rule.enabled === false) {
+ updated = true;
+ delete rule.enabled;
+ }
+ }
+ }
+ if (updated) {
+ this.addGuideline(guideline);
+ }
+ }
+ };
+ /**
+ * Disable a rule for all guidelines
+ * @param ruleId
+ */
+ Checker.prototype.disableRule = function (ruleId) {
+ for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) {
+ var guideline = _a[_i];
+ var updated = false;
+ for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) {
+ var cp = _c[_b];
+ for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) {
+ var rule = _e[_d];
+ if (rule.enabled !== false) {
+ updated = true;
+ rule.enabled = false;
+ }
+ }
+ }
+ if (updated) {
+ this.addGuideline(guideline);
+ }
+ }
+ };
+ /**
+ * Remove a guideline from the engine
+ *
+ * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check
+ * @param guidelineId
+ */
+ Checker.prototype.removeGuideline = function (guidelineId) {
+ if (guidelineId in this.rulesetRules) {
+ delete this.rulesetRules[guidelineId];
+ this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; });
+ this.rulesetIds = this.getGuidelineIds();
+ }
+ };
+ /**
+ * Get the guidelines available in the engine
+ * @returns
+ */
+ Checker.prototype.getGuidelines = function () {
+ return JSON.parse(JSON.stringify(this.guidelines));
+ };
+ /**
+ * Get the ids of the guidelines available in the engine
+ * @returns
+ */
+ Checker.prototype.getGuidelineIds = function () {
+ return this.guidelines.map(function (guideline) { return guideline.id; });
+ };
+ /**
+ *
+ * @deprecated See addGuideline
+ */
+ Checker.prototype.addRuleset = function (rs) {
+ this.addGuideline(rs);
+ };
+ /**
+ * Perform a check of the specified node/document
+ * @param node DOMNode or Document on which to run the check
+ * @param guidelineIds Guideline ids to check with to specify which rules to run
+ * @returns
+ */
+ Checker.prototype.check = function (node, guidelineIds) {
+ // Determine which rules to run
+ var ruleIds = [];
+ // Fix the input
+ if (!guidelineIds) {
+ ruleIds = this.engine.getRulesIds();
+ }
+ else {
+ if (typeof guidelineIds === "string") {
+ guidelineIds = [guidelineIds];
+ }
+ for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) {
+ var rsId = guidelineIds_1[_i];
+ if (rsId in this.rulesetRules) {
+ ruleIds = ruleIds.concat(this.rulesetRules[rsId]);
+ }
+ }
+ }
+ this.engine.enableRules(ruleIds);
+ // Add the report levels
+ var myThis = this;
+ return this.engine.run(node)
+ .then(function (report) {
+ report.nls = {};
+ for (var _i = 0, _a = report.results; _i < _a.length; _i++) {
+ var result = _a[_i];
+ if (result.ruleId in checkNls) {
+ report.nls[result.ruleId] = report.nls[result.ruleId] || {
+ 0: checkNls[result.ruleId][0]
+ };
+ if (result.reasonId in checkNls[result.ruleId]) {
+ report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId];
+ }
+ }
+ result.value[0] = myThis.getLevel(guidelineIds, result.ruleId);
+ result.category = myThis.getCategory(guidelineIds, result.ruleId);
+ delete result.path.css;
+ }
+ return report;
+ });
+ };
+ Checker.prototype.getLevel = function (rsIds, ruleId) {
+ if (!rsIds)
+ return IRule_1.eRulePolicy.INFORMATION;
+ var rsInfo = this.ruleLevels[ruleId];
+ var retVal = null;
+ if (rsIds) {
+ if (!(ruleId in this.ruleLevels)) {
+ throw new Error("Rule triggered for which we have no rule level information: " + ruleId);
+ }
+ for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) {
+ var rsId = rsIds_1[_i];
+ if (rsId in rsInfo) {
+ if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) {
+ retVal = IRule_1.eRulePolicy.VIOLATION;
+ }
+ else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) {
+ retVal = IRule_1.eRulePolicy.RECOMMENDATION;
+ }
+ else if (retVal === null) {
+ retVal = IRule_1.eRulePolicy.INFORMATION;
+ }
+ }
+ }
+ }
+ if (retVal === null) {
+ throw new Error("Rule triggered for which we have no rule level information: " + ruleId);
+ }
+ return retVal;
+ };
+ Checker.prototype.getCategory = function (rsIds, ruleId) {
+ var rsInfo = this.ruleCategory[ruleId];
+ var retVal = "";
+ if (!(ruleId in this.ruleCategory)) {
+ return IGuideline_1.eGuidelineCategory.OTHER;
+ }
+ if (!rsIds) {
+ rsIds = this.getGuidelineIds();
+ }
+ for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) {
+ var rsId = rsIds_2[_i];
+ if (rsId in rsInfo) {
+ return rsInfo[rsId];
+ }
+ }
+ return IGuideline_1.eGuidelineCategory.OTHER;
+ };
+ return Checker;
+}());
+exports.Checker = Checker;
+
+
+/***/ }),
+
+/***/ 8980:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a_target_warning = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.a_target_warning = {
+ id: "a_target_warning",
+ context: "dom:a[target],dom:area[target],dom:base[target]",
+ refactor: {
+ "WCAG20_A_TargetAndText": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_target_warning.html",
+ "Pass_0": "a_target_warning.html",
+ "Potential_1": "a_target_warning.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Users should be warned in advance if their input action will open a new window or otherwise change their context",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Inform the user when their input action will open a new window or otherwise change their context"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "3.2.2",
+ level: IRule_2.eRulePolicy.RECOMMENDATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // skip the rule if it's AT hidden and not tabbable
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !legacy_1.RPTUtil.isTabbable(ruleContext))
+ return null;
+ var params = {
+ paramWinText: {
+ value: ["new window", "new tab"],
+ type: "array"
+ }
+ };
+ var tStr = ruleContext.getAttribute("target");
+ var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || legacy_1.RPTUtil.getFrameByName(ruleContext, tStr) != null;
+ if (!passed) {
+ // Name is not part of this frameset – must have potential to create new window?
+ // See if a new window is mentioned
+ var textStr = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute("title"))
+ textStr += " " + ruleContext.getAttribute("title");
+ for (var i = 0; !passed && i < params.paramWinText.value.length; ++i)
+ if (textStr.indexOf(params.paramWinText.value[i]) != -1)
+ passed = true;
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3961:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.a_text_purpose = void 0;
+var ARIAMapper_1 = __webpack_require__(4944);
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_2 = __webpack_require__(4377);
+exports.a_text_purpose = {
+ id: "a_text_purpose",
+ // doc-biblioref is a link
+ context: "aria:link,aria:doc-biblioref",
+ refactor: {
+ "WCAG20_A_HasText": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "a_text_purpose.html",
+ "Pass_0": "a_text_purpose.html",
+ "Fail_1": "a_text_purpose.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Hyperlinks must have a text description of their purpose",
+ "Pass_0": "Hyperlink has a description of its purpose",
+ "Fail_1": "Hyperlink has no link text, label or image with a text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.4.4",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: "c487ae",
+ run: function (context, options) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ // Rule only passes if an element has inner content,
+ // in the case that there is only hidden content under the the element it is a violation
+ var passed = ARIAMapper_1.ARIAMapper.computeName(ruleContext).trim().length > 0
+ || legacy_1.RPTUtil.nonTabableChildCheck(ruleContext);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1445:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.applet_alt_exists = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.applet_alt_exists = {
+ id: "applet_alt_exists",
+ context: "dom:applet",
+ refactor: {
+ "WCAG20_Applet_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "applet_alt_exists.html",
+ "Pass_0": "applet_alt_exists.html",
+ "Fail_1": "applet_alt_exists.html",
+ "Fail_2": "applet_alt_exists.html",
+ "Fail_3": "applet_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": " elements must provide an 'alt' attribute and an alternative description",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element does not have an 'alt' attribute that provides a short text alternative",
+ "Fail_2": "The 'alt' attribute value for an element duplicates the 'code' attribute",
+ "Fail_3": "An element provides alternative text, but does not provide inner content"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - NO OUT OF SCOPE hidden in context
+ if (!legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt")) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ var alt = ruleContext.getAttribute("alt").trim();
+ if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ else if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 876:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.application_content_accessible = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.application_content_accessible = {
+ id: "application_content_accessible",
+ context: "aria:application",
+ refactor: {
+ "HAAC_Application_Role_Text": {
+ 0: "HAAC_Application_Role_Text.html",
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ 0: "application_content_accessible.html",
+ "Pass_0": "application_content_accessible.html",
+ "Potential_1": "application_content_accessible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var children = ruleContext.childNodes;
+ for (var i = 0; passed && i < children.length; i++) {
+ if (children[i].nodeType === 1) {
+ if (VisUtil_1.VisUtil.isNodeVisible(children[i])) {
+ passed = legacy_1.RPTUtil.hasRoleInSemantics(children[i], "document") || legacy_1.RPTUtil.hasRoleInSemantics(children[i], "article");
+ }
+ }
+ else if (children[i].nodeType === 3) {
+ passed = children[i].nodeValue.trim().length === 0;
+ }
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2768:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.area_alt_exists = void 0;
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.area_alt_exists = {
+ id: "area_alt_exists",
+ context: "dom:area",
+ refactor: {
+ "WCAG20_Area_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "area_alt_exists.html",
+ "Pass_0": "area_alt_exists.html",
+ "Fail_1": "area_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": " elements in an image map must have a text alternative",
+ "Pass_0": "Rule Passed",
+ "Fail_1": " element in an image map has no text alternative"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "1.1.1",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // JCH - NO OUT OF SCOPE hidden in context
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2533:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_accessiblename_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_accessiblename_exists = {
+ id: "aria_accessiblename_exists",
+ context: "aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak",
+ help: {
+ "en-US": {
+ "pass": "aria_accessiblename_exists.html",
+ "fail_no_accessible_name": "aria_accessiblename_exists.html",
+ "group": "aria_accessiblename_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "An accessible name is provided for the element",
+ "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name",
+ "group": "Elements with certain roles should have accessible names"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // when table element with a caption as first child
+ if (ruleContext.nodeName.toLocaleLowerCase() === 'table'
+ && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption'
+ && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0)
+ return (0, IRule_1.RulePass)("pass");
+ var invalidRoles = (0, CommonUtil_1.getRolesUndefinedByAria)(ruleContext);
+ if (invalidRoles && invalidRoles.length > 0)
+ return null;
+ var deprecatedRoles = (0, CommonUtil_1.getDeprecatedAriaRoles)(ruleContext);
+ if (deprecatedRoles && deprecatedRoles.length > 0)
+ return null;
+ var deprecatedAttributes = (0, CommonUtil_1.getDeprecatedAriaAttributes)(ruleContext);
+ if (deprecatedAttributes && deprecatedAttributes.length > 0)
+ return null;
+ if (legacy_1.RPTUtil.getAriaLabel(ruleContext).trim().length === 0 && !legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title")) {
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, true);
+ //when multiple roles specified, only the first valid role is applied, and the others just as fallbacks
+ if (roles && roles.length > 0 && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) {
+ //if (!RPTUtil.getInnerText(ruleContext) || RPTUtil.getInnerText(ruleContext).trim().length === 0)
+ //exclude the hidden text?
+ if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext))
+ return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), roles[0]]);
+ }
+ else
+ return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), roles[0]]);
+ }
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 7178:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_activedescendant_tabindex_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_activedescendant_tabindex_valid = {
+ id: "aria_activedescendant_tabindex_valid",
+ context: "dom:*[aria-activedescendant]",
+ refactor: {
+ "Rpt_Aria_InvalidTabindexForActivedescendant": {
+ "pass": "pass",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_activedescendant_tabindex_valid.html",
+ "Fail_1": "aria_activedescendant_tabindex_valid.html",
+ "group": "aria_activedescendant_tabindex_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",
+ "group": "Element using 'aria-activedescendant' property should be tabbable"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // Rule not supported on mobile
+ if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") {
+ return null;
+ }
+ // Handle the case where the element is hidden by disabled html5 attribute or aria-disabled:
+ // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed.
+ // 2. In the case that this element has a aria-disabled attribute then, we mark this rule as passed.
+ // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another.
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ //ignore if the attribute 'aria-activedescendant' is blank
+ if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0)
+ return;
+ // If the tabindex attribute is provided then verify that it is 0 or -1
+ passed = legacy_1.RPTUtil.isTabbable(ruleContext);
+ // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element
+ if (!passed)
+ passed = legacy_1.RPTUtil.getTabbableChildren(ruleContext) > 0;
+ // Build array for node token
+ var retToken1 = new Array();
+ retToken1.push(nodeName);
+ // Build array for id referenced by aria-activedescendant
+ var retToken2 = new Array();
+ retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", "));
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9745:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_activedescendant_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+var DOMUtil_1 = __webpack_require__(295);
+exports.aria_activedescendant_valid = {
+ id: "aria_activedescendant_valid",
+ context: "dom:*[aria-activedescendant]",
+ refactor: {
+ "HAAC_ActiveDescendantCheck": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3",
+ "Fail_4": "Fail_4"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_activedescendant_valid.html",
+ "Fail_1": "aria_activedescendant_valid.html",
+ "Fail_2": "aria_activedescendant_valid.html",
+ "Fail_3": "aria_activedescendant_valid.html",
+ "Fail_4": "aria_activedescendant_valid.html",
+ "group": "aria_activedescendant_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'aria-activedescendant' property is empty",
+ "Fail_2": "The 'aria-activedescendant' property references a hidden node",
+ "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant",
+ "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component",
+ "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // combobox active descendants handled by 'combobox_active_descendant'
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "combobox")) {
+ return null;
+ }
+ var descendant_id = legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-activedescendant");
+ // POF1: The attribute is empty
+ if (!descendant_id || descendant_id.trim() === "") {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim());
+ if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) {
+ // The referenced element doesn't exist. We let 1077 to trigger the error
+ return null;
+ }
+ if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) {
+ // POF2: aria-activedescendant references a hidden node
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ // 1. The value of aria-activedescendant refers to an element that is either a descendant of
+ // the element with DOM focus
+ if (ruleContext.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ var pofId = 2;
+ // or is a logical descendant as indicated by the aria-owns attribute.
+ if (ruleContext.hasAttribute("aria-owns")) {
+ var owned_ids = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" ");
+ for (var i = 0; i < owned_ids.length; i++) {
+ var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]);
+ if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+ // 2. The element with DOM focus is a textbox with aria-controls referring to an element that
+ // supports aria-activedescendant, and the value of aria-activedescendant specified for the
+ // textbox refers to either a descendant of the element controlled by the textbox or is a logical
+ // descendant of that controlled element as indicated by the aria-owns attribute.
+ //
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) {
+ pofId = 3;
+ var controlled_ids = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" ");
+ for (var i = 0; i < controlled_ids.length; i++) {
+ var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]);
+ if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ if (controlled_ele.hasAttribute("aria-owns")) {
+ var owns_ids = legacy_1.RPTUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" ");
+ for (var j = 0; j < owns_ids.length; j++) {
+ var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]);
+ if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ }
+ }
+ }
+ // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element
+ // that referenced it.
+ if (pofId == 3) {
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8019:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_application_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_application_label_unique = {
+ id: "aria_application_label_unique",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_MultipleApplicationLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_label_unique.html",
+ "Fail_1": "aria_application_label_unique.html",
+ "group": "aria_application_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"application\" role do not have unique labels",
+ "group": "Each element with \"application\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "application", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_application_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_application_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6505:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_application_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_application_labelled = {
+ id: "aria_application_labelled",
+ context: "aria:application",
+ refactor: {
+ "Rpt_Aria_ApplicationLandmarkLabel": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_application_labelled.html",
+ "Fail_1": "aria_application_labelled.html",
+ "group": "aria_application_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"application\" role does not have an accessible name",
+ "group": "An element with \"application\" role must have an accessible name that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8910:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_article_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_article_label_unique = {
+ id: "aria_article_label_unique",
+ context: "aria:article",
+ refactor: {
+ "Rpt_Aria_MultipleArticleRoles_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_article_label_unique.html",
+ "Fail_1": "aria_article_label_unique.html",
+ "group": "aria_article_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"article\" role do not have unique labels",
+ "group": "Each element with \"article\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "article", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_article_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_article_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3492:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_allowed = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_attribute_allowed = {
+ id: "aria_attribute_allowed",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_ValidProperty": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_allowed.html",
+ "Pass_0": "aria_attribute_allowed.html",
+ "Fail_1": "aria_attribute_allowed.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA attributes must be valid for the element's role",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "5f99a7",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var contextAttributes = ruleContext.attributes;
+ // This gets all elements with attributes so we still have some
+ // Out of Scope since not all attributes are aria
+ if (contextAttributes) {
+ var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes;
+ var failedProperties = "";
+ var testedProperties = 0;
+ for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) {
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ testedProperties++;
+ // Now we just have aria attributes which can
+ // pass or fail based on whether there property is valid
+ var dataTypes = propertyDataTypes[attrName];
+ if (!dataTypes) { // if property is not in valid property list
+ // create failedProperties comma sep list
+ if (failedProperties.length == 0) {
+ failedProperties = attrName;
+ }
+ else {
+ failedProperties = failedProperties + ", " + attrName;
+ }
+ }
+ }
+ }
+ if (testedProperties == 0) {
+ return null;
+ }
+ else if (failedProperties.length != 0) {
+ return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]);
+ }
+ else {
+ //return RulePass(1);
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ // JCH - passing is based on all attributes not just aria attributes
+ // leading to OVER COUNTING so moved pass up
+ //return RulePass(1);
+ }
+};
+
+
+/***/ }),
+
+/***/ 5316:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_conflict = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_attribute_conflict = {
+ id: "aria_attribute_conflict",
+ context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]"
+ + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]"
+ + ", dom:*[aria-rowspan]",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_conflict.html",
+ "fail_conflict": "aria_attribute_conflict.html",
+ "group": "aria_attribute_conflict.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"",
+ "group": "An ARIA attribute must not conflict with the corresponding HTML attribute"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // dependency check: if the ARIA attribute is completely invalid, skip this check
+ var invalidAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ var ret = [];
+ var ariaAttributes = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (!ariaAttributes || ariaAttributes.length === 0)
+ return null;
+ var conflictAttributes = (0, CommonUtil_1.getConflictAriaAndHtmlAttributes)(ruleContext);
+ for (var i = 0; i < conflictAttributes.length; i++) {
+ ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']]));
+ if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr']))
+ legacy_1.RPTUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes);
+ }
+ for (var i = 0; i < ariaAttributes.length; i++)
+ ret.push((0, IRule_1.RulePass)("pass"));
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8412:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_attribute_deprecated = {
+ id: "aria_attribute_deprecated",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_deprecated.html",
+ "fail_aria_role": "aria_attribute_deprecated.html",
+ "fail_aria_attr": "aria_attribute_deprecated.html",
+ "fail_role_attr": "aria_attribute_deprecated.html",
+ "group": "aria_attribute_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The ARIA roles and attribute are used per specification",
+ "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification",
+ "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification",
+ "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification",
+ "group": "No deprecated ARIA role or attribute should be used"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["ARIA"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var ret = [];
+ var deprecatedRoles = (0, CommonUtil_1.getDeprecatedAriaRoles)(ruleContext);
+ if (deprecatedRoles && deprecatedRoles.length > 0) {
+ for (var i = 0; i < deprecatedRoles.length; i++)
+ ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]]));
+ }
+ var deprecatedAttributes = (0, CommonUtil_1.getDeprecatedAriaAttributes)(ruleContext);
+ if (deprecatedAttributes && deprecatedAttributes.length > 0) {
+ for (var i = 0; i < deprecatedAttributes.length; i++) {
+ // "role":"any", "attribute":ariaAttrs[i]}
+ if (deprecatedAttributes[i].role === 'any')
+ ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute]));
+ else
+ ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role]));
+ }
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 172:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_attribute_exists = {
+ id: "aria_attribute_exists",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_EmptyPropertyValue": {
+ "pass": "pass",
+ "fail_empty_attribute": "fail_empty_attribute"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_exists.html",
+ "fail_empty_attribute": "aria_attribute_exists.html",
+ "group": "aria_attribute_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_empty_attribute": "The element attribute(s): '{0}' value is empty",
+ "group": "When specifying a required ARIA attribute, the value must not be empty"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["6a7281"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return;
+ var attrNameArr = new Array();
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var testedProperties = 0;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ for (var j = 0; j < roles.length; ++j) {
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) {
+ var attribute = requiredRoleProps[i];
+ if (hasAttribute(ruleContext, attribute)) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i]));
+ if (nodeValue.length == 0)
+ attrNameArr.push(requiredRoleProps[i]);
+ }
+ else if (requiredRoleProps[i] == "aria-labelledby") {
+ if ((roles[i] == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-label"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-label");
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((roles[i] == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext"));
+ if (nodeValue.length == 0)
+ attrNameArr.push("aria-valuetext");
+ }
+ }
+ }
+ }
+ if (designPatterns[roles[j]]) {
+ var tagProperty = legacy_1.RPTUtil.getElementAriaProperty(ruleContext);
+ var permittedRoles = [];
+ permittedRoles.push(roles[j]);
+ var allowedAttributes = legacy_1.RPTUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty);
+ for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) {
+ var attribute = allowedAttributes[i];
+ if (attribute == "aria-checked" || attribute == "aria-selected" ||
+ attribute == "aria-expanded" || attribute == "aria-orientation" ||
+ attribute == "aria-level") {
+ if (hasAttribute(ruleContext, attribute)) {
+ testedProperties++;
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(ruleContext.getAttribute(attribute));
+ if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) {
+ attrNameArr.push(attribute);
+ }
+ }
+ }
+ }
+ }
+ }
+ var retMsg = new Array();
+ var passed = attrNameArr.length == 0;
+ retMsg.push(attrNameArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg);
+ if (testedProperties == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9844:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_redundant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_attribute_redundant = {
+ id: "aria_attribute_redundant",
+ context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]"
+ + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]"
+ + ", dom:*[aria-rowspan]",
+ help: {
+ "en-US": {
+ "pass": "aria_attribute_redundant.html",
+ "fail_redundant": "aria_attribute_redundant.html",
+ "group": "aria_attribute_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"",
+ "group": "An ARIA attribute should not be used when there is a corresponding HTML attribute"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // dependency check: if the ARIA attribute is completely invalid, skip this check
+ var invalidAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (invalidAttributes && invalidAttributes.length > 0)
+ return null;
+ // if conflict already reported, ignore reporting overlap
+ var conflictAttributes = (0, CommonUtil_1.getConflictAriaAndHtmlAttributes)(ruleContext);
+ if (conflictAttributes && conflictAttributes.length > 0)
+ return null;
+ var domAttributes = ruleContext.attributes;
+ var ariaAttrs = [];
+ var htmlAttrs = [];
+ if (domAttributes) {
+ for (var i = 0; i < domAttributes.length; i++) {
+ var attrName = domAttributes[i].name.trim().toLowerCase();
+ var attrValue = ruleContext.getAttribute(attrName);
+ if (attrValue === '')
+ attrValue = null;
+ if (attrName.substring(0, 5) === 'aria-')
+ ariaAttrs.push({ name: attrName, value: attrValue });
+ else
+ htmlAttrs.push({ name: attrName, value: attrValue });
+ }
+ }
+ var ret = [];
+ var _loop_1 = function (i) {
+ var examinedHtmlAtrNames = legacy_1.RPTUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping');
+ if (examinedHtmlAtrNames === null)
+ return "continue";
+ examinedHtmlAtrNames.forEach(function (item) {
+ if (item['result'] === 'Pass') { //pass
+ ret.push((0, IRule_1.RulePass)("pass"));
+ }
+ else if (item['result'] === 'Failed') { //failed
+ ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']]));
+ }
+ });
+ };
+ for (var i = 0; i < ariaAttrs.length; i++) {
+ _loop_1(i);
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 9695:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_required = void 0;
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_attribute_required = {
+ id: "aria_attribute_required",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_RequiredProperties": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_required.html",
+ "Pass_0": "aria_attribute_required.html",
+ "Fail_1": "aria_attribute_required.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "When using a ARIA role on an element, the required attributes for that role must be defined",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "An element with ARIA role '{0}' does not have the required ARIA attribute(s): '{1}'"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "4e8ab6",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var attrNameArr = new Array();
+ var roleNameArr = new Array();
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext);
+ var implicitRole = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var testedRoles = 0;
+ for (var j = 0, rolesLength = roles.length; j < rolesLength; ++j) {
+ if (implicitRole.length > 0 && implicitRole.includes(roles[j]))
+ continue;
+ if (designPatterns[roles[j]] && legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext) != null) {
+ var requiredRoleProps = legacy_1.RPTUtil.getRoleRequiredProperties(roles[j], ruleContext);
+ var roleMissingReqProp = false;
+ testedRoles++;
+ for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) {
+ if (!hasAttribute(ruleContext, requiredRoleProps[i])) {
+ // If an aria-labelledby isn't present, an aria-label will meet the requirement.
+ if (requiredRoleProps[i] == "aria-labelledby") {
+ if ((!hasAttribute(ruleContext, "aria-label")) || (roles[i] != "radiogroup")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-valuenow") {
+ if ((!hasAttribute(ruleContext, "aria-valuetext")) || (roles[i] != "progressbar")) {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ else if (requiredRoleProps[i] == "aria-controls" && roles[j] == "combobox") {
+ // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input
+ }
+ else {
+ attrNameArr.push(requiredRoleProps[i]);
+ roleMissingReqProp = true;
+ }
+ }
+ }
+ if (roleMissingReqProp == true) {
+ roleNameArr.push(roles[j]);
+ }
+ }
+ }
+ var retToken = new Array();
+ var passed = attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE
+ retToken.push(roleNameArr.join(", "));
+ retToken.push(attrNameArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : retToken);
+ if (testedRoles === 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", retToken);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1699:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_value_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+exports.aria_attribute_value_valid = {
+ id: "aria_attribute_value_valid",
+ context: "dom:*",
+ dependencies: ["aria_attribute_allowed"],
+ refactor: {
+ "Rpt_Aria_ValidPropertyValue": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_value_valid.html",
+ "Pass_0": "aria_attribute_value_valid.html",
+ "Fail_1": "aria_attribute_value_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA property values must be valid",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "6a7281",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var valueArr = new Array();
+ var attrNameArr = new Array();
+ var dataTypeArr = new Array();
+ var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes;
+ var contextAttributes = ruleContext.attributes;
+ var testedPropertyValues = 0;
+ if (contextAttributes) {
+ for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) {
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ var dataTypes = propertyDataTypes[attrName];
+ var nodeValue = legacy_1.RPTUtil.normalizeSpacing(contextAttributes[i].nodeValue);
+ testedPropertyValues++;
+ if (dataTypes && dataTypes.values) {
+ if (dataTypes.values.indexOf(nodeValue) == -1) {
+ if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) {
+ //translate 'undefined' to mean ''
+ }
+ else {
+ // aria-relevant is represented as a space delimited list of the following values:
+ // additions, removals, text; or a single catch-all value all.
+ if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") {
+ var attrValues = contextAttributes[i].nodeValue.trim().split(" ");
+ // if the value all is specified, it cannot have any other value
+ if (attrValues.length > 1 && attrValues.includes("all")) {
+ valueArr.push(contextAttributes[i].nodeValue.split(" "));
+ attrNameArr.push(attrName);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ else {
+ var hash = {};
+ for (var j = 0; j < attrValues.length; j++) {
+ // if the individual value is not in the list of allowed values
+ if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) {
+ if (!hash.hasOwnProperty(attrName)) {
+ hash[attrName] = true;
+ attrNameArr.push(attrName);
+ }
+ valueArr.push(attrValues[j]);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ }
+ }
+ }
+ else {
+ valueArr.push(contextAttributes[i].nodeValue.split(" "));
+ attrNameArr.push(attrName);
+ dataTypeArr.push(dataTypes.values.toString());
+ }
+ }
+ }
+ }
+ else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") {
+ var iVal = parseInt(nodeValue);
+ if (isNaN(iVal) || ("" + iVal !== nodeValue)) {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") {
+ var fVal = parseFloat(nodeValue);
+ if (isNaN(fVal)) {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) {
+ var tmpV = nodeValue.trim().toLowerCase();
+ if (tmpV !== "true" && tmpV !== "false") {
+ valueArr.push(nodeValue);
+ attrNameArr.push(attrName);
+ }
+ }
+ else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) {
+ }
+ else {
+ testedPropertyValues--;
+ }
+ }
+ }
+ }
+ var retMsg = new Array();
+ var passed = attrNameArr.length == 0;
+ retMsg.push(valueArr.join(", "));
+ retMsg.push(attrNameArr.join(", "));
+ retMsg.push(ruleContext.nodeName.toLowerCase());
+ // retMsg.push (dataTypeArr.join(", "));
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg);
+ if (testedPropertyValues == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", retMsg);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_banner_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_banner_label_unique = {
+ id: "aria_banner_label_unique",
+ context: "aria:banner",
+ refactor: {
+ "Rpt_Aria_MultipleBannerLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_banner_label_unique.html",
+ "Fail_1": "aria_banner_label_unique.html",
+ "group": "aria_banner_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"banner\" role do not have unique labels",
+ "group": "Each element with \"banner\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "banner", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_banner_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_banner_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3054:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_banner_single = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_banner_single = {
+ id: "aria_banner_single",
+ context: "dom:*[role], dom:header",
+ refactor: {
+ "Rpt_Aria_OneBannerInSiblingSet_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_banner_single.html",
+ "Fail_1": "aria_banner_single.html",
+ "group": "aria_banner_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "There is more than one element with \"banner\" role on the page",
+ "group": "There must be only one element with \"banner\" role on the page"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "banner")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null;
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4649:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_child_tabbable = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_child_tabbable = {
+ id: "aria_child_tabbable",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_MissingFocusableChild": {
+ "pass": "pass",
+ "fail_missing_child": "fail_missing_child"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_child_tabbable.html",
+ "fail_missing_child": "aria_child_tabbable.html",
+ "group": "aria_child_tabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable",
+ "group": "UI component must have at least one tabbable descendant for keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext) || legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ // An ARIA list is not interactive
+ if (legacy_1.RPTUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) {
+ return null;
+ }
+ // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled.
+ if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") {
+ return null;
+ }
+ //ignore datalist element check since it will be part of a input element or hidden by default
+ if (ruleContext.nodeName.toLowerCase() === 'datalist')
+ return null;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ // Determine if this is referenced by a combobox. If so, focus is controlled by the combobox
+ // ignore if the id of the element is referenced by another element with "aria-controls" or "aria-expanded" and with certain roles. If so, focus is controlled by the referencing element
+ var id = ruleContext.getAttribute("id");
+ if (id && id.trim().length > 0) {
+ /**if (ruleContext.ownerDocument.querySelector(`*[aria-controls='${id}'][role='combobox']`)) {
+ return null;
+ }
+ */
+ var elem = ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][aria-haspopup='true'], *[aria-controls='").concat(id, "'][aria-expanded='true']"));
+ var containers_1 = ['combobox', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid'];
+ if (elem && legacy_1.RPTUtil.isTabbable(elem) && roles && roles.length > 0 && roles.some(function (r) { return containers_1.includes(r); }))
+ return null;
+ }
+ var passed = true;
+ var doc = ruleContext.ownerDocument;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ var roleNameArr = new Array();
+ var nodeName = "";
+ var inScope = false;
+ for (var j = 0; j < roles.length; ++j) {
+ if (ARIADefinitions_1.ARIADefinitions.containers.includes(roles[j])) {
+ var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
+ if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren;
+ if (reqChildren) {
+ inScope = true;
+ passed = false;
+ var xp = "descendant::*[";
+ for (var i = 0; i < reqChildren.length; i++) {
+ xp += "@role='" + reqChildren[i] + "' or ";
+ }
+ xp = xp.substring(0, xp.length - 4) + ']';
+ var xpathResult = doc.evaluate(xp, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ while (r && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r)) {
+ r = xpathResult.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r);
+ // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex.
+ if (!passed) {
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, r, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r);
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ if (!passed) {
+ roleNameArr = r.getAttribute("role").trim().split(" ");
+ nodeName = r.nodeName.toLowerCase();
+ }
+ r = xpathResult.iterateNext();
+ }
+ }
+ }
+ }
+ }
+ // Variable Decleration
+ var retToken1 = new Array();
+ var retToken2 = new Array();
+ // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this
+ // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of
+ // updating the whole rule to switch from using passed in that way simply do the check at this point.
+ if (nodeName.length > 0 && roleNameArr.length > 0) {
+ retToken1.push(nodeName);
+ retToken2.push(roleNameArr.join(", "));
+ }
+ else {
+ passed = true;
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]);
+ if (!inScope) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4193:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_child_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_child_valid = {
+ id: "aria_child_valid",
+ //context: "dom:*[role]",
+ //dependencies: ["Rpt_Aria_ValidRole"],
+ context: "dom:*",
+ dependencies: ["aria_role_valid", "aria_descendant_valid"],
+ help: {
+ "en-US": {
+ "group": "aria_child_valid.html",
+ "Pass": "aria_child_valid.html",
+ "Fail_no_child": "aria_child_valid.html",
+ "Fail_invalid_child": "aria_child_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with a ARIA role must own a required child",
+ "Pass": "An element with a ARIA role owns a required child",
+ "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"",
+ "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Verify mapping
+ act: ["bc4a75"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element requires presentational children only
+ if (legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return null;
+ // ignore if the element contains none or presentation role
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ // For combobox, we have g1193 ... g1199 to check the values etc.
+ // We don't want to trigger 1152 again. So, we bypass it here.
+ if (roles.includes("combobox"))
+ return null;
+ var requiredChildRoles = legacy_1.RPTUtil.getRequiredChildRoles(ruleContext, true);
+ // a 'group' role is allowed but not required for some elements so remove it if exists
+ if (requiredChildRoles.includes('group')) {
+ var index = requiredChildRoles.indexOf('group');
+ if (index > -1)
+ requiredChildRoles.splice(index, 1);
+ }
+ /**
+ * ignore if a role doesn't require a child with any specific role
+ * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule
+ */
+ if (requiredChildRoles.length == 0)
+ return null;
+ // get all the children from accessibility tree,
+ // including ones with aria-owns
+ var directATChildren = legacy_1.RPTUtil.getDirectATChildren(ruleContext);
+ if (!directATChildren || directATChildren.length == 0) {
+ // the element with at least one required role dosen't contain any accessible child
+ /**
+ * When a widget is missing required owned elements due to script execution or loading,
+ * authors MUST mark a containing element with 'aria-busy' equal to true.
+ */
+ var busy = ruleContext.getAttribute("aria-busy");
+ if (!busy || busy !== 'true') {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(requiredChildRoles.join(", "));
+ return (0, IRule_1.RuleFail)("Fail_no_child", retToken);
+ }
+ // it's 'busy' loading, ignore it
+ return null;
+ }
+ var violateElemRoles = new Array();
+ for (var j = 0; j < directATChildren.length; j++) {
+ var childRoles = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!childRoles || childRoles.length == 0)
+ childRoles = legacy_1.RPTUtil.getImplicitRole(directATChildren[j]);
+ if (childRoles && childRoles.length > 0) {
+ /**
+ * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected.
+ * the specification does not require an instance of each of the listed owned roles.
+ * therefore, the requirement is met if it has any one of the required roles.
+ */
+ var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); });
+ if (!found_1)
+ violateElemRoles.push(childRoles.join(", "));
+ }
+ else {
+ // ignore the element since it's not semantic, shouldn't happen
+ }
+ }
+ if (violateElemRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < violateElemRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(violateElemRoles[i]);
+ retToken.push(requiredChildRoles.join(", "));
+ retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken));
+ }
+ return retValues;
+ }
+ return (0, IRule_1.RulePass)("Pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3188:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_complementary_label_unique = {
+ id: "aria_complementary_label_unique",
+ context: "aria:complementary",
+ refactor: {
+ "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_label_unique.html",
+ "Fail_1": "aria_complementary_label_unique.html",
+ "group": "aria_complementary_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"complementary\" role do not have unique labels",
+ "group": "Each element with \"complementary\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "complementary", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_complementary_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4176:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_label_visible = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_complementary_label_visible = {
+ id: "aria_complementary_label_visible",
+ context: "dom:*[role], dom:aside",
+ dependencies: ["aria_complementary_labelled"],
+ refactor: {
+ "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_label_visible.html",
+ "Fail_1": "aria_complementary_label_visible.html",
+ "group": "aria_complementary_label_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"complementary\" role does not have a visible label",
+ "group": "Each element with \"complementary\" role should have a visible label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "complementary")) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-labelledby");
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7964:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_complementary_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_complementary_labelled = {
+ id: "aria_complementary_labelled",
+ context: "aria:complementary",
+ refactor: {
+ "Rpt_Aria_ComplementaryRequiredLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_complementary_labelled.html",
+ "Fail_1": "aria_complementary_labelled.html",
+ "group": "aria_complementary_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"complementary\" role does not have an accessible name",
+ "group": "An element with \"complementary\" role must have an accessible name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2554:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_content_in_landmark = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_content_in_landmark = {
+ id: "aria_content_in_landmark",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_OrphanedContent_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_content_in_landmark.html",
+ "Fail_1": "aria_content_in_landmark.html",
+ "group": "aria_content_in_landmark.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Content is not within a landmark element",
+ "group": "All content must reside within an element with a landmark role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var params = (0, CacheUtil_1.getCache)(context.dom.node.ownerDocument, "aria_content_in_landmark", null);
+ if (!params) {
+ params = {
+ landmarks: {
+ value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"],
+ type: "array"
+ },
+ possibleOrphanedWidgets: {
+ value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list",
+ "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree",
+ "treegrid"
+ ],
+ type: "array"
+ },
+ possibleOrphanedElements: {
+ value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5",
+ "h6", "embed", "object", "area"
+ ],
+ type: "array"
+ },
+ noLandmarkedRoles: {
+ // These roles don't require landmarks
+ value: ["alert", "alertdialog", "dialog", "tooltip"],
+ type: "array"
+ },
+ mapLandmarks: {},
+ mapPossibleOrphanedWidgets: {},
+ mapPossibleOrphanedElements: {},
+ mapNoLandmarkedRoles: {}
+ };
+ // Convert arrays to maps
+ params.mapLandmarks = {};
+ for (var i = 0; i < params.landmarks.value.length; ++i) {
+ params.mapLandmarks[params.landmarks.value[i]] = true;
+ }
+ params.mapPossibleOrphanedWidgets = {};
+ for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) {
+ params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true;
+ }
+ params.mapPossibleOrphanedElements = {};
+ for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) {
+ params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true;
+ }
+ params.mapNoLandmarkedRoles = {};
+ for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) {
+ params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true;
+ }
+ (0, CacheUtil_1.setCache)(context.dom.node.ownerDocument, "aria_content_in_landmark", params);
+ }
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes
+ (VisUtil_1.VisUtil.hiddenByDefaultElements != null &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements != undefined &&
+ VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"];
+ if (!legacy_1.RPTUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content
+ elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ // Short circuit for layout tables
+ if (nodeName == "table" && legacy_1.RPTUtil.isLayoutTable(ruleContext)) {
+ return null;
+ }
+ // Check if it is a possible orphan
+ var passed = true;
+ var isPossibleOrphanedWidget = legacy_1.RPTUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true);
+ //exclude in the and (#608)
+ //having link in the head could cause lot of violaions
+ if (nodeName === 'link') {
+ isPossibleOrphanedWidget = false;
+ }
+ var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements;
+ if (isPossibleOrphanedWidget || isPossibleOrphanedElement) {
+ // See if ancestor has landmark roles or implicit land mark roles
+ var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; });
+ passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0;
+ if (!passed) {
+ // Don't fail elements when a parent or sibling has failed - causes too many messages.
+ var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext);
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement);
+ }
+ walkElement = ruleContext.nextElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.nextElementSibling;
+ }
+ walkElement = ruleContext.previousElementSibling;
+ while (!passed && walkElement != null) {
+ passed = (0, CacheUtil_1.getCache)(walkElement, "Rpt_Aria_OrphanedContent", false);
+ walkElement = walkElement.previousElementSibling;
+ }
+ if (!passed) {
+ (0, CacheUtil_1.setCache)(ruleContext, "Rpt_Aria_OrphanedContent", true);
+ // Don't trigger rule if element is a stand-alone widget
+ passed = (0, CacheUtil_1.getCache)(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) ||
+ legacy_1.RPTUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) ||
+ legacy_1.RPTUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true);
+ if (passed) {
+ (0, CacheUtil_1.setCache)(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true);
+ return null;
+ }
+ }
+ else {
+ return null;
+ }
+ }
+ }
+ else {
+ return null;
+ }
+ //return new ValidationResult(passed, [ruleContext], '', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1229:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_contentinfo_label_unique = {
+ id: "aria_contentinfo_label_unique",
+ context: "aria:contentinfo",
+ refactor: {
+ "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_label_unique.html",
+ "Fail_1": "aria_contentinfo_label_unique.html",
+ "group": "aria_contentinfo_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"contentinfo\" role do not have unique labels",
+ "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "contentinfo", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_contentinfo_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8523:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_misuse = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_contentinfo_misuse = {
+ id: "aria_contentinfo_misuse",
+ context: "dom:*[role], dom:footer, dom:address",
+ refactor: {
+ "Rpt_Aria_ContentinfoWithNoMain_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_misuse.html",
+ "Fail_1": "aria_contentinfo_misuse.html",
+ "group": "aria_contentinfo_misuse.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with \"contentinfo\" role is present without an element with \"main\" role",
+ "group": "An element with \"contentinfo\" role is only permitted with an element with \"main\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //consider implicit role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ // Consider the Check Hidden Content setting that is set by the rules
+ var passed = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0;
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3781:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_contentinfo_single = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_contentinfo_single = {
+ id: "aria_contentinfo_single",
+ context: "dom:*[role], dom:footer, dom:address",
+ refactor: {
+ "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_contentinfo_single.html",
+ "Fail_1": "aria_contentinfo_single.html",
+ "group": "aria_contentinfo_single.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"contentinfo\" role found on a page",
+ "group": "A page, document or application should only have one element with \"contentinfo\" role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //find out if element has siblings as has implicit contentinfo role
+ if (!legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "contentinfo")) {
+ return null;
+ }
+ var passed = !legacy_1.RPTUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true);
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8509:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_descendant_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_descendant_valid = {
+ id: "aria_descendant_valid",
+ context: "dom:*",
+ dependencies: ["aria_role_valid"],
+ help: {
+ "en-US": {
+ "group": "aria_descendant_valid.html",
+ "pass": "aria_descendant_valid.html",
+ "potential_child_implicit_role": "aria_descendant_valid.html",
+ "fail_child_explicit_role": "aria_descendant_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",
+ "pass": "The element contains valid descendants",
+ "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers",
+ "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Verify mapping
+ act: ["307n5z"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element doesn't require presentational children only
+ if (!legacy_1.RPTUtil.containsPresentationalChildrenOnly(ruleContext))
+ return;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // if explicit role doesn't exist, get the implicit one
+ if (!roles || roles.length === 0)
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ //ignore if the element doesn't have any explicit or implicit role, shouldn't happen
+ if (!roles || roles.length === 0)
+ return null;
+ var tagName = ruleContext.tagName.toLowerCase();
+ // get all the children from accessibility tree,
+ // including ones with aria-owns
+ var directATChildren = legacy_1.RPTUtil.getDirectATChildren(ruleContext);
+ if (directATChildren && directATChildren.length > 0) {
+ // the element with at least one non-presentational children
+ var explicitRoles = new Array();
+ var implicitRoles = new Array();
+ for (var j = 0; j < directATChildren.length; j++) {
+ // ignore and
+ var tag = directATChildren[j].nodeName.toLowerCase();
+ if (tag === 'img' || tag === 'svg')
+ continue;
+ // get explicit role if exists
+ var childRoles = legacy_1.RPTUtil.getRoles(directATChildren[j], false);
+ if (childRoles && childRoles.length > 0) {
+ explicitRoles.push(childRoles.join(", "));
+ }
+ else {
+ // get implicit role if exists
+ childRoles = legacy_1.RPTUtil.getImplicitRole(directATChildren[j]);
+ if (childRoles && childRoles.length > 0)
+ implicitRoles.push(childRoles.join(", "));
+ }
+ }
+ if (explicitRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < explicitRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(explicitRoles[i]);
+ retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken));
+ }
+ return retValues;
+ }
+ if (implicitRoles.length > 0) {
+ var retValues = [];
+ for (var i = 0; i < implicitRoles.length; i++) {
+ var retToken = new Array();
+ retToken.push(roles.join(", "));
+ retToken.push(implicitRoles[i]);
+ retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken));
+ }
+ return retValues;
+ }
+ }
+ else
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3234:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_document_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_document_label_unique = {
+ id: "aria_document_label_unique",
+ context: "aria:document",
+ refactor: {
+ "Rpt_Aria_MultipleDocumentRoles": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_document_label_unique.html",
+ "Fail_1": "aria_document_label_unique.html",
+ "group": "aria_document_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with a \"document\" role do not have unique labels",
+ "group": "All elements with a \"document\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "document", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_document_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_document_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1;
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5217:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_eventhandler_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_eventhandler_role_valid = {
+ id: "aria_eventhandler_role_valid",
+ context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",
+ refactor: {
+ "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_eventhandler_role_valid.html",
+ "Fail_1": "aria_eventhandler_role_valid.html",
+ "group": "aria_eventhandler_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified",
+ "group": "Elements with event handlers must have a valid ARIA role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Don't trigger this for SVG element for now until a determination is made (by Rich)
+ // to support SVG at a point when the SVG a11y spec is ready.
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, "svg")) {
+ return null;
+ }
+ //this rule is passed if a element has attribut role
+ //also, passed of element has any implicit roles.
+ if (legacy_1.RPTUtil.hasAnyRole(ruleContext, true)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ //pass if this element is received focus by default
+ if (legacy_1.RPTUtil.isfocusableByDefault(ruleContext)) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ //validate if this element has any of the given event handler's
+ var retToken1 = new Array();
+ retToken1.push(ruleContext.nodeName.toLowerCase());
+ var eventArr = new Array();
+ // From WCAG20_Script_UseW3CDomFunctions
+ //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown",
+ // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout",
+ // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll",
+ // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"];
+ var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown",
+ "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout",
+ "onmouseover", "onresize"
+ ];
+ for (var i = 0; i < events.length; ++i) {
+ if (ruleContext.hasAttribute(events[i]))
+ eventArr.push(events[i]);
+ }
+ var retToken2 = new Array();
+ retToken2.push(eventArr.join(", "));
+ //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]);
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4050:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_form_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_form_label_unique = {
+ id: "aria_form_label_unique",
+ context: "aria:form",
+ refactor: {
+ "Rpt_Aria_MultipleFormLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_form_label_unique.html",
+ "Fail_1": "aria_form_label_unique.html",
+ "group": "aria_form_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"form\" role do not have unique labels",
+ "group": "Each element with \"form\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "form" ||
+ ruleContext.hasAttribute("aria-label") ||
+ ruleContext.hasAttribute("aria-labelledby") ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "form", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_form_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_form_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" &&
+ (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4275:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_graphic_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_graphic_labelled = {
+ id: "aria_graphic_labelled",
+ context: "aria:graphics-document,aria:graphics-symbol",
+ refactor: {
+ "HAAC_Aria_SvgAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_graphic_labelled.html",
+ "Pass_0": "aria_graphic_labelled.html",
+ "Fail_1": "aria_graphic_labelled.html",
+ "Fail_2": "aria_graphic_labelled.html",
+ "Fail_3": "aria_graphic_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with a graphics role must have a non-empty label",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"{0}\" graphics role has no label",
+ "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label",
+ "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "7d6734": {
+ "Pass_0": "pass",
+ "Fail_1": "inapplicable",
+ "Fail_2": "fail",
+ "Fail_3": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-"))
+ return null;
+ /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation
+ if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){
+ return RulePass(1);
+ }*/
+ // If role === img, you must use an aria label
+ //check attributes aria-label and aria-labelledby for other tags (e.g. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // We should guide people to use alt or label - this is just a secondary approach to silence the rule.
+ // So, we should keep the POF from above.
+ // if (!passed) POF = "Fail_3";
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]);
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1465:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_hidden_nontabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.aria_hidden_nontabbable = {
+ id: "aria_hidden_nontabbable",
+ context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",
+ refactor: {
+ "aria_hidden_focus_misuse": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_hidden_nontabbable.html",
+ "Pass_0": "aria_hidden_nontabbable.html",
+ "Fail_1": "aria_hidden_nontabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "A hidden element should not contain any tabbable elements",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: ["1.3.1", "4.1.2"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ // TODO: ACT: Handle testcase with focus jumping away
+ act: "6cfa84",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ return (0, IRule_1.RuleFail)("Fail_1", [nodeName]);
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 405:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_id_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_id_unique = {
+ id: "aria_id_unique",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_ValidIdRef": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_id_unique.html",
+ "Fail_1": "aria_id_unique.html",
+ "group": "aria_id_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",
+ "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be
+ // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset
+ // aligns with ACT.
+ act: ["59796f", "6a7281"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var pass = true;
+ var attrNameArr = new Array();
+ var nonExistantIDs = new Array();
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var contextAttributes = ruleContext.attributes;
+ var idTokens = new Array();
+ var testedReferences = 0;
+ if (contextAttributes) {
+ for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) {
+ pass = true;
+ var attrName = contextAttributes[i].name;
+ if (legacy_1.RPTUtil.isDefinedAriaAttribute(ruleContext, attrName)) {
+ var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName];
+ if (dataTypes && dataTypes.type) {
+ var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false;
+ //If the data type supports one or more id refs do error checking
+ if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) {
+ testedReferences++;
+ var nodeValueLength = legacy_1.RPTUtil.normalizeSpacing(contextAttributes[i].nodeValue).length;
+ var idArray = contextAttributes[i].nodeValue.split(" ");
+ // Check for an empty ID Ref
+ if (nodeValueLength < 1) {
+ pass = false;
+ idTokens.push("\"" + contextAttributes[i].nodeValue + "\"");
+ }
+ // check to see if too many IDRefs
+ else if (supportsOneIDRef) {
+ //If has too many IDRefs it is an error
+ if (nodeValueLength >= 1) {
+ if (idArray.length > 1) {
+ pass = false;
+ // Need to capture all the IDRefs for idTokens
+ for (var z = 0, length_1 = idArray.length; z < length_1; ++z) {
+ if (idArray[z] != "") {
+ idTokens.push(idArray[z]);
+ }
+ }
+ }
+ }
+ }
+ // check to see if id refs are invalid
+ if (pass && nodeValueLength >= 1) {
+ for (var j = 0, length_2 = idArray.length; j < length_2; ++j) {
+ if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other
+ // Get the element by Id
+ var elementById = ownerDocument.getElementById(idArray[j]);
+ // Pass if the element exists
+ pass = elementById != null;
+ // If the element exists and this is an aria attribute that doesn't support hidden ID reference
+ // then perform a isNodeVisible check, in the case the node is not visible then we return
+ // false and true otherwise.
+ if (pass && !dataTypes.hiddenIDRefSupported) {
+ pass = VisUtil_1.VisUtil.isNodeVisible(elementById);
+ }
+ if (!pass) {
+ if (idArray[j] != "") {
+ idTokens.push(idArray[j]);
+ }
+ }
+ // Only one of the id references need to be valid to mark the rule as passed.
+ // Therefore if we find a single visible element then stop checking and mark as
+ // passed.
+ else {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (!pass)
+ attrNameArr.push(attrName);
+ }
+ }
+ }
+ var passed = attrNameArr.length == 0;
+ var retToken1 = new Array();
+ var retToken2 = new Array();
+ var retToken3 = new Array();
+ if (!passed) {
+ retToken2.push(attrNameArr.join(", "));
+ retToken3.push(ruleContext.nodeName.toLowerCase());
+ if (idTokens.length > 0) {
+ retToken1.push(idTokens.join(", "));
+ }
+ }
+ //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]);
+ if (testedReferences == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9136:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_img_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_img_labelled = {
+ id: "aria_img_labelled",
+ context: "aria:img",
+ refactor: {
+ "HAAC_Aria_ImgAlt": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_img_labelled.html",
+ "Pass_0": "aria_img_labelled.html",
+ "Fail_1": "aria_img_labelled.html",
+ "Fail_2": "aria_img_labelled.html",
+ "Fail_3": "aria_img_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with \"img\" role must have a non-empty label",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with \"img\" role has no label",
+ "Fail_2": "Element with \"img\" role has no label or an empty label",
+ "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["23a2a8", {
+ "7d6734": {
+ "Pass_0": "pass",
+ "Fail_1": "inapplicable",
+ "Fail_2": "fail",
+ "Fail_3": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ if (!ruleContext.hasAttribute("role")) {
+ // If no role, this is implicit, and covered by WCAG20_Img_HasAlt
+ return null;
+ }
+ /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation
+ if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){
+ return RulePass(1);
+ }*/
+ /* JCH - Points of failure
+ * 0. Missing alt attr with value
+ * 1. Missing aria-label or aria-labelledby
+ * 2. Missing title attr with value
+ */
+ // If role === img, you must use an aria label
+ //check attributes aria-label and aria-labelledby for other tags (e.g. ,
, etc)
+ var passed = legacy_1.RPTUtil.getAriaLabel(ruleContext).length > 0;
+ if (!passed && ruleContext.nodeName.toLowerCase() === "svg") {
+ var svgTitle = ruleContext.querySelector("title");
+ passed = svgTitle && legacy_1.RPTUtil.hasInnerContent(svgTitle);
+ }
+ if (!passed) {
+ //check title attribute
+ passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ // We should guide people to use alt or label - this is just a secondary approach to silence the rule.
+ // So, we should keep the POF from above.
+ // if (!passed) POF = "Fail_3";
+ }
+ //return new ValidationResult(passed, [ruleContext], 'role', '', []);
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5117:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_keyboard_handler_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+exports.aria_keyboard_handler_exists = {
+ id: "aria_keyboard_handler_exists",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_MissingKeyboardHandler": {
+ "pass": "pass",
+ "potential_no_keyboard_access": "potential_no_keyboard_access"
+ }
+ },
+ help: {
+ "en-US": {
+ "pass": "aria_keyboard_handler_exists.html",
+ "potential_no_keyboard_access": "aria_keyboard_handler_exists.html",
+ "group": "aria_keyboard_handler_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access",
+ "group": "Interactive WAI_ARIA UI components must provide keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var savedPassed = passed;
+ var doc = ruleContext.ownerDocument;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first,
+ // and the current rule should be ignored
+ if (nodeName === 'datalist' && roles && roles.includes("listbox"))
+ return null;
+ var hasAttribute = legacy_1.RPTUtil.hasAttribute;
+ // Composite user interface widget roles. They act as containers that manage other, contained widgets.
+ var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"];
+ var roleNameArr = new Array();
+ for (var j = 0; j < roles.length; ++j) {
+ var pattern = designPatterns[roles[j]];
+ if (roleContainers.indexOf(roles[j]) >= 0) {
+ var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
+ if (!disabled) {
+ // See if there is a keyboard event handler on the parent element.
+ passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress"));
+ // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements.
+ if (!passed) {
+ if (!hasAttribute(ruleContext, 'aria-activedescendant')) {
+ var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren;
+ if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */
+ for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) {
+ var xp = "*[contains(@role,'" + reqChildren[i] + "')]";
+ var xpathResult = doc.evaluate(xp, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r = xpathResult.iterateNext();
+ while (r) {
+ passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Child did not have a key handler. See if any of the grandchildren do.
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, r, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r2) &&
+ (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Is this an action link?
+ if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) {
+ var href = r2.getAttribute("href");
+ // Action link must start with "javascript:", must not contain a "void" and
+ // must have a function name following "javascript:" (i.e., href.length > 11)
+ passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11);
+ }
+ }
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ if (!passed) {
+ // All the required children (or any descendants of the required children) must have keypress/keydown
+ // If not, it is a failure, no need to keep checking any more.
+ break;
+ }
+ r = xpathResult.iterateNext();
+ }
+ }
+ }
+ else {
+ // The current element failed the keydown/keypress, and it does not have required children, such as menubar.
+ // Let's check its descendants.
+ var xp2 = "descendant::*";
+ var xpathResult2 = doc.evaluate(xp2, ruleContext, legacy_1.RPTUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null);
+ var r2 = xpathResult2.iterateNext();
+ while (r2 && !passed) {
+ // Following are the steps that are executed at this stage to determine if the node should be classified as hidden
+ // or not.
+ // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to,
+ // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not
+ // add it to the roleToElems hash at all or even do any checking for it at all.
+ //
+ // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one,
+ // so on and so forth.
+ if (legacy_1.RPTUtil.shouldNodeBeSkippedHidden(r2)) {
+ r2 = xpathResult2.iterateNext();
+ continue;
+ }
+ passed = legacy_1.RPTUtil.isTabbable(r2) &&
+ (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress"));
+ if (!passed) {
+ // Is this an action link?
+ if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) {
+ var href = r2.getAttribute("href");
+ // Action link must start with "javascript:", must not contain a "void" and
+ // must have a function name following "javascript:" (i.e., href.length > 11)
+ passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11);
+ }
+ }
+ r2 = xpathResult2.iterateNext();
+ }
+ }
+ }
+ else {
+ // Attribute 'aria-activedescendant' is specified.
+ passed = true;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ roleNameArr.push(roles[j]);
+ }
+ if (!passed && savedPassed) {
+ savedPassed = passed;
+ }
+ }
+ var retToken1 = new Array();
+ retToken1.push(ruleContext.nodeName.toLowerCase());
+ var retToken2 = new Array();
+ retToken2.push(roleNameArr.join(", "));
+ // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check
+ var id = ruleContext.getAttribute("id");
+ if (id && id.trim().length > 0) {
+ if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) {
+ return null;
+ }
+ }
+ return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9062:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_landmark_name_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var DOMUtil_1 = __webpack_require__(295);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_landmark_name_unique = {
+ id: "aria_landmark_name_unique",
+ context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",
+ refactor: {
+ "landmark_name_unique": {
+ "Pass_0": "Pass_0",
+ "Fail_0": "Fail_0"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_landmark_name_unique.html",
+ "Fail_0": "aria_landmark_name_unique.html",
+ "group": "aria_landmark_name_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Multiple \"{0}\" landmarks with the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",
+ "Fail_0": "Multiple \"{0}\" landmarks with the same parent region are not distinguished from one another because they have the same \"{1}\" label",
+ "group": "Multiple landmarks should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent regions"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ var ruleContext = context["dom"].node;
+ // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it.
+ var copyOfRuleContext = ruleContext;
+ var parnetNodesOfRuleContext = [];
+ while (copyOfRuleContext) {
+ parnetNodesOfRuleContext.unshift(copyOfRuleContext);
+ copyOfRuleContext = copyOfRuleContext.parentElement;
+ }
+ parnetNodesOfRuleContext.forEach(function (elem) {
+ if (elem !== null) {
+ if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") {
+ return null; // Skipping checking landmarks that happen to be inside dialog elements
+ }
+ }
+ });
+ // Begining formCache work
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_landmark_name_unique", null);
+ if (!formCache) {
+ // console.log("---------ENTERING FORM CACHE")
+ formCache = {
+ navigationNodes: [],
+ navigationNodesComputedLabels: [],
+ navigationNodesParents: [],
+ navigationNodesMatchFound: []
+ };
+ var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]');
+ var navigationNodes = Array.from(navigationNodesTemp);
+ var navigationNodesParents = [];
+ var navigationNodesMatchFound = [];
+ // This block of code filters out any nav elements that are under an dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page.
+ var navigationNodesWithoutDialogs = [];
+ for (var i = 0; i < navigationNodes.length; i++) {
+ var a = navigationNodes[i];
+ var dialogNodeFoundFlag = false;
+ while (a) {
+ a = a.parentElement;
+ if (a !== null) {
+ if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") {
+ dialogNodeFoundFlag = true;
+ }
+ }
+ }
+ if (!dialogNodeFoundFlag) {
+ navigationNodesWithoutDialogs.push(navigationNodes[i]);
+ }
+ }
+ navigationNodes = navigationNodesWithoutDialogs;
+ for (var i = 0; i < navigationNodes.length; i++) {
+ // Loop over all the landmark nodes
+ var els = [];
+ var a = navigationNodes[i].parentElement;
+ while (a) {
+ els.push(a);
+ a = a.parentElement;
+ }
+ for (var j = 0; j < els.length; j++) {
+ // Loop over all the parents of the landmark nodes
+ // Find nearest landmark parent based on the tagName or the role attribute
+ var tagNameTrigger = [
+ "ASIDE",
+ "FOOTER",
+ "FORM",
+ "HEADER",
+ "MAIN",
+ "NAV",
+ "SECTION",
+ ].includes(els[j].tagName);
+ var roleNameTrigger = false;
+ if (els[j].hasAttribute("role")) {
+ roleNameTrigger = [
+ "complementary",
+ "contentinfo",
+ "form",
+ "banner",
+ "main",
+ "navigation",
+ "region",
+ "search",
+ ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. E.g. role = "form banner". This is a improvment we might want to add in the future.
+ }
+ if (tagNameTrigger || roleNameTrigger) {
+ // Nearest parent-landmark found
+ navigationNodesParents.push(els[j]);
+ break;
+ }
+ if (j === els.length - 1) {
+ // This node is at the head of the file so it does not have a parent
+ navigationNodesParents.push(null);
+ break;
+ }
+ }
+ }
+ var navigationNodesComputedLabels = [];
+ for (var i = 0; i < navigationNodes.length; i++) {
+ // Loop over all the landmark nodes
+ navigationNodesComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(navigationNodes[i]));
+ }
+ for (var i = 0; i < navigationNodesParents.length; i++) {
+ // Loop over all the parents of the landmark nodes to find duplicates
+ var matchFound = false;
+ var pass_0_flag = false;
+ for (var j = 0; j < navigationNodesParents.length; j++) {
+ if (j === i) {
+ // We do not want to compare against ourselfs
+ continue;
+ }
+ // This if statement focus on the case where the parent landmark is null
+ if (navigationNodesParents[i] === null &&
+ navigationNodesParents[j] === null) {
+ // We are looking at two root nodes, so we should compare them.
+ if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) ===
+ ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) {
+ // Both nodes have the same role AND
+ if (navigationNodesComputedLabels[i] ===
+ navigationNodesComputedLabels[j]) {
+ // both have the same (computed) aria-label/aria-labelledby
+ // if (navigationNodesComputedLabels[i] === "") {
+ navigationNodesMatchFound.push("Fail_0"); // Fail 0
+ matchFound = true;
+ break;
+ // }
+ }
+ else {
+ // Same parents && same node roles BUT different computed aria-label/aria-labelledby
+ // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag.
+ pass_0_flag = true;
+ }
+ }
+ else {
+ // Same parents but different node roles // Not applicable
+ }
+ }
+ else if (navigationNodesParents[i] === null ||
+ navigationNodesParents[j] === null) {
+ // We are looking at a single root node
+ continue;
+ }
+ // This if statement focus on the case where the parent landmark is NOT null
+ if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) {
+ // We have the same parent-landmark AND
+ if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) ===
+ ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) {
+ // Both nodes have the same role AND
+ if (navigationNodesComputedLabels[i] ===
+ navigationNodesComputedLabels[j]) {
+ // both have the same (computed) aria-label/aria-labelledby
+ // if (navigationNodesComputedLabels[i] === "") {
+ navigationNodesMatchFound.push("Fail_0"); // Fail 0
+ matchFound = true;
+ break;
+ // }
+ }
+ else {
+ // Same parents && same node roles BUT different computed aria-label/aria-labelledby
+ // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag.
+ pass_0_flag = true;
+ }
+ }
+ else {
+ // Same parents but different node roles // Not applicable
+ }
+ }
+ else {
+ // Different parents // Not applicable
+ }
+ }
+ if (!matchFound) {
+ if (pass_0_flag) {
+ navigationNodesMatchFound.push("Pass_0");
+ }
+ else {
+ navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up.
+ }
+ }
+ }
+ formCache.navigationNodesComputedLabels =
+ navigationNodesComputedLabels;
+ formCache.navigationNodes = navigationNodes;
+ formCache.navigationNodesParents = navigationNodesParents;
+ formCache.navigationNodesMatchFound = navigationNodesMatchFound;
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache);
+ // TODO Add validation that all 3 arrays are the same length
+ // console.log("-------------End formCache")
+ } // End formCache
+ var indexToCheck = -1;
+ for (var i = 0; i < formCache.navigationNodes.length; i++) {
+ if (ruleContext.isSameNode(formCache.navigationNodes[i])) {
+ indexToCheck = i;
+ }
+ }
+ if (indexToCheck === -1) {
+ return null;
+ }
+ if (formCache.navigationNodesMatchFound[indexToCheck] === "Pass_0") {
+ return (0, IRule_1.RulePass)("Pass_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ ]);
+ }
+ else if (formCache.navigationNodesMatchFound[indexToCheck] === "Fail_0") {
+ return (0, IRule_1.RuleFail)("Fail_0", [
+ ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]),
+ formCache.navigationNodesComputedLabels[indexToCheck],
+ ]);
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5746:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_main_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_main_label_unique = {
+ id: "aria_main_label_unique",
+ context: "aria:main",
+ refactor: {
+ "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_main_label_unique.html",
+ "Fail_1": "aria_main_label_unique.html",
+ "group": "aria_main_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"main\" role do not have unique labels",
+ "group": "Elements with \"main\" role must have unique labels"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var contextLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var parentDocRole = legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "document", true);
+ var mains = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true);
+ var result = null;
+ for (var i = 0; i < mains.length; ++i) {
+ if (mains[i] === ruleContext)
+ continue;
+ result = (0, IRule_1.RulePass)("Pass_0");
+ var thisParentDocRole = legacy_1.RPTUtil.getAncestorWithRole(mains[i], "document", true);
+ if (thisParentDocRole === parentDocRole) {
+ if (legacy_1.RPTUtil.getAriaLabel(mains[i]) === contextLabel) {
+ result = (0, IRule_1.RuleFail)("Fail_1");
+ break;
+ }
+ }
+ }
+ return result;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8685:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_main_label_visible = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.aria_main_label_visible = {
+ id: "aria_main_label_visible",
+ context: "dom:body",
+ refactor: {
+ "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_main_label_visible.html",
+ "Fail_1": "aria_main_label_visible.html",
+ "group": "aria_main_label_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels",
+ "group": "Each element with \"main\" role should have a unique visible label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ //call getElementsByRoleHidden with considerImplicit flag as true
+ //so that the method returs elements
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasUniqueAriaLabelledby(landmarks);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2678:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_navigation_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_navigation_label_unique = {
+ id: "aria_navigation_label_unique",
+ context: "aria:navigation",
+ refactor: {
+ "Rpt_Aria_MultipleNavigationLandmarks_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_navigation_label_unique.html",
+ "Fail_1": "aria_navigation_label_unique.html",
+ "group": "aria_navigation_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"navigation\" role do not have unique labels",
+ "group": "Each element with \"navigation\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "navigation", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_navigation_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 971:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_parent_required = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_parent_required = {
+ id: "aria_parent_required",
+ context: "dom:*[role]",
+ dependencies: ["aria_role_allowed"],
+ refactor: {
+ "Rpt_Aria_RequiredParent_Native_Host_Sematics": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_parent_required.html",
+ "Pass_0": "aria_parent_required.html",
+ "Fail_1": "aria_parent_required.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "An element with an implicit or explicit role must be contained within a valid element",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element with role \"{0}\" is not contained in or owned by an element with one of the following roles: \"{1}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Check Fail 3
+ act: "ff89c9",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip the check if the element should be a presentational child of an element
+ if (legacy_1.RPTUtil.shouldBePresentationalChild(ruleContext))
+ return;
+ var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/);
+ // ignore if the element contains none or presentation role
+ var presentationRoles = ["none", "presentation"];
+ var found = roles.some(function (r) { return presentationRoles.includes(r); });
+ if (found)
+ return null;
+ var passed = true;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ var roleNameArr = new Array();
+ var containerRoles = new Array();
+ var testedContainer = 0;
+ var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; });
+ var parentRole = ancestorRoles[ancestorRoles.length - 2];
+ var count = 2;
+ while (parentRole === 'none') {
+ count++;
+ parentRole = ancestorRoles[ancestorRoles.length - count];
+ }
+ for (var j = 0, length_1 = roles.length; j < length_1; ++j) {
+ if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) {
+ testedContainer++;
+ passed = false;
+ containerRoles = designPatterns[roles[j]].container;
+ for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) {
+ passed = parentRole === containerRoles[i];
+ if (passed)
+ break;
+ }
+ if (passed == false) {
+ roleNameArr.push(roles[j]);
+ }
+ }
+ }
+ var retToken1 = new Array();
+ retToken1.push(roleNameArr.join(", "));
+ var retToken2 = new Array();
+ retToken2.push(containerRoles.join(", "));
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]);
+ if (testedContainer == 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3709:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_region_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_region_label_unique = {
+ id: "aria_region_label_unique",
+ context: "aria:region",
+ refactor: {
+ "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_region_label_unique.html",
+ "Fail_1": "aria_region_label_unique.html",
+ "group": "aria_region_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"region\" role do not have unique labels",
+ "group": "Each element with a \"region\" role must have a unique label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html
+ // form element should only be considered if it has an aria label or title
+ if (ruleContext.getAttribute("role") === "region" ||
+ ruleContext.hasAttribute("aria-label") ||
+ (ruleContext.hasAttribute("aria-labelledby") && !legacy_1.RPTUtil.isIdReferToSelf(ruleContext, ruleContext.getAttribute("aria-labelledby"))) ||
+ ruleContext.hasAttribute("title")) {
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "region", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_region_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_region_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" &&
+ (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ else {
+ return null;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6486:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_region_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.aria_region_labelled = {
+ id: "aria_region_labelled",
+ context: "aria:region",
+ refactor: {
+ "Rpt_Aria_RegionLabel_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_region_labelled.html",
+ "Fail_1": "aria_region_labelled.html",
+ "Fail_2": "aria_region_labelled.html",
+ "group": "aria_region_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Element with a \"region\" role does not have an accessible name",
+ "Fail_2": "The element with \"region\" role is not labeled with an 'aria-label' or 'aria-labelledby'",
+ "group": "Each element with \"region\" role must have an accessible name that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4151:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_role_allowed = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_role_allowed = {
+ id: "aria_role_allowed",
+ context: "dom:*[role]",
+ refactor: {
+ "Rpt_Aria_ValidRole": {
+ "Pass_0": "Pass_0",
+ "Fail_2": "Fail_2",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_role_allowed.html",
+ "Pass_0": "aria_role_allowed.html",
+ "Fail_2": "aria_role_allowed.html",
+ "Potential_1": "aria_role_allowed.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Elements must have a valid 'role' per ARIA specification",
+ "Pass_0": "Rule Passed",
+ "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification",
+ "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "4.1.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ // TODO: ACT: Recheck
+ act: "674b10",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var roleStr = ruleContext.getAttribute("role").trim().toLowerCase();
+ if (roleStr.length === 0) {
+ return null;
+ }
+ if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") {
+ return null;
+ }
+ var invalidRoles = (0, CommonUtil_1.getRolesUndefinedByAria)(ruleContext);
+ if (!invalidRoles || invalidRoles.length === 0)
+ return (0, IRule_1.RulePass)("Pass_0");
+ else {
+ var roles = roleStr.split(/\s+/);
+ if (invalidRoles.length === roles.length) {
+ return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]);
+ }
+ else if (invalidRoles.length > 0) {
+ return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]);
+ }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8545:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_role_redundant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_role_redundant = {
+ id: "aria_role_redundant",
+ context: "dom:*[role]",
+ help: {
+ "en-US": {
+ "pass": "aria_role_redundant.html",
+ "fail_redundant": "aria_role_redundant.html",
+ "group": "aria_role_redundant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element",
+ "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>",
+ "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["ARIA"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var elemName = ruleContext.tagName.toLowerCase();
+ var ariaRoles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ if (!ariaRoles || ariaRoles.length === 0)
+ return;
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ var role_defined = (0, CommonUtil_1.areRolesDefined)(ariaRoles);
+ if (!role_defined)
+ return null;
+ // dependency check: if it's already failed in the parent relation, then skip this check
+ if (["td", "th", "tr"].includes(elemName)) {
+ var parentRole = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var implicitRoles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ if (!implicitRoles || implicitRoles.length === 0)
+ return (0, IRule_1.RulePass)("pass");
+ var ret = [];
+ for (var i = 0; i < ariaRoles.length; i++) {
+ if (!implicitRoles.includes(ariaRoles[i]))
+ ret.push((0, IRule_1.RulePass)("pass"));
+ else
+ ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName]));
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 8538:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_search_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_search_label_unique = {
+ id: "aria_search_label_unique",
+ context: "aria:search",
+ refactor: {
+ "Rpt_Aria_MultipleSearchLandmarks": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_search_label_unique.html",
+ "Fail_1": "aria_search_label_unique.html",
+ "group": "aria_search_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple elements with \"search\" role do not have unique labels",
+ "group": "Each element with \"search\" role must have a unique label that describes its purpose"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "search", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_search_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_search_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1908:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_attribute_valid = exports.aria_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CommonUtil_1 = __webpack_require__(8137);
+exports.aria_role_valid = {
+ id: "aria_role_valid",
+ context: "dom:*",
+ dependencies: ["aria_attribute_allowed"],
+ refactor: {
+ "aria_semantics_role": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_role_valid.html",
+ "Fail_1": "aria_role_valid.html",
+ "Fail_2": "aria_role_valid.html",
+ "group": "aria_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>",
+ "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",
+ "group": "ARIA roles must be valid for the element to which they are assigned"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var tagName = ruleContext.tagName.toLowerCase();
+ // only chek element (1) and fragment nodes (11)
+ if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */)
+ return null;
+ //skip the rule
+ // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report
+ var undefinedRoles = (0, CommonUtil_1.getRolesUndefinedByAria)(ruleContext);
+ if (undefinedRoles && undefinedRoles.length > 0)
+ return null;
+ var deprecatedRoles = (0, CommonUtil_1.getDeprecatedAriaRoles)(ruleContext);
+ if (deprecatedRoles && deprecatedRoles.length > 0)
+ return null;
+ var deprecatedAttributes = (0, CommonUtil_1.getDeprecatedAriaAttributes)(ruleContext);
+ if (deprecatedAttributes && deprecatedAttributes.length > 0)
+ return null;
+ // dependency check: if it's already failed, then skip
+ if (["td", "th", "tr"].includes(tagName)) {
+ var parentRole = (0, CommonUtil_1.isTableDescendant)(contextHierarchies);
+ if (parentRole !== null && parentRole.length > 0)
+ return null;
+ }
+ var domRoles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ if (!domRoles || domRoles.length === 0)
+ return null;
+ // check the 'generic' role first
+ if (domRoles.includes('generic'))
+ return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]);
+ var invalidRoles = (0, CommonUtil_1.getInvalidRoles)(ruleContext);
+ if (invalidRoles === null || invalidRoles.length === 0)
+ return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]);
+ if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && legacy_1.RPTUtil.isTabbable(ruleContext))
+ return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]);
+ if (invalidRoles.length > 0)
+ return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]);
+ if (domRoles.length > 0)
+ return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]);
+ return null;
+ }
+};
+// This rule is in the same file because there is a dependency that aria_role_valid runs first,
+// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular
+// dependency cannot be used
+exports.aria_attribute_valid = {
+ id: "aria_attribute_valid",
+ context: "dom:*",
+ // The the ARIA role is completely invalid, skip this check
+ dependencies: ["aria_attribute_deprecated", "aria_role_valid"],
+ refactor: {
+ "aria_attribute_allowed": {
+ "Pass": "Pass",
+ "Fail_invalid_role_attr": "Fail_invalid_role_attr",
+ "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_attribute_valid.html",
+ "Pass": "aria_attribute_valid.html",
+ "Fail_invalid_role_attr": "aria_attribute_valid.html",
+ "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "ARIA attributes must be valid for the element and ARIA role to which they are assigned",
+ "Pass": "ARIA attributes are valid for the element and ARIA role",
+ "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"",
+ "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // only chek element (1)
+ if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */)
+ return null;
+ // ignore if no aria attribute
+ var ariaAttributes = legacy_1.RPTUtil.getUserDefinedAriaAttributes(ruleContext);
+ if (ariaAttributes === null || ariaAttributes.length === 0)
+ return null;
+ var roles = legacy_1.RPTUtil.getUserDefinedRoles(ruleContext);
+ var explicit = true;
+ if (roles && roles.length > 0) {
+ // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report
+ if (!(0, CommonUtil_1.areRolesDefined)(roles))
+ return null;
+ }
+ else {
+ //no explicit role defined
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ explicit = false;
+ }
+ var tagName = ruleContext.tagName.toLowerCase();
+ var failedAttributes = (0, CommonUtil_1.getInvalidAriaAttributes)(ruleContext);
+ if (!failedAttributes || failedAttributes.length === 0)
+ return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]);
+ if (roles.length > 0) {
+ if (explicit)
+ return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]);
+ else
+ return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]);
+ }
+ return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 6360:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_toolbar_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.aria_toolbar_label_unique = {
+ id: "aria_toolbar_label_unique",
+ context: "aria:toolbar",
+ refactor: {
+ "Rpt_Aria_MultipleToolbarUniqueLabel": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "aria_toolbar_label_unique.html",
+ "Fail_1": "aria_toolbar_label_unique.html",
+ "group": "aria_toolbar_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Multiple toolbar components do not have unique labels",
+ "group": "All toolbar components on a page must have unique labels specified"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Consider the Check Hidden Content setting that is set by the rules
+ // Also, consider Implicit role checking.
+ var landmarks = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true);
+ if (landmarks.length === 0 || landmarks.length === 1) {
+ return null;
+ }
+ var dupes = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", null);
+ if (!dupes) {
+ dupes = legacy_1.RPTUtil.findAriaLabelDupes(landmarks);
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes);
+ }
+ var myLabel = legacy_1.RPTUtil.getAriaLabel(ruleContext);
+ var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [myLabel]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 5386:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.aria_widget_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var DOMUtil_1 = __webpack_require__(295);
+exports.aria_widget_labelled = {
+ id: "aria_widget_labelled",
+ context: "dom:*",
+ refactor: {
+ "Rpt_Aria_WidgetLabels_Implicit": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "aria_widget_labelled.html",
+ "Pass_0": "aria_widget_labelled.html",
+ "Fail_1": "aria_widget_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Interactive component must have a programmatically associated name",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: "m6b1q3",
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */
+ if ((ruleContext.hasAttribute("type") &&
+ ruleContext.getAttribute("type") === "hidden") ||
+ (legacy_1.RPTUtil.getAncestorWithRole(ruleContext, "combobox") &&
+ !(legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "textbox") ||
+ legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, "searchbox")))) {
+ // we need to diagnose that a combobox input textbox has a label(github issue #1104)
+ return null;
+ }
+ var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext);
+ var tagName = ruleContext.nodeName.toLowerCase();
+ // Handled by input_label_exists
+ var skipRoles = [
+ "button",
+ "checkbox",
+ "combobox",
+ "listbox",
+ "menuitemcheckbox",
+ "menuitemradio",
+ "radio",
+ "searchbox",
+ "slider",
+ "spinbutton",
+ "switch",
+ "textbox",
+ "progressbar",
+ "link",
+ ];
+ if (skipRoles.includes(elemRole))
+ return null;
+ if (tagName === "output" ||
+ (tagName === "input" &&
+ ruleContext.getAttribute("type") === "file")) {
+ }
+ if (!ruleContext.hasAttribute("role")) {
+ // Form/input elements are checked by G41, we skip them from this rule. Github issue 449
+ var skipElements = [
+ "input",
+ "textarea",
+ "select",
+ "button",
+ "datalist",
+ "optgroup",
+ "option",
+ "keygen",
+ "output",
+ "progress",
+ "meter",
+ ];
+ if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) !=
+ -1) {
+ return null;
+ }
+ }
+ // avoid diagnosing the popup list of a combobox.
+ var rolesToCheck = ["listbox", "tree", "grid", "dialog"];
+ for (var j = 0; j < rolesToCheck.length; j++) {
+ if (legacy_1.RPTUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) {
+ var comboboxes = legacy_1.RPTUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true);
+ for (var k = 0; k < comboboxes.length; k++) {
+ var combobox = comboboxes[k];
+ var aria_owns = legacy_1.RPTUtil.getElementAttribute(combobox, "aria-owns");
+ if (aria_owns) {
+ var owns = legacy_1.RPTUtil.normalizeSpacing(aria_owns.trim()).split(" ");
+ for (var i = 0; i < owns.length; i++) {
+ var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]);
+ if (owned === ruleContext) {
+ return null;
+ }
+ }
+ }
+ }
+ }
+ }
+ var passed = true;
+ var prohibited = false;
+ var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns;
+ //get attribute roles as well as implicit roles.
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, true);
+ var numWidgetsTested = 0;
+ var interactiveRoleTypes = ["widget", "liveRegion", "window"];
+ for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) {
+ var pattern = designPatterns[roles[i]];
+ if (pattern &&
+ pattern.nameRequired &&
+ pattern.roleType &&
+ interactiveRoleTypes.includes(pattern.roleType)) {
+ ++numWidgetsTested;
+ // All widgets may have an author supplied accessible name.
+ // Title is legal, but don't advertise its use in documentation.
+ // Encourage use of aria-label, aria-labelledby or html label element.
+ passed =
+ legacy_1.RPTUtil.hasAriaLabel(ruleContext) ||
+ legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title") ||
+ legacy_1.RPTUtil.getLabelForElementHidden(ruleContext, true);
+ if (!passed &&
+ pattern.nameFrom &&
+ pattern.nameFrom.indexOf("contents") >= 0) {
+ // See if widget's accessible name is supplied by element's inner text
+ // nameFrom: ["author", "contents"]
+ passed = legacy_1.RPTUtil.hasInnerContentOrAlt(ruleContext);
+ }
+ if (!passed) {
+ // check if it has implicit label, like abc
+ passed = legacy_1.RPTUtil.hasImplicitLabel(ruleContext);
+ }
+ if (!passed &&
+ ruleContext.tagName.toLowerCase() === "img" &&
+ !ruleContext.hasAttribute("role") &&
+ ruleContext.hasAttribute("alt")) {
+ passed =
+ DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0;
+ }
+ if (pattern.nameFrom.indexOf("prohibited") >= 0) {
+ prohibited = true;
+ }
+ }
+ }
+ if (numWidgetsTested === 0) {
+ return null;
+ }
+ else if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", [elemRole]);
+ }
+ else {
+ //TODO
+ // if (prohibited) {
+ // return RuleFail("Fail_2");
+ // } else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ // }
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8752:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.asciiart_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.asciiart_alt_exists = {
+ id: "asciiart_alt_exists",
+ context: "dom:pre, dom:listing, dom:xmp, dom:plaintext",
+ refactor: {
+ "RPT_Pre_ASCIIArt": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "asciiart_alt_exists.html",
+ "Potential_1": "asciiart_alt_exists.html",
+ "group": "asciiart_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that ASCII art has a text alternative",
+ "group": "ASCII art must have a text alternative"
+ }
+ },
+ /**
+ * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": eRulePolicy.VIOLATION,
+ "toolkitLevel": eToolkitLevel.LEVEL_ONE
+ }],
+ */
+ rulesets: [],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for
+ // in various places because of the weird way various browsers render
HtmlUnit:
+ // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases.
+ if (ruleContext.nodeName.toLowerCase() == "pre") {
+ if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") ||
+ ruleContext.getElementsByTagName("code").length > 0 ||
+ legacy_1.RPTUtil.getAncestor(ruleContext, "code")) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+ var passed = true;
+ var txtValue = legacy_1.RPTUtil.getInnerText(ruleContext);
+ var nonAlphaNumericNorSpaceCount = 0;
+ var alphNumSameCharacterCount = 0;
+ var lastCharacter = "";
+ // Iterate through the text content
+ for (var idx = 0; passed && (idx < txtValue.length); ++idx) {
+ var chStr = txtValue.substr(idx, 1);
+ // Check if it is alphanumeric or punctuation
+ if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) {
+ // Detect same character sequence
+ if (lastCharacter == chStr) {
+ alphNumSameCharacterCount = alphNumSameCharacterCount + 1;
+ ;
+ }
+ else {
+ alphNumSameCharacterCount = 0;
+ }
+ }
+ else if (/\s/.test(chStr)) {
+ alphNumSameCharacterCount = 0;
+ }
+ else {
+ nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1;
+ alphNumSameCharacterCount = 0;
+ }
+ lastCharacter = chStr;
+ // Make the decision
+ if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) {
+ passed = false;
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 4392:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blink_css_review = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.blink_css_review = {
+ id: "blink_css_review",
+ context: "dom:style, dom:*[style]",
+ refactor: {
+ "RPT_Blink_CSSTrigger1": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "blink_css_review.html",
+ "Pass_0": "blink_css_review.html",
+ "Potential_1": "blink_css_review.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.2.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var textValue = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute('style')) {
+ textValue = ruleContext.getAttribute('style');
+ }
+ var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1;
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 932:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blink_elem_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.blink_elem_deprecated = {
+ id: "blink_elem_deprecated",
+ context: "dom:blink",
+ refactor: {
+ "WCAG20_Blink_AlwaysTrigger": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "blink_elem_deprecated.html",
+ "Pass_0": "blink_elem_deprecated.html",
+ "Fail_1": "blink_elem_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Content that blinks persistently must not be used",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Content found that blinks persistently"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_0", "WCAG_2_1"],
+ num: "2.2.2",
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ // const ruleContext = context["dom"].node as Element;
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6255:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.blockquote_cite_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.blockquote_cite_exists = {
+ id: "blockquote_cite_exists",
+ context: "dom:blockquote",
+ refactor: {
+ "RPT_Blockquote_HasCite": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "blockquote_cite_exists.html",
+ "Potential_1": "blockquote_cite_exists.html",
+ "group": "blockquote_cite_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that should not be used only for quotations, not indentation",
+ "group": "Use only for quotations, not indentation"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "cite");
+ if (!passed) {
+ var citeElems = legacy_1.RPTUtil.getDocElementsByTag(ruleContext, "cite");
+ passed = citeElems != null && citeElems.length > 0;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5743:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.canvas_content_described = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+exports.canvas_content_described = {
+ id: "canvas_content_described",
+ context: "dom:canvas",
+ refactor: {
+ "HAAC_Canvas": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "canvas_content_described.html",
+ "Manual_1": "canvas_content_described.html",
+ "group": "canvas_content_described.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Verify accessibility of the element",
+ "group": "The element may not be accessible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1", "4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = ruleContext.innerHTML.trim().length > 0;
+ if (passed)
+ return (0, IRule_1.RulePass)(1);
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2671:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.caption_track_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.caption_track_exists = {
+ id: "caption_track_exists",
+ context: "dom:video",
+ refactor: {
+ "HAAC_Video_HasNoTrack": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "caption_track_exists.html",
+ "Potential_1": "caption_track_exists.html",
+ "group": "caption_track_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the element",
+ "group": "A element must have a text alternative for any meaningful audio content"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.2.1", "1.2.2", "1.2.4"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ // ignore decorative video if user uses aria-hidden
+ if (ruleContext.getAttribute("aria-hidden") === "true") {
+ return null;
+ }
+ var tracks = ruleContext.getElementsByTagName("track");
+ for (var i = 0; i < tracks.length; ++i) {
+ passed = passed || tracks[i].getAttribute("kind") === 'captions';
+ }
+ // checks for addition of dynamic tracks
+ if (ruleContext.textTracks && ruleContext.textTracks.length > 0) {
+ for (var i = 0; i < ruleContext.textTracks.length; i++) {
+ passed = passed || ruleContext.textTracks[i].kind === 'captions';
+ }
+ }
+ if (passed) {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ else {
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 3974:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_active_descendant = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_active_descendant = {
+ id: "combobox_active_descendant",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ help: {
+ "en-US": {
+ "Pass": "combobox_active_descendant.html",
+ "Fail_missing": "combobox_active_descendant.html",
+ "Fail_not_in_popup": "combobox_active_descendant.html",
+ "Fail_active_role_invalid": "combobox_active_descendant.html",
+ "Fail_active_not_selected": "combobox_active_descendant.html",
+ "group": "combobox_active_descendant.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "'aria-activedescendant' is used appropriately for this combobox",
+ "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist",
+ "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",
+ "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",
+ "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",
+ "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ // This rule only applies if the activedescendant is specified
+ var activeId = ruleContext.getAttribute("aria-activedescendant");
+ if (!activeId || activeId.trim().length === 0) {
+ return null;
+ }
+ var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId);
+ if (!activeElem) {
+ return (0, IRule_1.RuleFail)("Fail_missing", [activeId]);
+ }
+ var found = false;
+ // examine the children
+ if (popupElement) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ found = nw.elem().getAttribute("id") === activeId;
+ }
+ }
+ }
+ var retVal = [];
+ if (!found) {
+ retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId]));
+ }
+ var activeRoles = legacy_1.RPTUtil.getRoles(activeElem, true);
+ var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); });
+ if (validRoles.length === 0) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")]));
+ }
+ if (activeElem.getAttribute("aria-selected") !== "true") {
+ retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId]));
+ }
+ if (retVal.length === 0) {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ else {
+ return retVal;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9881:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_autocomplete_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_autocomplete_valid = {
+ id: "combobox_autocomplete_valid",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ refactor: {
+ "combobox_autocomplete": {
+ "Pass": "Pass",
+ "Fail_1": "Fail_1",
+ "Fail_inline": "Fail_inline"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass": "combobox_autocomplete_valid.html",
+ "Fail_1": "combobox_autocomplete_valid.html",
+ "Fail_inline": "combobox_autocomplete_valid.html",
+ "group": "combobox_autocomplete_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",
+ "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",
+ "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",
+ "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement;
+ var retVal = [];
+ if (ruleContext.getAttribute("aria-autocomplete") === "inline") {
+ retVal.push((0, IRule_1.RuleFail)("Fail_inline"));
+ }
+ var passed = true;
+ // examine the children
+ if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ // if popupElement itself has "aria-autocomplete"
+ passed = !popupElement.hasAttribute("aria-autocomplete");
+ // if any child of popupElement has "aria-autocomplete"
+ if (passed && popupElement.children && popupElement.children.length > 0) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (passed && nw.nextNode()) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ passed = !nw.elem().hasAttribute("aria-autocomplete");
+ if (nw.bEndTag && nw.node === popupElement.lastElementChild)
+ break;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId]));
+ }
+ if (retVal.length > 0) {
+ return retVal;
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 1226:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_design_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+function patternDetect(elem) {
+ // check 'explicit' role combobox and that it is not .
+ if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") {
+ return "implicit";
+ }
+ else if (elem.nodeName.toLowerCase() === "input"
+ && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text")
+ && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) {
+ // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow
+ return "1.0";
+ }
+ else if (elem.nodeName.toLowerCase() !== "input"
+ && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) {
+ // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid
+ return "1.1";
+ }
+ // Assume they're trying to do the latest, 1.2 pattern
+ return "1.2";
+}
+exports.combobox_design_valid = {
+ id: "combobox_design_valid",
+ context: "aria:combobox",
+ refactor: {
+ "combobox_version": {
+ "Pass_1.0": "Pass_1.0",
+ "Fail_1.1": "Fail_1.1",
+ "Pass_1.2": "Pass_1.2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_1.0": "combobox_design_valid.html",
+ "Fail_1.1": "combobox_design_valid.html",
+ "Pass_1.2": "combobox_design_valid.html",
+ "group": "combobox_design_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2",
+ "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2",
+ "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2",
+ "group": "The combobox design pattern must be valid for ARIA 1.2"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext)) {
+ return null;
+ }
+ var pattern = patternDetect(ruleContext);
+ // We don't assess native select elements here
+ if (pattern === "implicit") {
+ return null;
+ }
+ var tagName = ruleContext.tagName.toLowerCase();
+ var expanded = (legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true";
+ var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text");
+ var key = context["dom"].rolePath;
+ if (key) {
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ cache[key] = {
+ "inputElement": editable ? ruleContext : null,
+ "pattern": pattern,
+ "expanded": expanded
+ };
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "combobox", cache);
+ }
+ else {
+ // No xpath?
+ return null;
+ }
+ if (pattern === "1.0") {
+ return (0, IRule_1.RulePass)("Pass_1.0");
+ }
+ else if (pattern === "1.1") {
+ return (0, IRule_1.RuleFail)("Fail_1.1");
+ }
+ else if (pattern === "1.2") {
+ return (0, IRule_1.RulePass)("Pass_1.2");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7369:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_focusable_elements = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_focusable_elements = {
+ id: "combobox_focusable_elements",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ help: {
+ "en-US": {
+ "Pass": "combobox_focusable_elements.html",
+ "Fail_not_tabbable": "combobox_focusable_elements.html",
+ "Fail_tabbable_child": "combobox_focusable_elements.html",
+ "group": "combobox_focusable_elements.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "DOM focus is allowed only on the combobox element as required",
+ "Fail_not_tabbable": "The combobox element does not allow DOM focus as required",
+ "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",
+ "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cachedElem = cache[context["dom"].rolePath];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ var popupRole = legacy_1.RPTUtil.getRoles(popupElement, true)[0];
+ var retVal = [];
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable"));
+ }
+ // Only makes sense to check the popup when expanded
+ // this does not apply to dialogs, return pass since the main element was focusable above
+ if (expanded === false || popupRole === "dialog") {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ var passed = true;
+ // examine the children
+ if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ // if popupElement itself has "aria-activedescendant"
+ passed = !legacy_1.RPTUtil.isTabbable(popupElement) && !legacy_1.RPTUtil.getAriaAttribute(popupElement, "aria-activedescendant");
+ ;
+ // if any child of popupElement has "aria-autocomplete"
+ if (passed && popupElement.children && popupElement.children.length > 0) {
+ var nw = new legacy_1.NodeWalker(popupElement);
+ while (passed && nw.nextNode()) {
+ if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) {
+ passed = !legacy_1.RPTUtil.isTabbable(nw.node) &&
+ !legacy_1.RPTUtil.getAriaAttribute(nw.node, "aria-activedescendant");
+ if (nw.bEndTag && nw.node === popupElement.lastElementChild)
+ break;
+ }
+ }
+ }
+ }
+ if (!passed) {
+ retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child"));
+ }
+ if (retVal.length === 0) {
+ return (0, IRule_1.RulePass)("Pass");
+ }
+ else {
+ return retVal;
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 2633:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_haspopup_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.combobox_haspopup_valid = {
+ id: "combobox_haspopup_valid",
+ context: "aria:combobox",
+ dependencies: ["combobox_popup_reference"],
+ refactor: {
+ "combobox_haspopup": {
+ "Pass": "Pass",
+ "Fail_popup_role_invalid": "Fail_popup_role_invalid",
+ "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass": "combobox_haspopup_valid.html",
+ "Fail_popup_role_invalid": "combobox_haspopup_valid.html",
+ "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html",
+ "group": "combobox_haspopup_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",
+ "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"",
+ "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",
+ "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cacheKey = context["dom"].rolePath;
+ var cachedElem = cache[cacheKey];
+ if (!cachedElem)
+ return null;
+ var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId;
+ // If this isn't defined, the combobox is probably collapsed. A reference error is
+ // detected in combobox_popup_reference
+ if (!popupElement)
+ return null;
+ // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox
+ var popupRoles = legacy_1.RPTUtil.getRoles(popupElement, true);
+ var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); });
+ if (validRoles.length === 0) {
+ return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]);
+ }
+ else {
+ var popupRole = validRoles[0];
+ var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox";
+ // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined
+ if (haspopupVal !== popupRole) {
+ if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]);
+ }
+ }
+ }
+ return (0, IRule_1.RulePass)("Pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 2429:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.combobox_popup_reference = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var VisUtil_1 = __webpack_require__(8174);
+exports.combobox_popup_reference = {
+ id: "combobox_popup_reference",
+ context: "aria:combobox",
+ dependencies: ["combobox_design_valid"],
+ help: {
+ "en-US": {
+ "group": "combobox_popup_reference.html",
+ "Pass_1.0_expanded": "combobox_popup_reference.html",
+ "Pass_1.0_collapsed": "combobox_popup_reference.html",
+ "Pass_1.2_expanded": "combobox_popup_reference.html",
+ "Pass_1.2_collapsed": "combobox_popup_reference.html",
+ "Fail_1.0_missing_owns": "combobox_popup_reference.html",
+ "Fail_1.2_missing_controls": "combobox_popup_reference.html",
+ "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html",
+ "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html",
+ "Fail_combobox_expanded_hidden": "combobox_popup_reference.html",
+ "Fail_combobox_collapsed_visible": "combobox_popup_reference.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value",
+ "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible",
+ "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required",
+ "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible",
+ "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required",
+ "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing",
+ "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing",
+ "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",
+ "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",
+ "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",
+ "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "4e8ab6": {
+ "Pass_1.0_expanded": "fail",
+ "Pass_1.0_collapsed": "fail",
+ "Pass_1.2_expanded": "pass",
+ "Pass_1.2_collapsed": "pass",
+ "Fail_1.0_missing_owns": "inapplicable",
+ "Fail_1.2_missing_controls": "fail",
+ "Fail_1.0_popup_reference_missing": "inapplicable",
+ "Fail_1.2_popup_reference_missing": "fail",
+ "Fail_combobox_expanded_hidden": "inapplicable",
+ "Fail_combobox_collapsed_visible": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var cache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "combobox", {});
+ var cacheKey = context["dom"].rolePath;
+ var cachedElem = cache[cacheKey];
+ if (!cachedElem)
+ return null;
+ var pattern = cachedElem.pattern, expanded = cachedElem.expanded;
+ var popupId;
+ var popupElement;
+ if (pattern === "1.0") {
+ if (!ruleContext.hasAttribute("aria-owns")) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns");
+ }
+ popupId = ruleContext.getAttribute("aria-owns");
+ popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId);
+ if (!popupElement) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]);
+ }
+ }
+ else if (pattern === "1.2") {
+ if (!ruleContext.hasAttribute("aria-controls")) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls");
+ }
+ popupId = ruleContext.getAttribute("aria-controls");
+ popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId);
+ if (!popupElement) {
+ // If the combobox isn't expanded, this attribute isn't required
+ return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]);
+ }
+ }
+ else {
+ return null;
+ }
+ // We have an element, stick it in the cache and then check its role
+ cachedElem.popupId = popupId;
+ cachedElem.popupElement = popupElement;
+ if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden");
+ }
+ else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) {
+ return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible");
+ }
+ if (pattern === "1.0") {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.0_expanded" : "Pass_1.0_collapsed");
+ }
+ else {
+ return (0, IRule_1.RulePass)(expanded ? "Pass_1.2_expanded" : "Pass_1.2_collapsed");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 7874:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.debug_paths = void 0;
+var IRule_1 = __webpack_require__(4377);
+exports.debug_paths = {
+ id: "debug_paths",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ rulesets: [{
+ id: ["DEBUG"],
+ num: "1",
+ level: IRule_1.eRulePolicy.INFORMATION,
+ toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ ruleContext.setAttribute("domPath", context["dom"].rolePath);
+ ruleContext.setAttribute("ariaPath", context["aria"].rolePath);
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 3334:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.detector_tabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.detector_tabbable = {
+ id: "detector_tabbable",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "",
+ "Pass_0": ""
+ }
+ },
+ rulesets: [{
+ id: ["EXTENSIONS"],
+ num: "1",
+ level: IRule_2.eRulePolicy.INFORMATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext)) {
+ return null;
+ }
+ var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1];
+ return (0, IRule_1.RulePass)("Pass_0", [], [{
+ name: hierContext.attributes.name,
+ role: hierContext.role,
+ tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0")
+ }]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4298:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.dir_attribute_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.dir_attribute_valid = {
+ id: "dir_attribute_valid",
+ context: "dom:*[dir]",
+ refactor: {
+ "Valerie_Elem_DirValid": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "dir_attribute_valid.html",
+ "Fail_1": "dir_attribute_valid.html",
+ "group": "dir_attribute_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Invalid value used for the 'dir' attribute",
+ "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\""
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var dirStr = ruleContext.getAttribute("dir").toLowerCase();
+ var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto";
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4435:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.download_keyboard_controllable = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.download_keyboard_controllable = {
+ id: "download_keyboard_controllable",
+ context: "dom:a[href],dom:area[href]",
+ refactor: {
+ "HAAC_Media_DocumentTrigger2": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "download_keyboard_controllable.html",
+ "Manual_1": "download_keyboard_controllable.html",
+ "group": "download_keyboard_controllable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap",
+ "group": "File download mechanisms should be keyboard-operable and preserve page focus location"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var href = ruleContext.getAttribute("href");
+ var ext = legacy_1.RPTUtil.getFileExt(href);
+ var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext);
+ if (passed)
+ return null;
+ if (!passed)
+ return (0, IRule_1.RuleManual)("Manual_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6313:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_accesskey_labelled = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var DOMWalker_1 = __webpack_require__(7440);
+exports.element_accesskey_labelled = {
+ id: "element_accesskey_labelled",
+ context: "dom:*[accesskey]",
+ refactor: {
+ "HAAC_Accesskey_NeedLabel": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_accesskey_labelled.html",
+ "Potential_1": "element_accesskey_labelled.html",
+ "group": "element_accesskey_labelled.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "The HTML element with an assigned 'accesskey' attribute does not have an associated label",
+ "group": "An HTML element with an assigned 'accesskey' attribute must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.3.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = false;
+ if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-label")) {
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.getLabelForElementHidden(ruleContext, true)) { // ignore hidden
+ passed = true;
+ }
+ else if (legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) {
+ // assume the validity of the id (of aria-labelledby) is checked by a different rule
+ passed = true;
+ }
+ else if (ruleContext.nodeName.toLowerCase() === "input"
+ && DOMWalker_1.DOMWalker.parentNode(ruleContext).nodeName.toLowerCase() === "label") {
+ // assume the validity of the label, e.g. empty label, is checked by a different rule
+ passed = true;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9109:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_accesskey_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.element_accesskey_unique = {
+ id: "element_accesskey_unique",
+ context: "dom:*[accesskey]",
+ refactor: {
+ "WCAG20_Elem_UniqueAccessKey": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_accesskey_unique.html",
+ "Fail_1": "element_accesskey_unique.html",
+ "group": "element_accesskey_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "'accesskey' attribute value on the element is not unique",
+ "group": "'accesskey' attribute values on each element must be unique for the page"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["HTML"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var map = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "element_accesskey_unique", {});
+ var key = ruleContext.getAttribute("accesskey");
+ var passed = !(key in map);
+ map[key] = true;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 9918:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_attribute_deprecated = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var DEPRECATED_ELEMENTS = [
+ /** original */
+ "applet", "basefont", "center", "dir", "font", "isindex", "listing",
+ "plaintext", "spacer", "s", "strike", "u", "xmp",
+ /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */
+ "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt",
+];
+var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [
+ /** original */
+ "align", "link", "archive", "background", "bgcolor", "clear", "code", "color",
+ "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object",
+ "prompt", "start", "text", "version", "vlink", "vspace"
+];
+var DEPRECATED_ELEMENT_ATTRIBUTES = {
+ /** original */
+ "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"],
+ "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"],
+ "li": ["type", "value", "type"],
+ "ul": ["type", "compact"],
+ "pre": ["width"],
+ /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */
+ "meta": ["http-equiv"],
+ "a": ["charset", "coords", "shape", "rev", "scheme"],
+ "link": ["rev", "charset", "target"],
+ "img": ["name", "longdesc", "align", "hspace", "vspace", "border"],
+ "area": ["nohref"],
+ "head": ["profile"],
+ "html": ["version"],
+ "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"],
+ "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"],
+ "param": ["type", "valuetype"],
+ "script": ["language"],
+ "body": ["alink", "background", "bgcolor", "link", "text", "vlink"],
+ "br": ["clear"],
+ "caption": ["align"],
+ "col": ["align", "char", "charoff", "valign", "width"],
+ "div": ["align"],
+ "dl": ["compact"],
+ "hr": ["align", "noshade", "size", "width", "align"],
+ "h2": ["align"],
+ "h3": ["align"],
+ "h4": ["align"],
+ "h5": ["align"],
+ "h6": ["align"],
+ "input": ["align", "usemap"],
+ "legend": ["align"],
+ "menu": ["compact"],
+ "ol": ["compact", "type", "type"],
+ "p": ["align"],
+ "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"],
+ "tbody": ["align", "char", "valign", "charoff"],
+ "tfoot": ["align", "charoff", "char", "valign"],
+ "thead": ["char", "charoff", "valign", "align"],
+ "tr": ["align", "bgcolor", "char", "charoff", "valign"]
+};
+function arrayToContextStr(obj, type) {
+ var str = "";
+ for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
+ var prop = obj_1[_i];
+ if (str !== '' && !str.endsWith(', '))
+ str += ", ";
+ if (type === 'HTML_ELEMENTS')
+ str += 'dom:' + prop;
+ else if (type === 'HTML_ATTRIBUTES')
+ str += 'dom:*[' + prop + "]";
+ }
+ return str;
+}
+function objToContextStr(obj, type) {
+ var str = "";
+ for (var prop in obj) {
+ if (str !== '' && !str.endsWith(', '))
+ str += ", ";
+ if (type === 'HTML_ELEMENT_ATTRIBUTES') {
+ for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) {
+ var item = _a[_i];
+ if (str !== '' && !str.endsWith(", "))
+ str += ", ";
+ str += 'dom:' + prop + '[' + item + ']';
+ }
+ }
+ }
+ return str;
+}
+exports.element_attribute_deprecated = {
+ id: "element_attribute_deprecated",
+ context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",
+ help: {
+ "en-US": {
+ "pass": "element_attribute_deprecated.html",
+ "fail_elem": "element_attribute_deprecated.html",
+ "fail_attr": "element_attribute_deprecated.html",
+ "fail_elem_attr": "element_attribute_deprecated.html",
+ "group": "element_attribute_deprecated.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "Rule Passed",
+ "fail_elem": "The <{0}> element is deprecated in HTML 5",
+ "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5",
+ "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5",
+ "group": "Avoid use of obsolete features if possible"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["HTML"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing!
+ if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ if (ruleContext.nodeName.includes("-")) {
+ // This is a webcomponent element, HTML doesn't define what's deprecated
+ return null;
+ }
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var ret = [];
+ // check if it's a deprecated element
+ if (DEPRECATED_ELEMENTS.includes(nodeName)) {
+ return (0, IRule_1.RuleFail)("fail_elem", [nodeName]);
+ }
+ // check if it's a deprecated HTML global attribute
+ var attrs = ruleContext.getAttributeNames();
+ var violations = '';
+ for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) {
+ var attr = attrs_1[_i];
+ if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) {
+ if (violations !== '')
+ violations += ', ';
+ violations += attr;
+ }
+ }
+ if (violations !== '') {
+ return (0, IRule_1.RuleFail)("fail_attr", [violations]);
+ }
+ // check if it's a deprecated HTML element & attribute
+ violations = '';
+ if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) {
+ for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) {
+ var attr = attrs_2[_a];
+ if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) {
+ if (violations !== '')
+ violations += ', ';
+ violations += attr;
+ }
+ }
+ if (violations !== '') {
+ return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]);
+ }
+ }
+ return (0, IRule_1.RulePass)("pass");
+ }
+};
+
+
+/***/ }),
+
+/***/ 8105:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_id_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+exports.element_id_unique = {
+ id: "element_id_unique",
+ context: "dom:*[id]",
+ refactor: {
+ "RPT_Elem_UniqueId": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "group": "element_id_unique.html",
+ "Pass_0": "element_id_unique.html",
+ "Fail_1": "element_id_unique.html",
+ "Fail_2": "element_id_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Element 'id' attribute values must be unique within a document",
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The <{0}> element has the id \"{1}\" that is empty",
+ "Fail_2": "The <{0}> element has the id \"{1}\" that is already in use"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["HTML"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [{
+ "3ea0c8": {
+ "Pass_0": "pass",
+ "Fail_1": "pass",
+ "Fail_2": "fail"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // JCH - NO OUT OF SCOPE hidden in context
+ var id = ruleContext.getAttribute("id");
+ // In the case that id is empty we should trigger a violation right away with out checking
+ // for uniqueness.
+ if (id === "") {
+ //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]);
+ return (0, IRule_1.RuleFail)("Fail_1", [ruleContext.nodeName.toLowerCase(), id]);
+ }
+ var element = fragment_1.FragmentUtil.getById(ruleContext, id);
+ var passed = element === ruleContext;
+ //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.nodeName.toLowerCase(), id]);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 8687:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_lang_valid = exports.html_lang_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var lang_1 = __webpack_require__(2527);
+var VisUtil_1 = __webpack_require__(8174);
+var DOMWalker_1 = __webpack_require__(7440);
+var ARIAMapper_1 = __webpack_require__(4944);
+var validateLang = function (context) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (ruleContext.hasAttribute("lang")) {
+ if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") {
+ // It's okay to have a lang="" if not on html
+ }
+ else {
+ var langStr = ruleContext.getAttribute("lang");
+ if (!lang_1.LangUtil.validPrimaryLang(langStr)) {
+ return 1;
+ }
+ if (!lang_1.LangUtil.isBcp47(langStr)) {
+ return 2;
+ }
+ }
+ }
+ if (ruleContext.hasAttribute("xml:lang")) {
+ if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") {
+ // It's okay to have a lang="" if not on html
+ }
+ else {
+ var langStr = ruleContext.getAttribute("xml:lang");
+ if (!lang_1.LangUtil.validPrimaryLang(langStr)) {
+ return 3;
+ }
+ if (!lang_1.LangUtil.isBcp47(langStr)) {
+ return 4;
+ }
+ }
+ }
+ return 0;
+};
+exports.html_lang_valid = {
+ id: "html_lang_valid",
+ context: "dom:html[lang], dom:html[xml:lang]",
+ help: {
+ "en-US": {
+ "Pass_0": "html_lang_valid.html",
+ "Fail_1": "html_lang_valid.html",
+ "Fail_2": "html_lang_valid.html",
+ "Fail_3": "html_lang_valid.html",
+ "Fail_4": "html_lang_valid.html",
+ "group": "html_lang_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Lang has a valid primary lang and conforms to BCP 47",
+ "Fail_1": "Specified 'lang' attribute does not include a valid primary language",
+ "Fail_2": "Specified 'lang' attribute does not conform to BCP 47",
+ "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language",
+ "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47",
+ "group": "The default human language of the page must be valid and specified in accordance with BCP 47"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [{
+ "b5c3f8": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "inapplicable",
+ "Fail_3": "inapplicable",
+ "Fail_4": "inapplicable"
+ },
+ "bf051a": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "pass",
+ "Fail_3": "fail",
+ "Fail_4": "inapplicable"
+ },
+ // TODO: ACT: Mismatch because they don't check the html element in the same rule
+ // "de46e4": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "pass",
+ // "Fail_3": "inapplicable",
+ // "Fail_4": "inapplicable"
+ // }
+ }],
+ run: function (context, options, contextHierarchies) {
+ var reasonCode = validateLang(context);
+ // This is done here instead of in validateLang so that the genHelp code will pick it up
+ var retArr = [
+ (0, IRule_1.RulePass)("Pass_0"),
+ (0, IRule_1.RuleFail)("Fail_1"),
+ (0, IRule_1.RuleFail)("Fail_2"),
+ (0, IRule_1.RuleFail)("Fail_3"),
+ (0, IRule_1.RuleFail)("Fail_4")
+ ];
+ return retArr[reasonCode];
+ }
+};
+exports.element_lang_valid = {
+ id: "element_lang_valid",
+ context: "dom:*[lang], dom:*[xml:lang]",
+ help: {
+ "en-US": {
+ "Pass_0": "element_lang_valid.html",
+ "Fail_1": "element_lang_valid.html",
+ "Fail_2": "element_lang_valid.html",
+ "Fail_3": "element_lang_valid.html",
+ "Fail_4": "element_lang_valid.html",
+ "group": "element_lang_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Lang has a valid primary lang and conforms to BCP 47",
+ "Fail_1": "Specified 'lang' attribute does not include a valid primary language",
+ "Fail_2": "Specified 'lang' attribute does not conform to BCP 47",
+ "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language",
+ "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47",
+ "group": "The change in language of specific content must be valid and specified in accordance with BCP 47"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [{
+ // "b5c3f8": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "inapplicable",
+ // "Fail_3": "inapplicable",
+ // "Fail_4": "inapplicable"
+ // },
+ // "bf051a": {
+ // "Pass_0": "pass",
+ // "Fail_1": "fail",
+ // "Fail_2": "pass",
+ // "Fail_3": "fail",
+ // "Fail_4": "inapplicable"
+ // },
+ // TODO: ACT: Mismatch because they don't check the html element in the same rule
+ "de46e4": {
+ "Pass_0": "pass",
+ "Fail_1": "fail",
+ "Fail_2": "pass",
+ "Fail_3": "inapplicable",
+ "Fail_4": "inapplicable"
+ }
+ }],
+ run: function (context, options, contextHierarchies) {
+ // If it's the HTML node, that's handled by html_lang_valid
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ if (nodeName === "html")
+ return null;
+ var reasonCode = validateLang(context);
+ // This is done here instead of in validateLang so that the genHelp code will pick it up
+ var retArr = [
+ (0, IRule_1.RulePass)("Pass_0"),
+ (0, IRule_1.RuleFail)("Fail_1"),
+ (0, IRule_1.RuleFail)("Fail_2"),
+ (0, IRule_1.RuleFail)("Fail_3"),
+ (0, IRule_1.RuleFail)("Fail_4")
+ ];
+ var retVal = retArr[reasonCode];
+ if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) {
+ // Ensure that there's actually content of this element - skip subtrees that have other lang attributes
+ var hasContent = false;
+ if (ruleContext.firstChild !== null) {
+ var nw = new DOMWalker_1.DOMWalker(ruleContext);
+ while (!hasContent && nw.nextNode()) {
+ // Skip hidden
+ if (nw.node.nodeType === 1) {
+ var element = nw.node;
+ if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) {
+ nw.bEndTag = true;
+ }
+ else {
+ hasContent = hasContent
+ || element.nodeName.toLowerCase() === "img" && ARIAMapper_1.ARIAMapper.computeName(element).trim().length > 0;
+ }
+ }
+ else {
+ hasContent = hasContent
+ || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0;
+ }
+ }
+ }
+ if (!hasContent)
+ return null;
+ }
+ return retVal;
+ }
+};
+
+
+/***/ }),
+
+/***/ 2150:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_mouseevent_keyboard = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.element_mouseevent_keyboard = {
+ id: "element_mouseevent_keyboard",
+ context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",
+ refactor: {
+ "RPT_Elem_EventMouseAndKey": {
+ "Pass_0": "Pass_0",
+ "Manual_1": "Manual_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "element_mouseevent_keyboard.html",
+ "Manual_1": "element_mouseevent_keyboard.html",
+ "group": "element_mouseevent_keyboard.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",
+ "group": "All interactive content with mouse event handlers must have equivalent keyboard access"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["2.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var passed = ruleContext.hasAttribute("href") ||
+ (!ruleContext.hasAttribute("ondblclick") &&
+ !ruleContext.hasAttribute("onmousemove") &&
+ (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) &&
+ (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) &&
+ (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) &&
+ (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) &&
+ (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") ||
+ nodeName == "a" || nodeName == "button"));
+ var failedMouseEvents = new Array();
+ if (!passed) {
+ //store and display event name and node name in the tokens
+ if (ruleContext.hasAttribute("ondblclick")) {
+ failedMouseEvents.push("ondblclick");
+ }
+ if (ruleContext.hasAttribute("onmousemove")) {
+ failedMouseEvents.push("onmousemove");
+ }
+ if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) {
+ failedMouseEvents.push("onmousedown");
+ }
+ if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) {
+ failedMouseEvents.push("onmouseup");
+ }
+ if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) {
+ failedMouseEvents.push("onmouseover");
+ }
+ if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) {
+ failedMouseEvents.push("onmouseout");
+ }
+ if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) {
+ if (!(nodeName == "a" || nodeName == "button"))
+ failedMouseEvents.push("onclick");
+ }
+ }
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4557:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_orientation_unlocked = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var CSSUtil_1 = __webpack_require__(1775);
+var VisUtil_1 = __webpack_require__(8174);
+var CacheUtil_1 = __webpack_require__(7788);
+var fragment_1 = __webpack_require__(482);
+var legacy_1 = __webpack_require__(8422);
+exports.element_orientation_unlocked = {
+ id: "element_orientation_unlocked",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "element_orientation_unlocked.html",
+ "fail_locked": "element_orientation_unlocked.html",
+ "group": "element_orientation_unlocked.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property",
+ "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",
+ "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.4"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: ['b33eff'],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip invisible element
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext))
+ return null;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["script", "meta", "title"]))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // cache the orientation result for all the elements in the page
+ var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var orientationTransforms = (0, CacheUtil_1.getCache)(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null);
+ if (!orientationTransforms) {
+ orientationTransforms = (0, CSSUtil_1.getMediaOrientationTransform)(doc);
+ (0, CacheUtil_1.setCache)(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms);
+ }
+ // find if the element matches orientation selector(s)
+ var media_transforms = [];
+ Object.keys(orientationTransforms).forEach(function (key) {
+ Object.keys(orientationTransforms[key]).forEach(function (tag) {
+ if (Object.keys(orientationTransforms[key][tag]).length > 0 && (0, CSSUtil_1.selectorMatchesElem)(ruleContext, tag))
+ media_transforms.push(orientationTransforms[key][tag].transform);
+ });
+ });
+ // no match, the element is not in media orientation transform
+ if (media_transforms.length === 0)
+ return null;
+ var ret = [];
+ var _loop_1 = function (i) {
+ var media_transform = media_transforms[i];
+ var containsRotation = false;
+ ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) {
+ if (media_transform.includes(rotation))
+ containsRotation = true;
+ });
+ // no rotation transform, skip
+ if (!containsRotation)
+ return "continue";
+ var degree = (0, CSSUtil_1.getRotationDegree)(media_transform);
+ // no or 360n degree rotation
+ if (degree === 0) {
+ ret.push((0, IRule_1.RulePass)("pass"));
+ return "continue";
+ }
+ /**
+ * calculate the original page rotation transformation, example
+ * html { transform: rotate(2.5deg); }
+ */
+ var definedStyle = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ /**
+ * compensate the media orientation with the page orientation
+ */
+ if (definedStyle['transform']) {
+ var page_degree = (0, CSSUtil_1.getRotationDegree)(definedStyle['transform']);
+ degree -= page_degree;
+ }
+ // allow 1 degree floating range for the right angle
+ if ((degree > 89 && degree < 91) || (degree > -91 && degree < -89))
+ ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName]));
+ else
+ ret.push((0, IRule_1.RulePass)("pass"));
+ };
+ for (var i = 0; i < media_transforms.length; i++) {
+ _loop_1(i);
+ }
+ if (ret.length > 0)
+ return ret;
+ return null;
+ }
+};
+
+
+/***/ }),
+
+/***/ 4721:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_scrollable_tabbable = void 0;
+var legacy_1 = __webpack_require__(8422);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+var CSSUtil_1 = __webpack_require__(1775);
+exports.element_scrollable_tabbable = {
+ id: "element_scrollable_tabbable",
+ context: "dom:*",
+ dependencies: [],
+ help: {
+ "en-US": {
+ "group": "element_scrollable_tabbable.html",
+ "pass_tabbable": "element_scrollable_tabbable.html",
+ "pass_interactive": "element_scrollable_tabbable.html",
+ "fail_scrollable": "element_scrollable_tabbable.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "Scrollable elements should be tabbable or contain tabbable content",
+ "pass_tabbable": "The scrollable element is tabbable",
+ "pass_interactive": "The scrollable element has tabbable content",
+ "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ num: ["2.1.1"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: ["ossw9k"],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ //skip elements
+ if (legacy_1.RPTUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta"]))
+ return null;
+ //skip if no visible content
+ if (!legacy_1.RPTUtil.hasInnerContent(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ var styles = (0, CSSUtil_1.getComputedStyle)(ruleContext);
+ // not scrollable, inapplicable
+ if ((styles.overflowX === 'visible' || styles.overflowX === 'hidden')
+ && (styles.overflowY === 'visible' || styles.overflowY === 'hidden'))
+ return null;
+ // ignore if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen
+ if (Math.max(ruleContext.offsetWidth, ruleContext.offsetHeight) < 30 || Math.min(ruleContext.offsetWidth, ruleContext.offsetHeight) < 15)
+ return null;
+ // ignore if both x and y scroll distances < element's horizontal/vertical padding
+ var padding_x = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingLeft, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingRight, ruleContext);
+ var padding_y = (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingTop, ruleContext) + (0, CSSUtil_1.getPixelsFromStyle)(styles.paddingBottom, ruleContext);
+ if (ruleContext.scrollWidth - ruleContext.clientWidth < 1 + padding_x
+ && ruleContext.scrollHeight - ruleContext.clientHeight < 1 + padding_y)
+ return null;
+ // pass iframe element has a tabindex attribute value that is not negative
+ if (ruleContext.hasAttribute("tabindex") && parseInt(ruleContext.getAttribute("tabindex")) >= 0)
+ return (0, IRule_1.RulePass)("pass_tabbable");
+ // check if element content is tabbable
+ var count = legacy_1.RPTUtil.getTabbableChildren(ruleContext);
+ if (count > 0)
+ return (0, IRule_1.RulePass)("pass_interactive");
+ // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator)
+ if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1)
+ return null;
+ return (0, IRule_1.RuleFail)("fail_scrollable", [nodeName]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 2814:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_tabbable_role_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var ARIADefinitions_1 = __webpack_require__(8235);
+var CSSUtil_1 = __webpack_require__(1775);
+var DOMWalker_1 = __webpack_require__(7440);
+var VisUtil_1 = __webpack_require__(8174);
+exports.element_tabbable_role_valid = {
+ id: "element_tabbable_role_valid",
+ context: "dom:*",
+ help: {
+ "en-US": {
+ "pass": "element_tabbable_role_valid.html",
+ "fail_invalid_role": "element_tabbable_role_valid.html",
+ "group": "element_tabbable_role_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "pass": "The tabbable element has a widget role",
+ "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role",
+ "group": "A tabbable element must have a valid widget role"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ },
+ {
+ "id": ["WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.2"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (legacy_1.RPTUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLowerCase();
+ // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it
+ if (nodeName in legacy_1.RPTUtil.tabTagMap) {
+ var value = legacy_1.RPTUtil.tabTagMap[nodeName];
+ if (typeof (value) === "function") {
+ value = value(ruleContext);
+ }
+ if (value)
+ return null;
+ }
+ // handle the case: no tabindex or tabindex < 0
+ if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0)
+ return null;
+ // ignore elements with CSS overflow: scroll or auto
+ var styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ if (styles['overflow-x'] === 'scroll' || styles['overflow-y'] === 'scroll'
+ || styles['overflow-x'] === 'auto' || styles['overflow-y'] === 'auto')
+ return null;
+ var roles = legacy_1.RPTUtil.getRoles(ruleContext, false);
+ // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application
+ if (roles && roles.includes("application"))
+ return null;
+ // elements whose roles allow no descendants that are interactive or with a tabindex >= 0
+ // this case should be handled in widget_tabbable_single and aria_child_tabbable
+ var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio",
+ "option", "radio", "switch", "tab"];
+ if (!roles || roles.length === 0) {
+ roles = legacy_1.RPTUtil.getImplicitRole(ruleContext);
+ }
+ var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext);
+ var parent_roles = legacy_1.RPTUtil.getRoles(parent, true);
+ // ignore if one of the parent roles is in roles_no_interactive_child
+ for (var i = 0; i < parent_roles.length; i++) {
+ if (roles_no_interactive_child.includes(parent_roles[i]))
+ return null;
+ }
+ // handle the case: tabindex >= 0 to examine whether a widget role is setup or not
+ // pass if one of the roles is a widget type
+ for (var i = 0; i < roles.length; i++) {
+ // Row is weird. It's structure, but can also be widget
+ if (roles[i] === "row" || ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]].roleType === 'widget') {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ // Focusable separators are widgets
+ if (roles[i] === "separator") {
+ return (0, IRule_1.RulePass)("pass");
+ }
+ }
+ return (0, IRule_1.RuleFail)("fail_invalid_role", [roles.length === 0 ? 'none' : roles.join(', ')]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 7601:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ *****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.element_tabbable_visible = void 0;
+var legacy_1 = __webpack_require__(8422);
+var CSSUtil_1 = __webpack_require__(1775);
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.element_tabbable_visible = {
+ id: "element_tabbable_visible",
+ context: "dom:*",
+ dependencies: [],
+ help: {
+ "en-US": {
+ "group": "element_tabbable_visible.html",
+ "pass": "element_tabbable_visible.html",
+ "potential_visible": "element_tabbable_visible.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "group": "A tabbable element should be visible on the screen when it has keyboard focus",
+ "pass": "The tabbable element is visible on the screen",
+ "potential_visible": "Confirm the element should be tabbable, and is visible on the screen when it has keyboard focus"
+ }
+ },
+ rulesets: [{
+ id: ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ num: ["2.4.7"],
+ level: IRule_2.eRulePolicy.VIOLATION,
+ toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ if (!legacy_1.RPTUtil.isTabbable(ruleContext))
+ return null;
+ var nodeName = ruleContext.nodeName.toLocaleLowerCase();
+ var bounds = context["dom"].bounds;
+ //in case the bounds not available
+ if (!bounds)
+ return null;
+ // defined styles only give the styles that changed
+ var defined_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext);
+ var onfocus_styles = (0, CSSUtil_1.getDefinedStyles)(ruleContext, ":focus");
+ if (bounds['height'] === 0 || bounds['width'] === 0
+ || (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)'
+ && !onfocus_styles['clip']))
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ if (bounds['top'] >= 0 && bounds['left'] >= 0)
+ return (0, IRule_1.RulePass)("pass");
+ var default_styles = (0, CSSUtil_1.getComputedStyle)(ruleContext);
+ var top = bounds['top'];
+ var left = bounds['left'];
+ if (Object.keys(onfocus_styles).length === 0) {
+ // no onfocus position change, but could be changed from js
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ }
+ else {
+ // with onfocus position change
+ var positions = ['absolute', 'fixed'];
+ if (typeof onfocus_styles['top'] !== 'undefined') {
+ if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) {
+ top = onfocus_styles['top'].replace(/\D/g, '');
+ }
+ else {
+ // the position is undefined and the parent's position is 'relative'
+ top = Number.MIN_VALUE;
+ }
+ }
+ if (typeof onfocus_styles['left'] !== 'undefined') {
+ if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) {
+ left = onfocus_styles['left'].replace(/\D/g, '');
+ }
+ else {
+ // the position is undefined and the parent's position is 'relative'
+ left = Number.MIN_VALUE;
+ }
+ }
+ }
+ if (top >= 0 && left >= 0)
+ return (0, IRule_1.RulePass)("pass");
+ else
+ return (0, IRule_1.RulePotential)("potential_visible", []);
+ }
+};
+
+
+/***/ }),
+
+/***/ 4497:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.embed_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.embed_alt_exists = {
+ id: "embed_alt_exists",
+ context: "dom:embed",
+ refactor: {
+ "RPT_Embed_HasAlt": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "embed_alt_exists.html",
+ "Potential_1": "embed_alt_exists.html",
+ "group": "embed_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the element has alternative content",
+ "group": "Provide alternative content for elements"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ var passed = legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "alt");
+ return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 152:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.embed_noembed_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.embed_noembed_exists = {
+ id: "embed_noembed_exists",
+ context: "dom:embed",
+ refactor: {
+ "WCAG20_Embed_HasNoEmbed": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "embed_noembed_exists.html",
+ "Potential_1": "embed_noembed_exists.html",
+ "group": "embed_noembed_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that the element is immediately followed by a non-embedded element",
+ "group": " elements should be immediately followed by a non-embedded element"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = ruleContext.getElementsByTagName("noembed").length > 0;
+ if (!passed) {
+ var walkNode = ruleContext.nextSibling;
+ while (!passed && walkNode !== null) {
+ if (walkNode.nodeName.toLowerCase() == "noembed")
+ passed = true;
+ else if (walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0)
+ break;
+ else if (walkNode.nodeType == 1)
+ break;
+ walkNode = walkNode.nextSibling;
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 935:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.emoticons_alt_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.emoticons_alt_exists = {
+ id: "emoticons_alt_exists",
+ context: "dom:*",
+ refactor: {
+ "WCAG20_Text_Emoticons": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "emoticons_alt_exists.html",
+ "Potential_1": "emoticons_alt_exists.html",
+ "group": "emoticons_alt_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that emoticons have a text alternative",
+ "group": "Emoticons must have a short text alternative that describes their purpose"
+ }
+ },
+ /**
+ * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off
+
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": eRulePolicy.VIOLATION,
+ "toolkitLevel": eToolkitLevel.LEVEL_TWO
+ }],
+ */
+ rulesets: [],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ emoticons: {
+ value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:",
+ ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[",
+ "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P",
+ ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O",
+ "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|",
+ "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(",
+ "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)",
+ "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<",
+ "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.\\m/", "\\o/", "\\o o/",
+ "o/\\o", ":&", ":u"
+ ],
+ type: "[string]"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var emoticons = validateParams.emoticons.value;
+ var passed = true;
+ var testText = "";
+ var walkNode = ruleContext.firstChild;
+ while (walkNode) {
+ // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element
+ // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be
+ // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing
+ // a node walk only on siblings so it would not get text nodes from other siblings at all.
+ // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below
+ // if.
+ if (walkNode.nodeName == "#text") {
+ testText += " " + walkNode.nodeValue;
+ }
+ walkNode = walkNode.nextSibling;
+ }
+ if (testText.trim().length > 0) {
+ for (var j = 0; passed && j < emoticons.length; ++j) {
+ var emotIdx = testText.indexOf(emoticons[j]);
+ var eLngth = emoticons[j].length;
+ while (passed && emotIdx != -1) {
+ // Passes if: the emoticon is not preceded by whitespace,
+ // or the emoticon is not followed by whitespace unless it's punctuation,
+ // or it's in a pre, code, or script
+ passed =
+ (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) ||
+ (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) &&
+ !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)));
+ // Allow usage of (: stuff :) since this is a comment in some languages
+ passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText));
+ passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText));
+ emotIdx = testText.indexOf(emoticons[j], emotIdx + 1);
+ }
+ }
+ }
+ if (!passed) {
+ // Don't trigger if we're not in the body or if we're in a script, pre, code
+ var checkAncestor = legacy_1.RPTUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]);
+ passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body";
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9719:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.error_message_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+var fragment_1 = __webpack_require__(482);
+var VisUtil_1 = __webpack_require__(8174);
+exports.error_message_exists = {
+ id: "error_message_exists",
+ context: "dom:*[aria-invalid=true]",
+ refactor: {
+ "HAAC_Aria_ErrorMessage": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "error_message_exists.html",
+ "Fail_1": "error_message_exists.html",
+ "Fail_2": "error_message_exists.html",
+ "group": "error_message_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Custom error message has invalid reference 'id' value",
+ "Fail_2": "Custom error message is not visible",
+ "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var aria_errMsgId = legacy_1.RPTUtil.getAriaAttribute(ruleContext, "aria-errormessage");
+ // If aria-errormessage is not provided, then OUT_OF_SCOPE
+ if (!aria_errMsgId) {
+ return null;
+ }
+ var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId);
+ // POF0: Invalid id reference
+ if (!msg_ele) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ // POF1: Referenced element is not visible
+ if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) {
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 5625:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.fieldset_label_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var ARIAMapper_1 = __webpack_require__(4944);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+var legacy_1 = __webpack_require__(8422);
+var VisUtil_1 = __webpack_require__(8174);
+exports.fieldset_label_valid = {
+ id: "fieldset_label_valid",
+ context: "aria:group",
+ refactor: {
+ "group_withInputs_hasName": {
+ "Pass_1": "Pass_1",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_1": "fieldset_label_valid.html",
+ "Fail_1": "fieldset_label_valid.html",
+ "Fail_2": "fieldset_label_valid.html",
+ "group": "fieldset_label_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name",
+ "Fail_1": "Group/Fieldset does not have an accessible name",
+ "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group",
+ "group": "Groups with nested inputs must have unique accessible name"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1", "3.3.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the check if the element is hidden or disabled
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || legacy_1.RPTUtil.isNodeDisabled(ruleContext))
+ return;
+ var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext);
+ var formCache = (0, CacheUtil_1.getCache)(ruleContext.ownerDocument, "landmark_group_input", null);
+ if (!formCache) {
+ formCache = {
+ groupsWithInputs: [],
+ groupsWithInputsComputedLabels: [],
+ };
+ var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]');
+ var allGroups = Array.from(allGroupsTemp);
+ var groupsWithInputs = [];
+ for (var i = 0; i < allGroups.length; i++) {
+ // Loop over all the group nodes
+ if (allGroups[i].querySelector("input")) {
+ groupsWithInputs.push(allGroups[i]);
+ }
+ }
+ var groupsWithInputsComputedLabels = [];
+ for (var i = 0; i < groupsWithInputs.length; i++) {
+ // Loop over all the landmark nodes
+ groupsWithInputsComputedLabels.push(ARIAMapper_1.ARIAMapper.computeName(groupsWithInputs[i]));
+ }
+ formCache.groupsWithInputs = groupsWithInputs;
+ formCache.groupsWithInputsComputedLabels =
+ groupsWithInputsComputedLabels;
+ (0, CacheUtil_1.setCache)(ruleContext.ownerDocument, "landmark_group_input", formCache);
+ }
+ // formCache.groupsWithInputs.forEach(element => {
+ // console.log("formCache.groupsWithInputs: " +element.id)
+ // });
+ // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels)
+ // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length)
+ var ruleContextFoundIngroupsWithInputsFlag = false;
+ var computedName = "";
+ if (!formCache.groupsWithInputs) {
+ // We do not have any groups with inputs. Therefore we should skip this rule trigger.
+ return null;
+ }
+ for (var i = 0; i < formCache.groupsWithInputs.length; i++) {
+ if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) {
+ // We have found our ruleContext in the cache
+ ruleContextFoundIngroupsWithInputsFlag = true;
+ if (formCache.groupsWithInputsComputedLabels[i] === "" ||
+ formCache.groupsWithInputsComputedLabels[i] === null) {
+ // console.log("Fail_1")
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ var foundSameNameFlag = false;
+ for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) {
+ if (i == j) {
+ continue;
+ } // We do not want to compare against ourselfs
+ if (formCache.groupsWithInputsComputedLabels[i] ===
+ formCache.groupsWithInputsComputedLabels[j]) {
+ foundSameNameFlag = true;
+ }
+ }
+ if (foundSameNameFlag) {
+ // console.log("Fail_2")
+ return (0, IRule_1.RuleFail)("Fail_2", [
+ formCache.groupsWithInputsComputedLabels[i],
+ ]);
+ }
+ computedName = formCache.groupsWithInputsComputedLabels[i];
+ }
+ }
+ if (!ruleContextFoundIngroupsWithInputsFlag) {
+ // console.log("null return")
+ return null;
+ }
+ // console.log("Pass_1")
+ return (0, IRule_1.RulePass)("Pass_1", [computedName]);
+ }
+};
+
+
+/***/ }),
+
+/***/ 9115:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.fieldset_legend_valid = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.fieldset_legend_valid = {
+ id: "fieldset_legend_valid",
+ context: "dom:fieldset",
+ refactor: {
+ "WCAG20_Fieldset_HasLegend": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1",
+ "Fail_2": "Fail_2",
+ "Fail_3": "Fail_3"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "fieldset_legend_valid.html",
+ "Fail_1": "fieldset_legend_valid.html",
+ "Fail_2": "fieldset_legend_valid.html",
+ "Fail_3": "fieldset_legend_valid.html",
+ "group": "fieldset_legend_valid.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": " element does not have a ",
+ "Fail_2": " element has more than one ",
+ "Fail_3": " element is empty",
+ "group": " elements should have a single, non-empty as a label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // In the case a legend is hidden, we should still trigger a violations for this
+ var legends = legacy_1.RPTUtil.getChildByTagHidden(ruleContext, "legend", true, false);
+ if (legends.length === 0) {
+ // Fieldset has NO Legend
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else if (legends.length > 1) {
+ // Fieldset has more than one legend
+ return (0, IRule_1.RuleFail)("Fail_2");
+ }
+ else if (legacy_1.RPTUtil.getInnerText(legends[0]).trim().length === 0) {
+ // Fieldset has legend but legend is empty
+ return (0, IRule_1.RuleFail)("Fail_3");
+ }
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+};
+
+
+/***/ }),
+
+/***/ 6072:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.figure_label_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var VisUtil_1 = __webpack_require__(8174);
+var legacy_1 = __webpack_require__(8422);
+exports.figure_label_exists = {
+ id: "figure_label_exists",
+ context: "dom:figure",
+ refactor: {
+ "HAAC_Figure_label": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "figure_label_exists.html",
+ "Fail_1": "figure_label_exists.html",
+ "group": "figure_label_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "The element does not have an associated label",
+ "group": "A element must have an associated label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ //skip the rule
+ if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext))
+ return null;
+ // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules
+ var role = ruleContext.getAttribute("role");
+ if (role) {
+ return null;
+ }
+ var passed = legacy_1.RPTUtil.hasAriaLabel(ruleContext) || legacy_1.RPTUtil.attributeNonEmpty(ruleContext, "title");
+ //return new ValidationResult(passed, [ruleContext], '', '', []);
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1", []);
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 6923:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_font_color = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+exports.form_font_color = {
+ id: "form_font_color",
+ context: "dom:form",
+ refactor: {
+ "RPT_Font_ColorInForm": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_font_color.html",
+ "Potential_1": "form_font_color.html",
+ "group": "form_font_color.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Check color is not used as the only visual means to convey which fields are required",
+ "group": "Combine color and descriptive markup to indicate required form fields"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.4.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ var passed = true;
+ var fonts = ruleContext.getElementsByTagName("font");
+ if (fonts != null) {
+ for (var i = 0; i < fonts.length; ++i) {
+ passed = !fonts[i].hasAttribute("color");
+ }
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 9015:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_interaction_review = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.form_interaction_review = {
+ id: "form_interaction_review",
+ context: "dom:form[target]",
+ refactor: {
+ "WCAG20_Form_TargetAndText": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_interaction_review.html",
+ "Potential_1": "form_interaction_review.html",
+ "group": "form_interaction_review.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user",
+ "group": "User should be informed in advance when interacting with content causes a change of context"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["3.2.2"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var validateParams = {
+ paramWinText: {
+ value: ["new window"],
+ type: "array"
+ }
+ };
+ var ruleContext = context["dom"].node;
+ var tStr = ruleContext.getAttribute("target");
+ var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || legacy_1.RPTUtil.getFrameByName(ruleContext, tStr) != null;
+ if (!passed) {
+ // Name is not part of this frameset – must have potential to create new window?
+ // See if a new window is mentioned
+ var textStr = legacy_1.RPTUtil.getInnerText(ruleContext);
+ if (ruleContext.hasAttribute("title"))
+ textStr += " " + ruleContext.getAttribute("title");
+ for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i)
+ if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1)
+ passed = true;
+ }
+ if (passed)
+ return (0, IRule_1.RulePass)("Pass_0");
+ if (!passed)
+ return (0, IRule_1.RulePotential)("Potential_1");
+ }
+};
+
+
+/***/ }),
+
+/***/ 3611:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_label_unique = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var fragment_1 = __webpack_require__(482);
+var CacheUtil_1 = __webpack_require__(7788);
+exports.form_label_unique = {
+ id: "form_label_unique",
+ context: "dom:label[for]",
+ refactor: {
+ "RPT_Label_UniqueFor": {
+ "Pass_0": "Pass_0",
+ "Fail_1": "Fail_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_label_unique.html",
+ "Fail_1": "form_label_unique.html",
+ "group": "form_label_unique.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Fail_1": "Form control has more than one label",
+ "group": "Form controls should have exactly one label"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.3.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ act: [],
+ run: function (context, options, contextHierarchies) {
+ var ruleContext = context["dom"].node;
+ // JCH - NO OUT OF SCOPE hidden in context
+ var labelIds = (0, CacheUtil_1.getCache)(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {});
+ var id = ruleContext.getAttribute("for");
+ var passed = !(id in labelIds);
+ labelIds[id] = true;
+ if (!passed) {
+ return (0, IRule_1.RuleFail)("Fail_1");
+ }
+ else {
+ return (0, IRule_1.RulePass)("Pass_0");
+ }
+ }
+};
+
+
+/***/ }),
+
+/***/ 4846:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+/******************************************************************************
+ Copyright:: 2022- IBM, Inc
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*****************************************************************************/
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.form_submit_button_exists = void 0;
+var IRule_1 = __webpack_require__(4377);
+var IRule_2 = __webpack_require__(4377);
+var legacy_1 = __webpack_require__(8422);
+exports.form_submit_button_exists = {
+ id: "form_submit_button_exists",
+ context: "dom:form",
+ refactor: {
+ "WCAG20_Form_HasSubmit": {
+ "Pass_0": "Pass_0",
+ "Potential_1": "Potential_1"
+ }
+ },
+ help: {
+ "en-US": {
+ "Pass_0": "form_submit_button_exists.html",
+ "Potential_1": "form_submit_button_exists.html",
+ "group": "form_submit_button_exists.html"
+ }
+ },
+ messages: {
+ "en-US": {
+ "Pass_0": "Rule Passed",
+ "Potential_1": "Verify the